HttpRequestMessage request = new HttpRequestMessage(context, servletRequest.getProtocol(), servletRequest.getMethod(), servletRequest.getRequestURI(), queryParams, reqHeaders, servletRequest.getRemoteAddr(), servletRequest.getScheme(), servletRequest.getServerPort(), servletRequest.getServerName()); request.storeOriginalRequestInfo(); request.setBodyStream(bodyObs);
public static HttpClientRequest<ByteBuf> createHttpClientRequest(HttpRequestMessage zuulReq) { HttpClientRequest<ByteBuf> clientReq = HttpClientRequest.create(HttpMethod.valueOf(zuulReq.getMethod().toUpperCase()), zuulReq.getPathAndQuery()); for (Map.Entry<String, String> entry : zuulReq.getHeaders().entries()) { // TODO - should we be filtering headers here like we do when using Ribbon? clientReq = clientReq.withHeader(entry.getKey(), entry.getValue()); } if (zuulReq.getBodyStream() != null) { clientReq = clientReq.withContentSource(zuulReq.getBodyStream()); } return clientReq; }
protected ZuulException proxyError(HttpRequestMessage zuulReq, Throwable t, String errorCauseMsg) { // Flag this as a proxy failure in the RequestContext. Error filter will then use this flag. zuulReq.getContext().setShouldSendErrorResponse(true); LOG.error(String.format("Error making http request to Origin. restClientName=%s, url=%s", this.name, zuulReq.getPathAndQuery()), t); if (errorCauseMsg == null) { if (t.getCause() != null) { errorCauseMsg = t.getCause().getMessage(); } } if (errorCauseMsg == null) errorCauseMsg = "unknown"; return new ZuulException("Proxying error", t, errorCauseMsg); }
@Override public Observable<HttpResponseMessage> request(HttpRequestMessage requestMsg) SessionContext context = requestMsg.getContext(); RestClient client = (RestClient) ClientFactory.getNamedClient(name); if (client == null) { HttpRequest.Verb verb = HttpRequest.Verb.valueOf(requestMsg.getMethod().toUpperCase()); URI uri = URI.create(requestMsg.getPath()); Headers headers = requestMsg.getHeaders(); HttpQueryParams params = requestMsg.getQueryParams(); if (requestMsg.getBodyStream() != null) { requestBuiltObs = ByteBufUtils.aggregate(requestMsg.getBodyStream(), MAX_BODY_SIZE_PROP.get()) .map(bb -> new ByteBufInputStream(bb)) .single()
@Override public void handle(HttpResponseMessage response) { HttpRequestMessage request = response.getRequest(); SessionContext context = response.getContext(); long duration = context.getTimings().getRequest().getDuration(); int responseBodySize = response.getBody() == null ? 0 : response.getBody().length; // Write to access log. accessLogPublisher.publish(new SimpleAccessRecord(LocalDateTime.now(), response.getStatus(), request.getMethod(), request.getPathAndQuery(), duration, responseBodySize, request.getHeaders(), response.getHeaders() )); // Publish request-level metrics. if (requestMetricsPublisher != null) { requestMetricsPublisher.collectAndPublish(context); } } }
@Override public ZuulMessage create(SessionContext context, HttpServerRequest httpServerRequest) { // Get the client IP (ignore XFF headers at this point, as that can be app specific). String clientIp = getIpAddress(httpServerRequest.getNettyChannel()); // TODO - How to get uri scheme from the netty request? String scheme = "http"; // This is the only way I found to get the port of the request with netty... int port = ((InetSocketAddress) httpServerRequest.getNettyChannel().localAddress()).getPort(); String serverName = ((InetSocketAddress) httpServerRequest.getNettyChannel().localAddress()).getHostString(); // Setup the req/resp message objects. HttpRequestMessage request = new HttpRequestMessage( context, httpServerRequest.getHttpVersion().text(), httpServerRequest.getHttpMethod().name().toLowerCase(), httpServerRequest.getUri(), copyQueryParams(httpServerRequest), copyHeaders(httpServerRequest), clientIp, scheme, port, serverName ); // Store this original request info for future reference (ie. for metrics and access logging purposes). request.storeOriginalRequestInfo(); return wrapBody(request, httpServerRequest); }
public HttpResponseMessage handle(HttpRequestMessage request) { HttpResponseMessage response = new HttpResponseMessage(request.getContext(), request, 200); response.getHeaders().set("Content-Type", "text/plain"); response.setBody("OK".getBytes(CS_UTF8)); return response; } }
private ZuulMessage wrapBody(HttpRequestMessage request, HttpServerRequest<ByteBuf> nettyServerRequest) { //PublishSubject<ByteBuf> cachedContent = PublishSubject.create(); UnicastDisposableCachingSubject<ByteBuf> cachedContent = UnicastDisposableCachingSubject.create(); // Subscribe to the response-content observable (retaining the ByteBufS first). nettyServerRequest.getContent().map(ByteBuf::retain).subscribe(cachedContent); request.setBodyStream(cachedContent); return request; }
public static HttpResponseMessage clientResponseToZuulResponse(HttpRequestMessage zuulRequest, HttpClientResponse<ByteBuf> resp) { HttpResponseMessage zuulResp = new HttpResponseMessage(zuulRequest.getContext(), zuulRequest, 500); // Copy the response headers and info into the RequestContext for use by post filters. if (resp.getStatus() != null) { zuulResp.setStatus(resp.getStatus().code()); } Headers zuulRespHeaders = zuulResp.getHeaders(); for (Map.Entry<String, String> entry : resp.getHeaders().entries()) { // TODO - should we be filtering headers here like we do when using Ribbon? zuulRespHeaders.add(entry.getKey(), entry.getValue()); } return zuulResp; }
SessionContext ctx = requestMsg.getContext(); final Timing timing = ctx.getTimings().getRequestProxy(); timing.start(); this.vip, requestMsg.getPathAndQuery(), serverInfo.getHost()), t);
protected HttpResponseMessage createHttpResponseMessage(HttpResponse ribbonResp, HttpRequestMessage request) { // Convert to a zuul response object. HttpResponseMessage respMsg = new HttpResponseMessage(request.getContext(), request, 500); respMsg.setStatus(ribbonResp.getStatus()); for (Map.Entry<String, String> header : ribbonResp.getHttpHeaders().getAllHeaders()) { if (ProxyUtils.isValidResponseHeader(header.getKey())) { respMsg.getHeaders().add(header.getKey(), header.getValue()); } } // Body. Observable<ByteBuf> responseBodyObs = ByteBufUtils.fromInputStream(ribbonResp.getInputStream()); respMsg.setBodyStream(responseBodyObs); return respMsg; }