@Override public String toString() { return toStringHelper(this) .add("appId", appId) .add("retryCount", retryCount) .add("lastException", lastException) .add("request", request.url()) .add("previouslyUsedOrigins", hosts(previouslyUsedOrigins)) .toString(); }
private static Optional<String> xForwardedFor(LiveHttpRequest request, HttpInterceptor.Context context) { Optional<String> maybeClientAddress = context.clientAddress() .map(InetSocketAddress::getHostString) .map(hostName -> request .header(X_FORWARDED_FOR) .map(xForwardedFor -> xForwardedFor + ", " + hostName) .orElse(hostName)); if (!maybeClientAddress.isPresent()) { LOGGER.warn("No clientAddress in context url={}", request.url()); } return maybeClientAddress; }
private FlowControllingHttpContentProducer createProducer(ChannelHandlerContext ctx, LiveHttpRequest request) { String requestPrefix = request != null ? format("Request(method=%s, url=%s, id=%s)", request.method(), request.url(), request.id()) : "Request NA"; String loggingPrefix = format("%s -> %s", ctx.channel().remoteAddress(), ctx.channel().localAddress()); return new FlowControllingHttpContentProducer( () -> ctx.channel().read(), () -> { ctx.channel().config().setAutoRead(true); emitResponseCompleted(); }, this::emitResponseError, () -> scheduleResourcesTearDown(ctx), format("%s, %s", loggingPrefix, requestPrefix), origin); }
private static Origin originFromRequest(LiveHttpRequest request, Boolean isHttps) { String hostAndPort = request.header(HOST) .orElseGet(() -> { checkArgument(request.url().isAbsolute(), "host header is not set for request=%s", request); return request.url().authority().map(Url.Authority::hostAndPort) .orElseThrow(() -> new IllegalArgumentException("Cannot send request " + request + " as URL is not absolute and no HOST header is present")); }); HostAndPort host = HostAndPort.fromString(hostAndPort); if (host.getPortOrDefault(-1) < 0) { host = host.withDefaultPort(isHttps ? DEFAULT_HTTPS_PORT : DEFAULT_HTTP_PORT); } return newOriginBuilder(host.getHostText(), host.getPort()).build(); }
@Test public void createARequestWithStreamingUrl() { LiveHttpRequest request = get("http://www.hotels.com").build(); assertThat(request.url(), is(url("http://www.hotels.com").build())); }
@VisibleForTesting static DefaultHttpRequest toNettyRequest(LiveHttpRequest request) { HttpVersion version = request.version(); HttpMethod method = request.method(); String url = request.url().toString(); DefaultHttpRequest nettyRequest = new DefaultHttpRequest(toNettyVersion(version), toNettyMethod(method), url, false); request.headers().forEach((name, value) -> nettyRequest.headers().add(name, value)); return nettyRequest; }
/** * Creates a new {@link Builder} from streaming request and a content byte array. * * @param request a streaming HTTP request object * @param body an HTTP body content array */ public Builder(LiveHttpRequest request, byte[] body) { this.id = request.id(); this.method = request.method(); this.url = request.url(); this.version = request.version(); this.headers = request.headers().newBuilder(); this.body = body; }
Builder(LiveHttpRequest request) { this.id = request.id(); this.method = request.method(); this.url = request.url(); this.version = request.version(); this.headers = request.headers().newBuilder(); this.body = request.body(); }
/** * Rewrites the URL of the request according to the rewrite rules. * * @param request a request * @return a rewritten request */ public LiveHttpRequest rewrite(LiveHttpRequest request) { String path = request.path(); String newPath = newPath(path); if (!Objects.equals(newPath, path)) { Url newUrl = request.url().newBuilder().path(newPath).build(); return request.newBuilder() .url(newUrl) .build(); } return request; }
@Test public void createsRequestBuilderFromRequest() { LiveHttpRequest originalRequest = get("/home") .cookies(requestCookie("fred", "blogs")) .header("some", "header") .build(); LiveHttpRequest clonedRequest = originalRequest.newBuilder().build(); assertThat(clonedRequest.method(), is(originalRequest.method())); assertThat(clonedRequest.url(), is(originalRequest.url())); assertThat(clonedRequest.headers().toString(), is(originalRequest.headers().toString())); assertThat(clonedRequest.body(), is(originalRequest.body())); }
@Test public void createsARequestWithDefaultValues() { LiveHttpRequest request = get("/index").build(); assertThat(request.version(), is(HTTP_1_1)); assertThat(request.url().toString(), is("/index")); assertThat(request.path(), is("/index")); assertThat(request.id(), is(notNullValue())); assertThat(request.cookies(), is(emptyIterable())); assertThat(request.headers(), is(emptyIterable())); assertThat(request.headers("any"), is(emptyIterable())); assertThat(bytesToString(request.body()), is("")); assertThat(request.cookie("any"), isAbsent()); assertThat(request.header("any"), isAbsent()); assertThat(request.keepAlive(), is(true)); assertThat(request.method(), is(GET)); assertThat(request.queryParam("any"), isAbsent()); assertThat(request.queryParams("any"), is(emptyIterable())); }
private static Info information(LiveHttpRequest request, Origin origin, boolean longFormatEnabled) { Info info = new Info() .add("method", request.method()) .add("uri", request.url()) .add("origin", origin != null ? origin.hostAndPortString() : "N/A"); if (longFormatEnabled) { info.add("headers", request.headers()); } return info; }
@Test public void transformsUri() { LiveHttpRequest request = LiveHttpRequest.get("/x").build() .newBuilder() .uri("/y") .build(); assertEquals(request.url().path(), "/y"); }
@Test public void canModifyPreviouslyCreatedRequest() { LiveHttpRequest request = get("/foo") .header("remove", "remove") .build(); LiveHttpRequest newRequest = request.newBuilder() .uri("/home") .header("remove", "notanymore") .build(); assertThat(newRequest.url().path(), is("/home")); assertThat(newRequest.headers(), hasItem(header("remove", "notanymore"))); }
/** * Creates a new {@link Builder} from an existing request with a new body content stream. * * @param request a HTTP request object * @param contentStream a body content stream */ public Builder(LiveHttpRequest request, ByteStream contentStream) { this.id = request.id(); this.method = httpMethod(request.method().name()); this.url = request.url(); this.version = httpVersion(request.version().toString()); this.headers = request.headers().newBuilder(); this.body = body; }
@Test public void transformsUrl() { LiveHttpRequest request = LiveHttpRequest.get("/").build() .newBuilder() .url(url("/z").build()) .build(); assertEquals(request.url().path(), "/z"); }
@Test public void convertsToStreamingHttpRequest() throws Exception { HttpRequest fullRequest = new HttpRequest.Builder(POST, "/foo/bar").body("foobar", UTF_8) .version(HTTP_1_1) .header("HeaderName", "HeaderValue") .cookies(requestCookie("CookieName", "CookieValue")) .build(); LiveHttpRequest streaming = fullRequest.stream(); assertThat(streaming.method(), is(HttpMethod.POST)); assertThat(streaming.url(), is(url("/foo/bar").build())); assertThat(streaming.version(), is(HTTP_1_1)); assertThat(streaming.headers(), containsInAnyOrder( header("Content-Length", "6"), header("HeaderName", "HeaderValue"), header("Cookie", "CookieName=CookieValue"))); assertThat(streaming.cookies(), contains(requestCookie("CookieName", "CookieValue"))); StepVerifier.create(streaming.aggregate(0x10000).map(it -> it.bodyAs(UTF_8))) .expectNext("foobar") .verifyComplete(); }