Skip to content

Commit

Permalink
minor fixes
Browse files Browse the repository at this point in the history
  • Loading branch information
wizzardo committed Nov 14, 2018
1 parent 0b0316d commit b637fa4
Show file tree
Hide file tree
Showing 2 changed files with 72 additions and 7 deletions.
57 changes: 50 additions & 7 deletions src/main/java/com/wizzardo/http/RestHandler.java
Expand Up @@ -4,9 +4,11 @@
import com.wizzardo.http.request.Request;
import com.wizzardo.http.response.Response;
import com.wizzardo.http.response.Status;
import com.wizzardo.tools.collections.CollectionTools;

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;

import static com.wizzardo.http.request.Request.Method.*;

Expand All @@ -20,9 +22,13 @@ public class RestHandler implements Handler {
protected Handler post;
protected Handler put;
protected Handler delete;
protected final Handler options = this::provideAllowHeader;
protected final Handler options = (request, response) -> response.appendHeader(Header.KEY_CONTENT_LENGTH, String.valueOf(0));

private byte[] allow;
private byte[] accessControlAllowMethods;
private byte[] allowHeaders = "Access-Control-Allow-Headers: *\r\n".getBytes();
private byte[] allowCredentials = "Access-Control-Allow-Credentials: true\r\n".getBytes();
private byte[] maxAge = "Access-Control-Max-Age: 1800\r\n".getBytes();

public RestHandler() {
this(null);
Expand All @@ -31,6 +37,22 @@ public RestHandler() {
public RestHandler(String name) {
this.name = name;
generateAllowHeader();
generateAccessControlAllowMethodsHeader();
}

public RestHandler allowHeaders(String... headers) {
allowHeaders = ("Access-Control-Allow-Headers: " + CollectionTools.join(Arrays.asList(headers), ",") + "\r\n").getBytes();
return this;
}

public RestHandler allowCredentials(boolean allow) {
allowCredentials = ("Access-Control-Allow-Credentials: " + allow + "\r\n").getBytes();
return this;
}

public RestHandler setMaxAge(int maxAge) {
this.maxAge = ("Access-Control-Max-Age: " + maxAge + "\r\n").getBytes();
return this;
}

@Override
Expand Down Expand Up @@ -58,41 +80,48 @@ public Response handle(Request request, Response response) throws IOException {
}

protected Response handle(Request request, Response response, Handler handler) throws IOException {
provideAllowHeader(request, response);
if (handler == null)
return provideAllowHeader(request, response).setStatus(Status._405);
return response.setStatus(Status._405).appendHeader(Header.KEY_CONTENT_LENGTH, String.valueOf(0));
else
return handler.handle(request, response);
}

protected Response provideAllowHeader(Request request, Response response) {
response.appendHeader("Access-Control-Allow-Credentials", "true");
response.appendHeader("Access-Control-Allow-Headers", "*");
response.appendHeader("Access-Control-Allow-Origin", request.header(Header.KEY_ORIGIN, "*"));
response.appendHeader("Access-Control-Max-Age", "1800");
return response.appendHeader(allow);
return response
.appendHeader(allowCredentials)
.appendHeader(allowHeaders)
.appendHeader("Access-Control-Allow-Origin", request.header(Header.KEY_ORIGIN, "*"))
.appendHeader(maxAge)
.appendHeader(accessControlAllowMethods)
.appendHeader(allow);
}

public RestHandler setGetHandler(Handler get) {
this.get = get;
generateAllowHeader();
generateAccessControlAllowMethodsHeader();
return this;
}

public RestHandler setPostHandler(Handler post) {
this.post = post;
generateAllowHeader();
generateAccessControlAllowMethodsHeader();
return this;
}

public RestHandler setPutHandler(Handler put) {
this.put = put;
generateAllowHeader();
generateAccessControlAllowMethodsHeader();
return this;
}

public RestHandler setDeleteHandler(Handler delete) {
this.delete = delete;
generateAllowHeader();
generateAccessControlAllowMethodsHeader();
return this;
}

Expand Down Expand Up @@ -141,6 +170,20 @@ private void generateAllowHeader() {
allow = sb.append("\r\n").toString().getBytes(StandardCharsets.UTF_8);
}

private void generateAccessControlAllowMethodsHeader() {
StringBuilder sb = new StringBuilder("Access-Control-Allow-Methods: ");
boolean comma;

comma = buildAllowHeaderString(sb, get, "GET", false);
comma = buildAllowHeaderString(sb, get, "HEAD", comma);
comma = buildAllowHeaderString(sb, post, "POST", comma);
comma = buildAllowHeaderString(sb, put, "PUT", comma);
comma = buildAllowHeaderString(sb, delete, "DELETE", comma);
comma = buildAllowHeaderString(sb, options, "OPTIONS", comma);

accessControlAllowMethods = sb.append("\r\n").toString().getBytes(StandardCharsets.UTF_8);
}

private boolean buildAllowHeaderString(StringBuilder sb, Handler handler, String name, boolean comma) {
if (handler != null) {
if (comma)
Expand Down
22 changes: 22 additions & 0 deletions src/main/java/com/wizzardo/http/response/Response.java
Expand Up @@ -351,6 +351,24 @@ static class ReadableBuilderProxy extends ReadableBuilder {
ReadableBuilderProxy() {
}

@Override
public int read(ByteBuffer byteBuffer) {
if (position >= partsCount)
return 0;

ReadableData[] parts = this.parts;
ReadableData data = parts[position];
int r = data.read(byteBuffer);
while (position < partsCount - 1 && data.isComplete()) {
data = parts[++position];
if (!byteBuffer.hasRemaining())
break;
r += data.read(byteBuffer);
}

return r;
}

@Override
public ReadableBuilder append(byte[] bytes, int offset, int length) {
if (bb.buffer().remaining() > length) {
Expand Down Expand Up @@ -543,6 +561,10 @@ public String toString() {
.append("\r\n");
}

if (body != null) {
sb.append(new String(body()));
}

return sb.toString();
}
}

0 comments on commit b637fa4

Please sign in to comment.