public static void assertEqual(RestRequestBuilder actual, RestRequestBuilder expect) throws IOException { // Check entity ByteString actualEntity = actual.getEntity(); ByteString expectedEntity = expect.getEntity(); if (actualEntity == null) { Assert.assertTrue(expectedEntity == null); } else { Assert.assertEquals(actualEntity.length(), expectedEntity.length()); Assert.assertEquals(actualEntity.asString(StandardCharsets.UTF_8),expectedEntity.asString(StandardCharsets.UTF_8)); } // Check request RestRequest actualRequest = actual.build(); RestRequest expectedRequest = expect.build(); Assert.assertEquals(actualRequest.getMethod(), expectedRequest.getMethod()); Assert.assertEquals(actualRequest.getURI().toString(), expectedRequest.getURI().toString()); Map<String, String> actualHeaders = actualRequest.getHeaders(); Map<String, String> expectedHeaders = expectedRequest.getHeaders(); Assert.assertEquals(actualHeaders.size(), expectedHeaders.size()); for (String key: actualHeaders.keySet()) { Assert.assertEquals(actualHeaders.get(key), expectedHeaders.get(key)); } } }
@Override protected void fillHttpOutputData(Schema schema, GenericRecord outputRecord, RestRequest restRequest, ResponseStatus status) throws IOException { R2ResponseStatus r2ResponseStatus = (R2ResponseStatus) status; HttpRequestResponseRecord record = new HttpRequestResponseRecord(); record.setRequestUrl(restRequest.getURI().toASCIIString()); record.setMethod(restRequest.getMethod()); record.setStatusCode(r2ResponseStatus.getStatusCode()); record.setContentType(r2ResponseStatus.getContentType()); record.setBody(r2ResponseStatus.getContent() == null? null: r2ResponseStatus.getContent().asByteBuffer()); outputRecord.put("HttpRequestResponse", record); }
/** * Adapts a RestRequest to Netty's HttpRequest * @param request R2 rest request * @return Adapted HttpRequest. */ public static HttpRequest toNettyRequest(RestRequest request) throws Exception { HttpMethod nettyMethod = HttpMethod.valueOf(request.getMethod()); URL url = new URL(request.getURI().toString()); String path = url.getFile(); // RFC 2616, section 5.1.2: // Note that the absolute path cannot be empty; if none is present in the original URI, // it MUST be given as "/" (the server root). if (path.isEmpty()) { path = "/"; } ByteBuf content = Unpooled.wrappedBuffer(request.getEntity().asByteBuffer()); HttpRequest nettyRequest = new DefaultFullHttpRequest(HttpVersion.HTTP_1_1, nettyMethod, path, content); nettyRequest.headers().set(HttpConstants.CONTENT_LENGTH, request.getEntity().length()); for (Map.Entry<String, String> entry : request.getHeaders().entrySet()) { nettyRequest.headers().set(entry.getKey(), entry.getValue()); } nettyRequest.headers().set(HttpHeaderNames.HOST, url.getAuthority()); nettyRequest.headers().set(HttpConstants.REQUEST_COOKIE_HEADER_NAME, request.getCookies()); return nettyRequest; }
@Override protected void encode(ChannelHandlerContext ctx, RestRequest request, List<Object> out) throws Exception { HttpMethod nettyMethod = HttpMethod.valueOf(request.getMethod()); URL url = new URL(request.getURI().toString()); String path = url.getFile(); // RFC 2616, section 5.1.2: // Note that the absolute path cannot be empty; if none is present in the original URI, // it MUST be given as "/" (the server root). if (path.isEmpty()) { path = "/"; } ByteString entity = request.getEntity(); ByteBuf content = Unpooled.wrappedBuffer(entity.asByteBuffer()); FullHttpRequest nettyRequest = new DefaultFullHttpRequest(HttpVersion.HTTP_1_1, nettyMethod, path, content); for (Map.Entry<String, String> e : request.getHeaders().entrySet()) { nettyRequest.headers().set(e.getKey(), e.getValue()); } nettyRequest.headers().set(HttpHeaderNames.HOST, url.getAuthority()); nettyRequest.headers().set(HttpConstants.REQUEST_COOKIE_HEADER_NAME, request.getCookies()); nettyRequest.headers().set(HttpHeaderNames.CONTENT_LENGTH, entity.length()); out.add(nettyRequest); } }
@Override public void onRestRequest(RestRequest req, RequestContext requestContext, Map<String, String> wireAttrs, NextFilter<RestRequest, RestResponse> nextFilter) { trace("onRestRequest", req, wireAttrs, requestContext); requestContext.putLocalAttr(REQUEST_URI, req.getURI()); requestContext.putLocalAttr(REQUEST_METHOD, req.getMethod()); nextFilter.onRequest(req, requestContext, wireAttrs); }
private void writeReqLine(OutputStream out, Request req) throws IOException { if (req instanceof RestRequest) { write(out, ((RestRequest)req).getMethod()); } else { write(out, POST); } write(out, SP); write(out, req.getURI().toASCIIString()); write(out, SP); write(out, HTTP_1_1); write(out, CRLF); }
@Override public void handleRequest(RestRequest request, RequestContext requestContext, final Callback<RestResponse> callback) if (HttpMethod.POST != HttpMethod.valueOf(request.getMethod())) _log.error("POST is expected, but " + request.getMethod() + " received"); callback.onError(RestException.forError(HttpStatus.S_405_METHOD_NOT_ALLOWED.getCode(), "Invalid method")); return;
@Override protected void fillHttpOutputData(Schema schema, GenericRecord outputRecord, RestRequest restRequest, ResponseStatus status) throws IOException { R2ResponseStatus r2ResponseStatus = (R2ResponseStatus) status; HttpRequestResponseRecord record = new HttpRequestResponseRecord(); record.setRequestUrl(restRequest.getURI().toASCIIString()); record.setMethod(restRequest.getMethod()); record.setStatusCode(r2ResponseStatus.getStatusCode()); record.setContentType(r2ResponseStatus.getContentType()); record.setBody(r2ResponseStatus.getContent() == null? null: r2ResponseStatus.getContent().asByteBuffer()); outputRecord.put("HttpRequestResponse", record); }