@Override public void channelRead0( ChannelHandlerContext channelHandlerContext, FullHttpRequest fullHttpRequest) throws Exception { DecoderResult decoderResult = fullHttpRequest.decoderResult(); if (!decoderResult.isSuccess()) { _sendError(channelHandlerContext, BAD_REQUEST); return; } if (fullHttpRequest.method() == GET) { processGetRequest(channelHandlerContext, fullHttpRequest); } else if (fullHttpRequest.method() == HEAD) { processHeadRequest(channelHandlerContext, fullHttpRequest); } else { _sendError(channelHandlerContext, BAD_REQUEST); } }
private ChannelFuture handleHttpRequest(ChannelHandlerContext ctx, FullHttpRequest request) { if (request.method() == HttpMethod.OPTIONS) { return HttpHelpers.sendPreflightApproval(ctx); } HttpRequestInfo CurrRequest = new HttpRequestInfo(); try { CurrRequest.init(Info, request, SVID.makeSVID()); } catch (URISyntaxException e1) { return HttpHelpers.sendError(CurrRequest, ApiErrors.HTTP_DECODE_ERROR); } URI uri = CurrRequest.RequestURI; l.debug(new SVLog("Agent HTTP request", CurrRequest)); if (!request.decoderResult().isSuccess()) { return HttpHelpers.sendError(CurrRequest, ApiErrors.HTTP_DECODE_ERROR); } if (!authenticate(request, (InetSocketAddress) ctx.channel().remoteAddress())) { return HttpHelpers.sendError(CurrRequest, ApiErrors.BAD_AUTH); } String uriPath = uri.getPath(); if (uriPath.equals(WEBSOCKET_PATH)) { String websockUrl = request.headers().get(HttpHeaderNames.HOST) + WEBSOCKET_PATH; WebSocketServerHandshakerFactory wsFactory = new WebSocketServerHandshakerFactory(websockUrl, null, false); Handshaker = wsFactory.newHandshaker(request); if (Handshaker == null) { return WebSocketServerHandshakerFactory.sendUnsupportedVersionResponse(ctx.channel()); } else { WebsocketConnected = true; return Handshaker.handshake(ctx.channel(), request); } } if (uriPath.startsWith("/api/")) { // Invoking an API directly over HTTP String messageType = uriPath.substring(5); String messageBody = null; if (request.method() == HttpMethod.POST && request.content() != null) { messageBody = request.content().toString(StandardCharsets.UTF_8); } ByteBuf reply = null; try { reply = Dispatcher.dispatch(messageType, messageBody); } catch (JsonProcessingException e) { return HttpHelpers.sendError(CurrRequest, ApiErrors.JSON_ERROR, e.getMessage()); } catch (SQLException e) { return HttpHelpers.sendError(CurrRequest, ApiErrors.DB_ERROR, e.getMessage()); } catch (JsonApiException e) { return HttpHelpers.sendErrorJson(CurrRequest, e.Error, e.HttpStatus); } catch (Exception e) { return HttpHelpers.sendError(CurrRequest, ApiErrors.INTERNAL_SERVER_ERROR, e.getMessage()); } HttpResponse response = new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK, reply); if (reply != null) { HttpHelpers.setContentTypeHeader(response, "application/json"); HttpUtil.setContentLength(response, reply.readableBytes()); } response.headers().set(HttpHeaderNames.ACCESS_CONTROL_ALLOW_ORIGIN, "*"); return ctx.writeAndFlush(response); } return HttpHelpers.sendError(CurrRequest, ApiErrors.NOT_FOUND); }