private void pushPromises(Http2Stream stream, RecordedRequest request, List<PushPromise> promises) throws IOException { for (PushPromise pushPromise : promises) { List<Header> pushedHeaders = new ArrayList<>(); pushedHeaders.add(new Header(Header.TARGET_AUTHORITY, url(pushPromise.path()).host())); pushedHeaders.add(new Header(Header.TARGET_METHOD, pushPromise.method())); pushedHeaders.add(new Header(Header.TARGET_PATH, pushPromise.path())); Headers pushPromiseHeaders = pushPromise.headers(); for (int i = 0, size = pushPromiseHeaders.size(); i < size; i++) { pushedHeaders.add(new Header(pushPromiseHeaders.name(i), pushPromiseHeaders.value(i))); } String requestLine = pushPromise.method() + ' ' + pushPromise.path() + " HTTP/1.1"; List<Integer> chunkSizes = Collections.emptyList(); // No chunked encoding for HTTP/2. requestQueue.add(new RecordedRequest(requestLine, pushPromise.headers(), chunkSizes, 0, new Buffer(), sequenceNumber.getAndIncrement(), socket)); boolean hasBody = pushPromise.response().getBody() != null; Http2Stream pushedStream = stream.getConnection().pushStream(stream.getId(), pushedHeaders, hasBody); writeResponse(pushedStream, request, pushPromise.response()); } } }
private void writeHttpResponse(Socket socket, BufferedSink sink, MockResponse response) throws IOException { sleepIfDelayed(response.getHeadersDelay(TimeUnit.MILLISECONDS)); sink.writeUtf8(response.getStatus()); sink.writeUtf8("\r\n"); writeHeaders(sink, response.getHeaders()); Buffer body = response.getBody(); if (body == null) return; sleepIfDelayed(response.getBodyDelay(TimeUnit.MILLISECONDS)); throttledTransfer(response, socket, body, sink, body.size(), false); if ("chunked".equalsIgnoreCase(response.getHeaders().get("Transfer-Encoding"))) { writeHeaders(sink, response.getTrailers()); } }
Buffer body = response.getBody(); boolean outFinished = body == null && response.getPushPromises().isEmpty()
private void pushPromises(Http2Stream stream, List<PushPromise> promises) throws IOException { for (PushPromise pushPromise : promises) { List<Header> pushedHeaders = new ArrayList<>(); pushedHeaders.add(new Header(Header.TARGET_AUTHORITY, url(pushPromise.path()).host())); pushedHeaders.add(new Header(Header.TARGET_METHOD, pushPromise.method())); pushedHeaders.add(new Header(Header.TARGET_PATH, pushPromise.path())); Headers pushPromiseHeaders = pushPromise.headers(); for (int i = 0, size = pushPromiseHeaders.size(); i < size; i++) { pushedHeaders.add(new Header(pushPromiseHeaders.name(i), pushPromiseHeaders.value(i))); } String requestLine = pushPromise.method() + ' ' + pushPromise.path() + " HTTP/1.1"; List<Integer> chunkSizes = Collections.emptyList(); // No chunked encoding for HTTP/2. requestQueue.add(new RecordedRequest(requestLine, pushPromise.headers(), chunkSizes, 0, new Buffer(), sequenceNumber.getAndIncrement(), socket)); boolean hasBody = pushPromise.response().getBody() != null; Http2Stream pushedStream = stream.getConnection().pushStream(stream.getId(), pushedHeaders, hasBody); writeResponse(pushedStream, pushPromise.response()); } } }
private void writeHttpResponse(Socket socket, BufferedSink sink, MockResponse response) throws IOException { sleepIfDelayed(response.getBodyDelay(TimeUnit.MILLISECONDS)); sink.writeUtf8(response.getStatus()); sink.writeUtf8("\r\n"); Headers headers = response.getHeaders(); for (int i = 0, size = headers.size(); i < size; i++) { sink.writeUtf8(headers.name(i)); sink.writeUtf8(": "); sink.writeUtf8(headers.value(i)); sink.writeUtf8("\r\n"); } sink.writeUtf8("\r\n"); sink.flush(); Buffer body = response.getBody(); if (body == null) return; sleepIfDelayed(response.getBodyDelay(TimeUnit.MILLISECONDS)); throttledTransfer(response, socket, body, sink, body.size(), false); }
Buffer body = response.getBody(); boolean closeStreamAfterHeaders = body != null || !response.getPushPromises().isEmpty(); stream.sendResponseHeaders(http2Headers, closeStreamAfterHeaders);