/** * Ensure that this response is read eagerly, downloading the full body if necessary. * <p> * The returned object can be safely passed around after the connection used to receive * this response has been closed. * <p> * The connection or stream used to download the response is NOT closed after a call to * this method. Use {@link #eagerly(boolean)} if a different behaviour is required. * * @return this response, after eagerly downloading all of its contents. * @throws IOException if an error occurs while reading this response */ public EagerHttpResponse<Response> eagerly() throws IOException { return eagerly(true); }
/** * Ensure that this response is read eagerly, downloading the full body if necessary. * <p> * The returned object can be safely passed around after the connection used to receive * this response has been closed. * <p> * The connection or stream used to download the response is NOT closed after a call to * this method. Use {@link #eagerly(boolean)} if a different behaviour is required. * * @return this response, after eagerly downloading all of its contents. * @throws IOException if an error occurs while reading this response */ public EagerHttpResponse<Response> eagerly() throws IOException { return eagerly(true); }
/** * Parses the HTTP response contained in the given file. * * @param file containing a HTTP response * @return a parsed HTTP response object * @throws InvalidHttpResponse if the response is invalid * @throws IOException if a problem occurs reading the file */ public final RawHttpResponse<Void> parseResponse(File file) throws IOException { try (InputStream stream = Files.newInputStream(file.toPath())) { return parseResponse(stream, null).eagerly(); } }
/** * Parses the HTTP response contained in the given file. * * @param file containing a HTTP response * @return a parsed HTTP response object * @throws InvalidHttpResponse if the response is invalid * @throws IOException if a problem occurs reading the file */ public final RawHttpResponse<Void> parseResponse(File file) throws IOException { try (InputStream stream = Files.newInputStream(file.toPath())) { return parseResponse(stream, null).eagerly(); } }
@Override public RawHttpResponse<Void> onResponse(Socket socket, URI uri, RawHttpResponse<Void> httpResponse) throws IOException { if (httpResponse.getHeaders() .getFirst("Connection") .orElse("") .equalsIgnoreCase("close") || httpResponse.getStartLine().getHttpVersion().isOlderThan(HttpVersion.HTTP_1_1)) { socketByHost.remove(uri.getHost()); // resolve the full response before closing the socket return httpResponse.eagerly(false); } return httpResponse; }
@Override public RawHttpResponse<Void> onResponse(Socket socket, URI uri, RawHttpResponse<Void> httpResponse) throws IOException { if (httpResponse.getHeaders() .getFirst("Connection") .orElse("") .equalsIgnoreCase("close") || httpResponse.getStartLine().getHttpVersion().isOlderThan(HttpVersion.HTTP_1_1)) { socketByHost.remove(uri.getHost()); // resolve the full response before closing the socket return httpResponse.eagerly(false); } return httpResponse; }
@Test public void goingRawWithoutFancyClient() throws IOException { RawHttp rawHttp = new RawHttp(); RawHttpRequest request = rawHttp.parseRequest(String.format("GET localhost:%d/hello HTTP/1.0", PORT)); Socket socket = new Socket("localhost", PORT); request.writeTo(socket.getOutputStream()); EagerHttpResponse<?> response = rawHttp.parseResponse(socket.getInputStream()).eagerly(); assertThat(response.getStatusCode(), is(200)); assertThat(response.getBody().map(EagerBodyReader::toString) .orElseThrow(() -> new RuntimeException("No body")), equalTo("Hello")); }
@Test public void frontPageExample() throws IOException { RawHttp rawHttp = new RawHttp(); RawHttpRequest request = rawHttp.parseRequest( "GET /hello.txt HTTP/1.1\r\n" + "User-Agent: curl/7.16.3 libcurl/7.16.3 OpenSSL/0.9.7l zlib/1.2.3\r\n" + "Host: www.example.com\r\n" + "Accept-Language: en, mi"); Socket socket = new Socket("www.example.com", 80); request.writeTo(socket.getOutputStream()); EagerHttpResponse<?> response = rawHttp.parseResponse(socket.getInputStream()).eagerly(); // call "eagerly()" in order to download the body System.out.println(response.eagerly()); assertThat(response.getStatusCode(), equalTo(404)); assertTrue(response.getBody().isPresent()); File responseFile = Files.createTempFile("rawhttp", ".http").toFile(); try (OutputStream out = Files.newOutputStream(responseFile.toPath())) { response.writeTo(out); } System.out.printf("Response parsed from file (%s):", responseFile); System.out.println(rawHttp.parseResponse(responseFile).eagerly()); }
@Test public void usingRawHttpWithHttpComponents() throws IOException { RawHttpClient<?> client = new RawHttpComponentsClient(); RawHttpRequest request = new RawHttp().parseRequest(String.format("GET localhost:%d/hello HTTP/1.0", PORT)); EagerHttpResponse<?> response = client.send(request).eagerly(); assertThat(response.getStatusCode(), is(200)); assertThat(response.getBody().map(EagerBodyReader::toString) .orElseThrow(() -> new RuntimeException("No body")), equalTo("Hello")); }
RawHttpResponse<?> response = http.parseResponse(socket.getInputStream()).eagerly(); System.out.println("RESPONSE:\n" + response); assertEquals(200, response.getStatusCode());
EagerHttpResponse<?> rawResponse = client.send(request).eagerly(); rawHttpStatusCode = rawResponse.getStatusCode(); rawHttpContentType = rawResponse.getHeaders().getFirst(HttpHeaders.CONTENT_TYPE).orElse("");
@Test public void useHttpServer() throws InterruptedException, IOException { RawHttpServer server = new TcpRawHttpServer(8086); RawHttp http = new RawHttp(); server.start(request -> { System.out.println("Got Request:\n" + request); String body = "Hello RawHTTP!"; String dateString = RFC_1123_DATE_TIME.format(ZonedDateTime.now(ZoneOffset.UTC)); RawHttpResponse<?> response = http.parseResponse("HTTP/1.1 200 OK\r\n" + "Content-Type: plain/text\r\n" + "Content-Length: " + body.length() + "\r\n" + "Server: RawHTTP\r\n" + "Date: " + dateString + "\r\n" + "\r\n" + body); return Optional.of(response); }); // wait for the socket get bound Thread.sleep(150L); RawHttpRequest request = http.parseRequest("GET /\r\nHost: localhost"); Socket socket = new Socket(InetAddress.getLoopbackAddress(), 8086); request.writeTo(socket.getOutputStream()); // get the response RawHttpResponse<?> response = http.parseResponse(socket.getInputStream()).eagerly(); System.out.println("RESPONSE:\n" + response); assertEquals(200, response.getStatusCode()); assertTrue(response.getBody().isPresent()); assertEquals("Hello RawHTTP!", response.getBody().get().decodeBodyToString(UTF_8)); server.stop(); }
RawHttpResponse<?> response = http.parseResponse(socket.getInputStream()).eagerly(); System.out.println("RESPONSE:\n" + response);