@Override public void sendAsyncRequestImpl(RestRequest request, Callback<RestResponse> callback) throws IOException { log.debug ("Request URI : {} ", request.getURI()); client.restRequest(request, new com.linkedin.common.callback.Callback<RestResponse>() { @Override public void onError(Throwable e) { callback.onFailure(e); } @Override public void onSuccess(RestResponse result) { callback.onSuccess(result); } }); }
@Override public String toString() { RestRequest request = getRawRequest(); StringBuilder outBuffer = new StringBuilder(); String endl = "\n"; outBuffer.append("R2Request Info").append(endl); outBuffer.append("type: RestRequest").append(endl); outBuffer.append("uri: ").append(request.getURI().toString()).append(endl); outBuffer.append("headers: "); request.getHeaders().forEach((k, v) -> outBuffer.append("[").append(k).append(":").append(v).append("] ") ); outBuffer.append(endl); ByteString entity = request.getEntity(); if (entity != null) { outBuffer.append("body: ").append(entity.asString(Charset.defaultCharset())).append(endl); } return outBuffer.toString(); } }
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); }
@Override public void sendAsyncRequestImpl(RestRequest request, Callback<RestResponse> callback) throws IOException { log.debug ("Request URI : {} ", request.getURI()); client.restRequest(request, new com.linkedin.common.callback.Callback<RestResponse>() { @Override public void onError(Throwable e) { callback.onFailure(e); } @Override public void onSuccess(RestResponse result) { callback.onSuccess(result); } }); }
@Override public void restRequest(RestRequest request, RequestContext requestContext, Map<String, String> wireAttrs, TransportCallback<RestResponse> callback) { assert _serviceName.equals(LoadBalancerUtil.getServiceNameFromUri(request.getURI())); _client.restRequest(request, requestContext, wireAttrs, callback); }
@Override public String toString() { RestRequest request = getRawRequest(); StringBuilder outBuffer = new StringBuilder(); String endl = "\n"; outBuffer.append("R2Request Info").append(endl); outBuffer.append("type: RestRequest").append(endl); outBuffer.append("uri: ").append(request.getURI().toString()).append(endl); outBuffer.append("headers: "); request.getHeaders().forEach((k, v) -> outBuffer.append("[").append(k).append(":").append(v).append("] ") ); outBuffer.append(endl); ByteString entity = request.getEntity(); if (entity != null) { outBuffer.append("body: ").append(entity.asString(Charset.defaultCharset())).append(endl); } return outBuffer.toString(); } }
private void saveResponse(RestResponse res, RequestContext requestContext) { final RestRequest req = (RestRequest) requestContext.removeLocalAttr(REQ_ATTR); if (req != null) { _log.debug("Saving response for request: " + req.getURI()); try { _db.record(req, res); } catch (IOException e) { _log.debug("Failed to save request", e); } } } }
@Override public void handleRequest(RestRequest request, RequestContext requestContext, Callback<RestResponse> callback) { callback.onSuccess(RestStatus.responseForStatus(RestStatus.NOT_FOUND, "No resource for URI: " + request.getURI())); } };
@Override public void handleRequest(final RestRequest request, final RequestContext requestContext, final Callback<RestResponse> callback) { // Create a new request at this point from the debug request by removing the path suffix // starting with "__debug". String fullPath = request.getURI().getPath(); int debugSegmentIndex = fullPath.indexOf(DEBUG_PATH_SEGMENT); RestRequestBuilder requestBuilder = new RestRequestBuilder(request); UriBuilder uriBuilder = UriBuilder.fromUri(request.getURI()); uriBuilder.replacePath(request.getURI().getPath().substring(0, debugSegmentIndex - 1)); requestBuilder.setURI(uriBuilder.build()); _restLiServer.handleResourceRequest(requestBuilder.build(), requestContext, callback); } }
/** * 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; }
/** * @param request a RestRequest object to be encoded as a tunneled POST * @param requestContext a RequestContext object associated with the request * @param threshold the size of the query params above which the request will be encoded * * @return an encoded RestRequest */ public static RestRequest encode(final RestRequest request, RequestContext requestContext, int threshold) throws URISyntaxException, MessagingException, IOException { URI uri = request.getURI(); // Check to see if we should tunnel this request by testing the length of the query // if the query is NULL, we won't bother to encode. // 0 length is a special case that could occur with a url like http://www.foo.com? // which we don't want to encode, because we'll lose the "?" in the process // Otherwise only encode queries whose length is greater than or equal to the // threshold value. String query = uri.getRawQuery(); boolean forceQueryTunnel = requestContext.getLocalAttr(R2Constants.FORCE_QUERY_TUNNEL) != null && (Boolean) requestContext.getLocalAttr(R2Constants.FORCE_QUERY_TUNNEL); if (query == null || query.length() == 0 || (query.length() < threshold && !forceQueryTunnel)) { return request; } return doEncode(request); }
_log.debug("checkHealth: error response for request ({}): {}", _restRequest.getURI(), response.getError()); callback.onError(new Exception("Error from " + _restRequest.getURI() + " : " + response.getError())); _restRequest.getURI()); callback.onError(new TimeoutException("HealthCheck Timeout: " + delay + "ms for " + _restRequest.getURI())); _log.error("checkHealth: response validating error for request ({}): {}", _restRequest.getURI(), response); callback.onError(new Throwable("HealthCheck Response Error"));
@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); } }
private RestRequest rewriteRequest(RestRequest request) { return request.builder().setURI(_uriRewriter.rewriteURI(request.getURI())).build(); }
@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 boolean replayResponse(RestRequest req, RequestContext requestContext, NextFilter<RestRequest, RestResponse> nextFilter) { final RestResponse res = _db.replay(req); if (res != null) { _log.debug("Using cached response for request: " + req.getURI()); // We create an empty map instead of Collections.emptyMap, because upstream filters may // try to modify the map. final Map<String, String> wireAttrs = new HashMap<String, String>(); // For symmetry with CaptureFilter - if the REST response is "not OK" then we treat it as an // exception. if (!RestStatus.isOK(res.getStatus())) { nextFilter.onError(new RestException(res), requestContext, wireAttrs); } else { nextFilter.onResponse(res, requestContext, wireAttrs); } return true; } return false; } }
@Override public void handleRestRequest(RestRequest req, Map<String, String> wireAttrs, RequestContext requestContext, TransportCallback<RestResponse> callback) { final RestRequestHandler handler = getHandler(req.getURI(), _restHandlers, DEFAULT_REST_HANDLER); try { handler.handleRequest(req, requestContext, new TransportCallbackAdapter<RestResponse>(callback)); } catch (Exception e) { callback.onResponse(TransportResponseImpl.<RestResponse>error(RestException.forError(RestStatus.INTERNAL_SERVER_ERROR, e))); } }
@Override public void handleRestRequest(RestRequest req, Map<String, String> wireAttrs, RequestContext requestContext, TransportCallback<RestResponse> callback) { final URI address = req.getURI(); RestRequestHandler handler = _restHandlers.get(address); if (handler == null) { callback.onResponse(TransportResponseImpl.success(RestStatus.responseForStatus(RestStatus.NOT_FOUND, "No resource for URI:" + address))); return; } try { handler.handleRequest(req, requestContext, new TransportCallbackAdapter<RestResponse>(callback)); } catch (Exception e) { callback.onResponse(TransportResponseImpl.<RestResponse>error(RestException.forError(RestStatus.INTERNAL_SERVER_ERROR, e))); } }
@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); }