Skip to content
Snippets Groups Projects
Commit 80cba2cd authored by vkovtun's avatar vkovtun
Browse files

SSDM-13579: Made the server accept pre-flight requests (OPTIONS), which is...

SSDM-13579: Made the server accept pre-flight requests (OPTIONS), which is required for a DELETE request.
parent 2f708b68
No related branches found
No related tags found
1 merge request!40SSDM-13578 : 2PT : Database and V3 Implementation - include the new AFS "free"...
...@@ -20,6 +20,8 @@ import ch.ethz.sis.afsserver.http.HttpServerHandler; ...@@ -20,6 +20,8 @@ import ch.ethz.sis.afsserver.http.HttpServerHandler;
import ch.ethz.sis.shared.log.LogManager; import ch.ethz.sis.shared.log.LogManager;
import ch.ethz.sis.shared.log.Logger; import ch.ethz.sis.shared.log.Logger;
import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBuf;
import io.netty.buffer.ByteBufAllocator;
import io.netty.buffer.EmptyByteBuf;
import io.netty.buffer.Unpooled; import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelFutureListener; import io.netty.channel.ChannelFutureListener;
import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelHandlerContext;
...@@ -40,7 +42,7 @@ public class NettyHttpHandler extends ChannelInboundHandlerAdapter ...@@ -40,7 +42,7 @@ public class NettyHttpHandler extends ChannelInboundHandlerAdapter
private static final ByteBuf NOT_FOUND_BUFFER = Unpooled.wrappedBuffer(NOT_FOUND); private static final ByteBuf NOT_FOUND_BUFFER = Unpooled.wrappedBuffer(NOT_FOUND);
private static final Set<HttpMethod> allowedMethods = Set.of(GET, POST, PUT, DELETE); private static final Set<HttpMethod> allowedMethods = Set.of(GET, POST, PUT, DELETE, OPTIONS);
private final String uri; private final String uri;
...@@ -63,40 +65,53 @@ public class NettyHttpHandler extends ChannelInboundHandlerAdapter ...@@ -63,40 +65,53 @@ public class NettyHttpHandler extends ChannelInboundHandlerAdapter
if (queryStringDecoderForPath.path().equals(uri) && if (queryStringDecoderForPath.path().equals(uri) &&
allowedMethods.contains(request.method())) allowedMethods.contains(request.method()))
{ {
FullHttpResponse response = null; if (OPTIONS.equals(request.method()))
ByteBuf content = request.content();
try
{ {
QueryStringDecoder queryStringDecoderForParameters = null; final FullHttpResponse response = getHttpResponse(
byte[] array = new byte[content.readableBytes()]; HttpResponseStatus.OK,
content.readBytes(array); HttpResponse.CONTENT_TYPE_TEXT,
new EmptyByteBuf(ByteBufAllocator.DEFAULT),
if (GET.equals(request.method())) { 0);
queryStringDecoderForParameters = queryStringDecoderForPath;
} else {
queryStringDecoderForParameters = new QueryStringDecoder(new String(array, StandardCharsets.UTF_8), StandardCharsets.UTF_8, false);
}
HttpResponse apiResponse = httpServerHandler.process(request.method(),
queryStringDecoderForParameters.parameters(), null);
HttpResponseStatus status = (!apiResponse.isError()) ?
HttpResponseStatus.OK :
HttpResponseStatus.BAD_REQUEST;
response = getHttpResponse(
status,
apiResponse.getContentType(),
Unpooled.wrappedBuffer(apiResponse.getBody()),
apiResponse.getBody().length);
ctx.writeAndFlush(response).addListener(ChannelFutureListener.CLOSE); ctx.writeAndFlush(response).addListener(ChannelFutureListener.CLOSE);
} finally } else
{ {
content.release(); ByteBuf content = request.content();
try
{
QueryStringDecoder queryStringDecoderForParameters;
byte[] array = new byte[content.readableBytes()];
content.readBytes(array);
if (GET.equals(request.method()))
{
queryStringDecoderForParameters = queryStringDecoderForPath;
} else
{
queryStringDecoderForParameters =
new QueryStringDecoder(new String(array, StandardCharsets.UTF_8), StandardCharsets.UTF_8, false);
}
HttpResponse apiResponse = httpServerHandler.process(request.method(),
queryStringDecoderForParameters.parameters(), null);
HttpResponseStatus status = (!apiResponse.isError()) ?
HttpResponseStatus.OK :
HttpResponseStatus.BAD_REQUEST;
final FullHttpResponse response = getHttpResponse(
status,
apiResponse.getContentType(),
Unpooled.wrappedBuffer(apiResponse.getBody()),
apiResponse.getBody().length);
ctx.writeAndFlush(response).addListener(ChannelFutureListener.CLOSE);
} finally
{
content.release();
}
} }
} else } else
{ {
FullHttpResponse response = getHttpResponse( FullHttpResponse response = getHttpResponse(
HttpResponseStatus.NOT_FOUND, HttpResponseStatus.NOT_FOUND,
"text/plain", HttpResponse.CONTENT_TYPE_TEXT,
NOT_FOUND_BUFFER, NOT_FOUND_BUFFER,
NOT_FOUND.length); NOT_FOUND.length);
ctx.writeAndFlush(response).addListener(ChannelFutureListener.CLOSE); ctx.writeAndFlush(response).addListener(ChannelFutureListener.CLOSE);
...@@ -140,6 +155,9 @@ public class NettyHttpHandler extends ChannelInboundHandlerAdapter ...@@ -140,6 +155,9 @@ public class NettyHttpHandler extends ChannelInboundHandlerAdapter
); );
response.headers().set(HttpHeaderNames.CONTENT_LENGTH, contentLength); response.headers().set(HttpHeaderNames.CONTENT_LENGTH, contentLength);
response.headers().set(HttpHeaderNames.ACCESS_CONTROL_ALLOW_ORIGIN, "*"); response.headers().set(HttpHeaderNames.ACCESS_CONTROL_ALLOW_ORIGIN, "*");
response.headers().set(HttpHeaderNames.ACCESS_CONTROL_ALLOW_METHODS,
String.join(", ", allowedMethods.stream().map(HttpMethod::name).toList()));
response.headers().set(HttpHeaderNames.ACCESS_CONTROL_ALLOW_HEADERS, "*");
response.headers().set(HttpHeaderNames.CONTENT_TYPE, contentType); response.headers().set(HttpHeaderNames.CONTENT_TYPE, contentType);
response.headers().set(HttpHeaderNames.CONNECTION, "close"); response.headers().set(HttpHeaderNames.CONNECTION, "close");
return response; return response;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment