From 9287e6c36af0cbce951030e376ca9e80026ed802 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Prante?= Date: Mon, 7 Aug 2023 18:08:25 +0200 Subject: [PATCH] remove write(String) from HttpResponseBuilder, we don't like sloppyness, try enforcing charset use --- gradle.properties | 2 +- .../server/netty/HttpResponseBuilder.java | 9 +++--- .../http/server/nio/HttpResponseBuilder.java | 28 +++++++++--------- .../server/simple/HttpResponseBuilder.java | 29 +++++++++---------- .../http/server/BaseHttpResponseBuilder.java | 10 +++---- .../net/http/server/HttpResponseBuilder.java | 6 ++-- .../http/server/application/Application.java | 5 ++++ .../server/application/BaseApplication.java | 14 +++++++++ .../server/route/BaseHttpRouterContext.java | 23 ++++++++++----- .../http/server/route/HttpRouterContext.java | 6 ++-- .../groovy/DefaultMarkupTemplate.java | 8 +---- 11 files changed, 79 insertions(+), 61 deletions(-) diff --git a/gradle.properties b/gradle.properties index 2db6b49..5e4a4d9 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,5 @@ group = org.xbib name = net-http -version = 3.5.0 +version = 3.6.0 org.gradle.warning.mode = ALL diff --git a/net-http-server-netty/src/main/java/org/xbib/net/http/server/netty/HttpResponseBuilder.java b/net-http-server-netty/src/main/java/org/xbib/net/http/server/netty/HttpResponseBuilder.java index 6e68383..03025dc 100644 --- a/net-http-server-netty/src/main/java/org/xbib/net/http/server/netty/HttpResponseBuilder.java +++ b/net-http-server-netty/src/main/java/org/xbib/net/http/server/netty/HttpResponseBuilder.java @@ -30,7 +30,6 @@ import java.io.UncheckedIOException; import java.nio.CharBuffer; import java.nio.channels.FileChannel; import java.nio.charset.Charset; -import java.nio.charset.StandardCharsets; import java.util.Objects; import java.util.logging.Level; import java.util.logging.Logger; @@ -127,8 +126,8 @@ public class HttpResponseBuilder extends BaseHttpResponseBuilder { @Override public HttpResponse build() { Objects.requireNonNull(ctx); - if (body != null) { - internalStringWrite(body); + if (bytes != null) { + internalByteWrite(bytes); } else if (charBuffer != null && charset != null) { internalBufferWrite(charBuffer, charset); } else if (dataBuffer != null) { @@ -155,8 +154,8 @@ public class HttpResponseBuilder extends BaseHttpResponseBuilder { super.release(); } - private void internalStringWrite(String body) { - internalBufferWrite(dataBufferFactory.wrap(StandardCharsets.UTF_8.encode(body))); + private void internalByteWrite(byte[] bytes) { + internalBufferWrite(dataBufferFactory.wrap(bytes)); } private void internalBufferWrite(DataBuffer dataBuffer) { diff --git a/net-http-server-nio/src/main/java/org/xbib/net/http/server/nio/HttpResponseBuilder.java b/net-http-server-nio/src/main/java/org/xbib/net/http/server/nio/HttpResponseBuilder.java index f944ebf..e0c7313 100644 --- a/net-http-server-nio/src/main/java/org/xbib/net/http/server/nio/HttpResponseBuilder.java +++ b/net-http-server-nio/src/main/java/org/xbib/net/http/server/nio/HttpResponseBuilder.java @@ -38,8 +38,8 @@ public class HttpResponseBuilder extends BaseHttpResponseBuilder { public HttpResponse build() { Objects.requireNonNull(outputStream); try { - if (body != null) { - internalWrite(body); + if (bytes != null) { + internalWrite(bytes); } else if (charBuffer != null && charset != null) { internalWrite(charBuffer, charset); } else if (dataBuffer != null) { @@ -73,20 +73,11 @@ public class HttpResponseBuilder extends BaseHttpResponseBuilder { outputStream.close(); } - void internalWrite(String string) throws IOException { - if (string == null) { + void internalWrite(byte[] bytes) throws IOException { + if (bytes == null) { internalFlush(); } else { - write(dataBufferFactory.wrap(StandardCharsets.UTF_8.encode(string))); - } - } - - void internalWrite(CharBuffer charBuffer, Charset charset) throws IOException { - if (charBuffer == null) { - internalFlush(); - } else { - Objects.requireNonNull(charset); - write(dataBufferFactory.wrap(charset.encode(charBuffer))); + write(dataBufferFactory.wrap(bytes)); } } @@ -103,6 +94,15 @@ public class HttpResponseBuilder extends BaseHttpResponseBuilder { } } + void internalWrite(CharBuffer charBuffer, Charset charset) throws IOException { + if (charBuffer == null) { + internalFlush(); + } else { + Objects.requireNonNull(charset); + write(dataBufferFactory.wrap(charset.encode(charBuffer))); + } + } + void internalWrite(InputStream inputStream, int bufferSize) throws IOException { byte[] b = new byte[bufferSize]; while (inputStream.available() > 0) { diff --git a/net-http-server-simple/src/main/java/org/xbib/net/http/server/simple/HttpResponseBuilder.java b/net-http-server-simple/src/main/java/org/xbib/net/http/server/simple/HttpResponseBuilder.java index dda2cee..b0e6083 100644 --- a/net-http-server-simple/src/main/java/org/xbib/net/http/server/simple/HttpResponseBuilder.java +++ b/net-http-server-simple/src/main/java/org/xbib/net/http/server/simple/HttpResponseBuilder.java @@ -38,8 +38,8 @@ public class HttpResponseBuilder extends BaseHttpResponseBuilder { public HttpResponse build() { Objects.requireNonNull(outputStream); try { - if (body != null) { - internalWrite(body); + if (bytes != null) { + internalWrite(bytes); } else if (charBuffer != null && charset != null) { internalWrite(charBuffer, charset); } else if (dataBuffer != null) { @@ -72,21 +72,11 @@ public class HttpResponseBuilder extends BaseHttpResponseBuilder { outputStream.close(); } - void internalWrite(String string) throws IOException { - if (string == null) { + void internalWrite(byte[] bytes) throws IOException { + if (bytes == null) { internalFlush(); } else { - logger.log(Level.INFO, "internal write: " + string); - internalWrite(dataBufferFactory.wrap(StandardCharsets.UTF_8.encode(string))); - } - } - - void internalWrite(CharBuffer charBuffer, Charset charset) throws IOException { - if (charBuffer == null) { - internalFlush(); - } else { - Objects.requireNonNull(charset); - internalWrite(dataBufferFactory.wrap(charset.encode(charBuffer))); + internalWrite(dataBufferFactory.wrap(bytes)); } } @@ -105,6 +95,15 @@ public class HttpResponseBuilder extends BaseHttpResponseBuilder { } } + void internalWrite(CharBuffer charBuffer, Charset charset) throws IOException { + if (charBuffer == null) { + internalFlush(); + } else { + Objects.requireNonNull(charset); + internalWrite(dataBufferFactory.wrap(charset.encode(charBuffer))); + } + } + void internalWrite(InputStream inputStream, int bufferSize) throws IOException { byte[] b = new byte[bufferSize]; while (inputStream.available() > 0) { diff --git a/net-http-server/src/main/java/org/xbib/net/http/server/BaseHttpResponseBuilder.java b/net-http-server/src/main/java/org/xbib/net/http/server/BaseHttpResponseBuilder.java index 59eb82c..486a2b6 100644 --- a/net-http-server/src/main/java/org/xbib/net/http/server/BaseHttpResponseBuilder.java +++ b/net-http-server/src/main/java/org/xbib/net/http/server/BaseHttpResponseBuilder.java @@ -71,7 +71,7 @@ public abstract class BaseHttpResponseBuilder implements HttpResponseBuilder { protected Charset charset; - protected String body; + protected byte[] bytes; protected CharBuffer charBuffer; @@ -260,11 +260,9 @@ public abstract class BaseHttpResponseBuilder implements HttpResponseBuilder { } @Override - public BaseHttpResponseBuilder write(String body) { - if (body != null && this.body == null) { - this.body = body; - } else { - logger.log(Level.WARNING, "cannot write more than one body"); + public BaseHttpResponseBuilder write(byte[] bytes) { + if (bytes != null) { + this.bytes = bytes; } return this; } diff --git a/net-http-server/src/main/java/org/xbib/net/http/server/HttpResponseBuilder.java b/net-http-server/src/main/java/org/xbib/net/http/server/HttpResponseBuilder.java index 8806deb..07f3f91 100644 --- a/net-http-server/src/main/java/org/xbib/net/http/server/HttpResponseBuilder.java +++ b/net-http-server/src/main/java/org/xbib/net/http/server/HttpResponseBuilder.java @@ -52,12 +52,12 @@ public interface HttpResponseBuilder { HttpResponseBuilder setResponseId(Long responseId); - HttpResponseBuilder write(String body); - - HttpResponseBuilder write(CharBuffer charBuffer, Charset charset); + HttpResponseBuilder write(byte[] bytes); HttpResponseBuilder write(DataBuffer dataBuffer); + HttpResponseBuilder write(CharBuffer charBuffer, Charset charset); + HttpResponseBuilder write(InputStream inputStream, int bufferSize); HttpResponseBuilder write(FileChannel fileChannel, int bufferSize); diff --git a/net-http-server/src/main/java/org/xbib/net/http/server/application/Application.java b/net-http-server/src/main/java/org/xbib/net/http/server/application/Application.java index d1bf0dd..0e526f9 100644 --- a/net-http-server/src/main/java/org/xbib/net/http/server/application/Application.java +++ b/net-http-server/src/main/java/org/xbib/net/http/server/application/Application.java @@ -7,6 +7,8 @@ import java.time.ZoneId; import java.util.Collection; import java.util.Locale; import java.util.Set; + +import org.xbib.net.Attributes; import org.xbib.net.http.HttpAddress; import org.xbib.net.http.server.HttpRequestBuilder; import org.xbib.net.http.server.HttpResponseBuilder; @@ -40,6 +42,8 @@ public interface Application extends SessionListener, Resolver, Closeable Collection getModules(); + Attributes getAttributes(); + HttpRouterContext createContext(HttpDomain domain, HttpRequestBuilder httpRequestBuilder, HttpResponseBuilder httpResponseBuilder); @@ -54,5 +58,6 @@ public interface Application extends SessionListener, Resolver, Closeable HttpRouter getRouter(); + @Override void close() throws IOException; } diff --git a/net-http-server/src/main/java/org/xbib/net/http/server/application/BaseApplication.java b/net-http-server/src/main/java/org/xbib/net/http/server/application/BaseApplication.java index 041c9b6..0c8b505 100644 --- a/net-http-server/src/main/java/org/xbib/net/http/server/application/BaseApplication.java +++ b/net-http-server/src/main/java/org/xbib/net/http/server/application/BaseApplication.java @@ -14,8 +14,10 @@ import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; +import org.xbib.net.Attributes; import org.xbib.net.http.HttpAddress; import org.xbib.net.http.cookie.SameSite; +import org.xbib.net.http.server.auth.BaseAttributes; import org.xbib.net.http.server.route.BaseHttpRouterContext; import org.xbib.net.http.server.HttpHandler; import org.xbib.net.http.server.HttpRequestBuilder; @@ -48,12 +50,15 @@ public class BaseApplication implements Application { private final HttpResponseRenderer httpResponseRenderer; + private final Attributes attributes; + protected List applicationModuleList; protected BaseApplication(BaseApplicationBuilder builder) { this.builder = builder; this.sessionName = builder.settings.get("session.name", "SESS"); this.httpResponseRenderer = newResponseRenderer(); + this.attributes = newAttributes(); this.applicationModuleList = new ArrayList<>(); for (Map.Entry entry : builder.settings.getGroups("module").entrySet()) { String moduleName = entry.getKey(); @@ -129,6 +134,11 @@ public class BaseApplication implements Application { return applicationModuleList; } + @Override + public Attributes getAttributes() { + return attributes; + } + @Override public Collection getDomains() { return builder.httpRouter.getDomains(); @@ -182,6 +192,10 @@ public class BaseApplication implements Application { return new HttpResponseRenderer(); } + protected Attributes newAttributes() { + return new BaseAttributes(); + } + protected Codec newSessionCodec(HttpRouterContext httpRouterContext) { return new MemoryPropertiesSessionCodec(sessionName,this, 1024, Duration.ofDays(1)); } diff --git a/net-http-server/src/main/java/org/xbib/net/http/server/route/BaseHttpRouterContext.java b/net-http-server/src/main/java/org/xbib/net/http/server/route/BaseHttpRouterContext.java index f06ae73..3642a5e 100644 --- a/net-http-server/src/main/java/org/xbib/net/http/server/route/BaseHttpRouterContext.java +++ b/net-http-server/src/main/java/org/xbib/net/http/server/route/BaseHttpRouterContext.java @@ -6,6 +6,7 @@ import java.io.InputStream; import java.nio.CharBuffer; import java.nio.channels.FileChannel; import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; import java.nio.file.Path; import java.util.LinkedList; import java.util.List; @@ -234,14 +235,8 @@ public class BaseHttpRouterContext implements HttpRouterContext { } @Override - public BaseHttpRouterContext body(String string) throws IOException { - httpResponseBuilder.write(string); - return this; - } - - @Override - public BaseHttpRouterContext body(CharBuffer charBuffer, Charset charset) throws IOException { - httpResponseBuilder.write(charBuffer, charset); + public BaseHttpRouterContext body(byte[] bytes) throws IOException { + httpResponseBuilder.write(bytes); return this; } @@ -251,6 +246,18 @@ public class BaseHttpRouterContext implements HttpRouterContext { return this; } + @Override + public BaseHttpRouterContext body(String string) throws IOException { + httpResponseBuilder.write(CharBuffer.wrap(string), StandardCharsets.UTF_8); + return this; + } + + @Override + public BaseHttpRouterContext body(CharBuffer charBuffer, Charset charset) throws IOException { + httpResponseBuilder.write(charBuffer, charset); + return this; + } + @Override public BaseHttpRouterContext body(InputStream inputStream, int bufferSize) throws IOException { httpResponseBuilder.write(inputStream, bufferSize); diff --git a/net-http-server/src/main/java/org/xbib/net/http/server/route/HttpRouterContext.java b/net-http-server/src/main/java/org/xbib/net/http/server/route/HttpRouterContext.java index 6548cb0..bb8ccad 100644 --- a/net-http-server/src/main/java/org/xbib/net/http/server/route/HttpRouterContext.java +++ b/net-http-server/src/main/java/org/xbib/net/http/server/route/HttpRouterContext.java @@ -81,12 +81,14 @@ public interface HttpRouterContext { HttpRouterContext cookie(Cookie cookie); + HttpRouterContext body(byte[] bytes) throws IOException; + + HttpRouterContext body(DataBuffer dataBuffer) throws IOException; + HttpRouterContext body(String string) throws IOException; HttpRouterContext body(CharBuffer charBuffer, Charset charset) throws IOException; - HttpRouterContext body(DataBuffer dataBuffer) throws IOException; - HttpRouterContext body(InputStream inputStream, int bufferSize) throws IOException; HttpRouterContext body(FileChannel fileChannel, int bufferSize) throws IOException; diff --git a/net-http-template-groovy/src/main/java/org/xbib/net/http/template/groovy/DefaultMarkupTemplate.java b/net-http-template-groovy/src/main/java/org/xbib/net/http/template/groovy/DefaultMarkupTemplate.java index 356c80b..97c67cb 100644 --- a/net-http-template-groovy/src/main/java/org/xbib/net/http/template/groovy/DefaultMarkupTemplate.java +++ b/net-http-template-groovy/src/main/java/org/xbib/net/http/template/groovy/DefaultMarkupTemplate.java @@ -157,7 +157,7 @@ public abstract class DefaultMarkupTemplate extends BaseTemplate { if (url.getFragment() != null) { sb.append('#').append(url.getFragment()); } - if (sb.length() == 0) { + if (sb.isEmpty()) { sb.append('/'); } return sb.toString(); @@ -172,12 +172,6 @@ public abstract class DefaultMarkupTemplate extends BaseTemplate { return uriTemplate.toURL(builder.build()).toString(); } - public void write(String string) { - if (string != null) { - responseBuilder.write(string); - } - } - public void writeBytes(byte[] bytes) { responseBuilder.write(DefaultDataBufferFactory.getInstance().wrap(bytes)); }