@Override public Response.ResponseBuilder status(int status) { response.setStatus(HttpResponseStatus.valueOf(status)); return this; }
protected void setResponseContent(HttpResponse res, byte[] data) { if (data != null) { res.content().writeBytes(data); HttpHeaders.setContentLength(res, data.length); } }
} else if (response instanceof WebApplicationException) { WebApplicationException ex = (WebApplicationException) response; res.setStatus(HttpResponseStatus.valueOf(ex.getResponse().getStatus())); if (ex.getMessage() != null && !ex.getMessage().isEmpty()) { byte[] msg = ex.getMessage().getBytes(); ByteBuf buf = ctx.alloc().heapBuffer(msg.length); res.resetContent(buf); writeResponseFromStream((ResolvedFile) response, res, request, mediaType, method, ctx); } else { res.setStatus(HttpResponseStatus.INTERNAL_SERVER_ERROR); if (isError(response)) { log.warn("Unexpected error to static file transformer", response);
protected ChannelFuture doWrite(ChannelHandlerContext ctx) { long responseSize = getHeader(res, HttpHeaders.Names.CONTENT_LENGTH) == null ? res.content().writerIndex() : HttpHeaders.getContentLength(res); res.finalizeCustomHeaders(request); if (!close && res.getManagedWriter() == null) { setContentLength(res, res.content().readableBytes()); if (res.getManagedWriter() == null) { future = res.doManagedWrite(); ResolvedFile f = res.getManagedWriter().getFile(); if (f != null) { responseSize = f.size(); request.getUri(), request.getProtocolVersion(), res.getStatus().code(), responseSize ));
protected ChannelFuture writeResponse(ChannelHandlerContext ctx, Object response, Queue<ResponseTransformer> t) { if (res.isRedirect()) { return doWrite(ctx); } if (response instanceof HttpResponse) { res = (HttpResponse) response; return doWrite(ctx); } List<ResponseTransformer> ts = new FixedSortedList<>(t); boolean notAcceptable = false; for (ResponseTransformer transformer : ts) { if (transformer.canTransform(response, request, request.getMatchedMediaType(), method, ctx)) { transformer.transform(response, request, res, request.getMatchedMediaType(), method, ctx); notAcceptable = false; break; } notAcceptable = true; } if (notAcceptable) { res.setStatus(HttpStatus.NOT_ACCEPTABLE); } return doWrite(ctx); }
@Override public Response.ResponseBuilder header(String name, Object value) { response.headers().set(name, value); return this; }
request = new HttpRequest((FullHttpRequest) msg, protocolConfig); res = new HttpResponse(Unpooled.buffer());
} else if (response instanceof WebApplicationException) { WebApplicationException ex = (WebApplicationException) response; res.setStatus(HttpResponseStatus.valueOf(ex.getResponse().getStatus())); if (ex.getMessage() != null && !ex.getMessage().isEmpty()) { byte[] msg = ex.getMessage().getBytes(); ByteBuf buf = ctx.alloc().heapBuffer(msg.length); res.resetContent(buf); writeResponseFromStream((ResolvedFile) response, res, request, mediaType, method, ctx); } else { res.setStatus(HttpResponseStatus.INTERNAL_SERVER_ERROR); if (isError(response)) { log.warn("Unexpected error to static file transformer", response);
public void clearHeaders() { newCookies.clear(); headers().clear(); }
protected void determineErrorStatus(HttpResponse res, Throwable response) { HttpResponseStatus status = null; if (response == null) { status = HttpResponseStatus.NO_CONTENT; } else if (response instanceof WebApplicationException) { status = HttpResponseStatus.valueOf(((WebApplicationException) response).getResponse().getStatus()); } res.setStatus(status); }
/** * Initializes a response with 200 status and sets the connection header to whatever the client * requested. If no connection header is found in the client request then it is set to CLOSE * * @param message */ public HttpResponse(final HttpRequest message) { this(message == null ? HttpVersion.HTTP_1_1 : message.getProtocolVersion(), HttpStatus.OK); if (message != null) { String conn = message.headers().get(HttpHeaders.Names.CONNECTION); if (conn == null) { conn = HttpHeaders.Values.CLOSE; } headers().set(HttpHeaders.Names.CONNECTION, conn); } }
protected Object convertErrorToResponseObject(HttpResponse res, Throwable response) { determineErrorStatus(res, response); if (response instanceof JsonResponseError) { JsonResponseError je = (JsonResponseError) response; res.setStatus(HttpResponseStatus.valueOf(je.getResponse().getStatus())); return je.getContent(); } log.warn("Unable to convert exception to response", response); //never JSON encode an exception, user can set it as content to JsonResponseError if they want return EMPTY_JSON_OBJECT; }
/** * sets any overridden headers */ public void finalizeCustomHeaders(HttpRequest request) { if (newCookies.size() > 0 || request.isNewSession()) { HashMap<String, HttpCookie> cookies = new HashMap<>(); HttpCookie cookie = request.getSessionCookie(); //if it's a new session or the session cookie isn't set on the request then tell the client to set it if (cookie != null && (request.isNewSession() || request.getCookie(HttpRequest.SID) == null)) { cookies.put(cookie.getName(), cookie); } cookies.putAll(newCookies); headers().set(HttpHeaders.Names.SET_COOKIE, ServerCookieEncoder.encode(new ArrayList<Cookie>(cookies.values()))); } }
@Override public void transform(Object response, HttpRequest request, HttpResponse res, MediaType mediaType, HttpMethod method, ChannelHandlerContext ctx) { byte[] data = null; if (response == null) { data = EMPTY_JSON_OBJECT.getBytes(); } else { if (isError(response)) { response = convertErrorToResponseObject(res, (Throwable) response); } try { data = JsonDecoder.mapper.writeValueAsBytes(response); } catch (JsonProcessingException e) { log.warn("Unable to transform response to JSON", e); res.setStatus(HttpStatus.INTERNAL_SERVER_ERROR); } } setResponseContent(res, data); }
protected Object convertErrorToResponseObject(HttpResponse res, Throwable response) { determineErrorStatus(res, response); if (response instanceof JsonResponseError) { JsonResponseError je = (JsonResponseError) response; res.setStatus(HttpResponseStatus.valueOf(je.getResponse().getStatus())); return je.getContent(); } log.warn("Unable to convert exception to response", response); //never JSON encode an exception, user can set it as content to JsonResponseError if they want return EMPTY_JSON_OBJECT; }
@Override public void transform(Object response, HttpRequest request, HttpResponse res, MediaType mediaType, HttpMethod method, ChannelHandlerContext ctx) { byte[] data = null; if (response == null) { data = EMPTY_JSON_OBJECT.getBytes(); } else { if (isError(response)) { response = convertErrorToResponseObject(res, (Throwable) response); } try { data = JsonDecoder.mapper.writeValueAsBytes(response); } catch (JsonProcessingException e) { log.warn("Unable to transform response to JSON", e); res.setStatus(HttpStatus.INTERNAL_SERVER_ERROR); } } setResponseContent(res, data); }
@Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { try { if (cause instanceof WebApplicationException) { writeResponse(ctx, cause, protocolConfig.getTransformers()); } else { log.warn(String.format("Error while processing request %s", request), cause); writeResponse(ctx, new WebApplicationException(HttpStatus.INTERNAL_SERVER_ERROR.code()), protocolConfig.getTransformers()); } } catch (Throwable t) { //at this point if an exception occurs, just log and return internal server error //internal server error log.warn(String.format("Uncaught error while processing request %s", request), cause); res.setStatus(HttpStatus.INTERNAL_SERVER_ERROR); doWrite(ctx); } } }