/** * Sets the request body. * <p> * This method encodes the content to a byte array using the specified * charset, and sets the Content-Length header *if* the setContentLength * argument is true. * * @param content request body * @param charset charset used for encoding request body * @param setContentLength If true, Content-Length header is set, otherwise it is not set. * @return {@code this} */ public Builder body(String content, Charset charset, boolean setContentLength) { requireNonNull(charset, "Charset is not provided."); String sanitised = content == null ? "" : content; return body(sanitised.getBytes(charset), setContentLength); }
private HttpRequest(Builder builder) { this.id = builder.id != null ? builder.id : randomUUID(); this.clientAddress = builder.clientAddress; this.version = builder.version(); this.method = builder.method; this.url = builder.url; this.secure = builder.secure; this.headers = builder.headers().build(); this.body = builder.body(); this.cookies = ImmutableList.copyOf(builder.cookies); }
private DecodedRequest(T content) { this.requestBuilder = newBuilder().body(content.toString()); this.content = content; }
@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(); }
/** * Converts this request into a streaming form (HttpRequest). * * Converts this request into a HttpRequest object which represents the HTTP request as a * stream of bytes. * * @return A streaming HttpRequest object. */ public HttpRequest toStreamingRequest() { HttpRequest.Builder streamingBuilder = new HttpRequest.Builder(this) .clientAddress(clientAddress); if (this.body.length == 0) { return streamingBuilder.body(Observable.empty()).build(); } else { return streamingBuilder.body(Observable.just(Unpooled.copiedBuffer(body))).build(); } }
@Test public void requestBodyCannotBeChangedViaStreamingRequest() { HttpRequest original = HttpRequest.get("/foo") .body("original", UTF_8) .build(); Flux.from(original.stream() .body() .map(buffer -> { buffer.delegate().array()[0] = 'A'; return buffer; })) .subscribe(); assertThat(original.bodyAs(UTF_8), is("original")); }
@Test public void contentFromByteArraySetsContentLengthIfRequired() { HttpRequest response1 = HttpRequest.get("/") .body("Response content.".getBytes(UTF_16), true) .build(); assertThat(response1.body(), is("Response content.".getBytes(UTF_16))); assertThat(response1.header("Content-Length"), is(Optional.of("36"))); HttpRequest response2 = HttpRequest.get("/") .body("Response content.".getBytes(UTF_8), false) .build(); assertThat(response2.body(), is("Response content.".getBytes(UTF_8))); assertThat(response2.header("Content-Length"), is(Optional.empty())); }
/** * Sets the request body. * <p> * This method encodes a String content to a byte array using the specified * charset, and sets the Content-Length header accordingly. * * @param content request body * @param charset Charset for string encoding * @return {@code this} */ public Builder body(String content, Charset charset) { return body(content, charset, true); }
@Test(expectedExceptions = NullPointerException.class, expectedExceptionsMessageRegExp = "Charset is not provided.") public void contentFromStringThrowsNPEWhenCharsetIsNull() { HttpRequest.get("/") .body("Response content.", null, false) .build(); }
@Test(expectedExceptions = NullPointerException.class, expectedExceptionsMessageRegExp = "Charset is not provided.") public void contentFromStringOnlyThrowsNPEWhenCharsetIsNull() { HttpRequest.get("/") .body("Response content.", null) .build(); }
@Test public void contentFromStringOnlySetsContentLength() { HttpRequest request = HttpRequest.get("/") .body("Response content.", UTF_16) .build(); assertThat(request.body(), is("Response content.".getBytes(UTF_16))); assertThat(request.header("Content-Length"), is(Optional.of("36"))); }
private Builder(HttpRequest request) { this.id = request.id; this.secure = request.secure; this.url = request.url; this.method = request.method; this.clientAddress = request.clientAddress; this.cookies = new ArrayList<>(request.cookies); body(request.body); headers(request.headers.newBuilder()); version(request.version); }
@Test public void requestBodyIsImmutable() { HttpRequest request = get("/foo") .body("Original body", UTF_8) .build(); request.body()[0] = 'A'; assertThat(request.bodyAs(UTF_8), is("Original body")); }
@Test public void contentFromStringSetsContentLengthIfRequired() { HttpRequest request1 = HttpRequest.get("/") .body("Response content.", UTF_8, true) .build(); assertThat(request1.header("Content-Length"), is(Optional.of("17"))); HttpRequest request2 = HttpRequest.get("/") .body("Response content.", UTF_8, false) .build(); assertThat(request2.header("Content-Length"), is(Optional.empty())); }
@DataProvider(name = "emptyBodyRequests") private Object[][] emptyBodyRequests() { return new Object[][]{ {get("/foo/bar").build()}, {new HttpRequest.Builder(POST, "/foo/bar").body(null, UTF_8).build()}, {new HttpRequest.Builder(POST, "/foo/bar").body("", UTF_8).build()}, {new HttpRequest.Builder(POST, "/foo/bar").body(null, UTF_8, true).build()}, {new HttpRequest.Builder(POST, "/foo/bar").body("", UTF_8, true).build()}, {new HttpRequest.Builder(POST, "/foo/bar").body(null, true).build()}, {new HttpRequest.Builder(POST, "/foo/bar").body(new byte[0], true).build()}, }; }
@Test public void transformedBodyIsNewCopy() { HttpRequest request = get("/foo") .body("Original body", UTF_8) .build(); HttpRequest newRequest = request.newBuilder() .body("New body", UTF_8) .build(); assertThat(request.bodyAs(UTF_8), is("Original body")); assertThat(newRequest.bodyAs(UTF_8), is("New body")); }