@Override public void onStream(FramedStream stream) throws IOException { RecordedRequest request = readRequest(stream); requestQueue.add(request); MockResponse response; try { response = dispatcher.dispatch(request); } catch (InterruptedException e) { throw new AssertionError(e); } writeResponse(stream, response); if (logger.isLoggable(Level.INFO)) { logger.info(MockWebServer.this + " received request: " + request + " and responded: " + response + " protocol is " + protocol.toString()); } }
FramedSocketHandler framedSocketListener = new FramedSocketHandler(socket, protocol); FramedConnection framedConnection = new FramedConnection.Builder(false) .socket(socket)
boolean closeStreamAfterHeaders = body != null || !response.getPushPromises().isEmpty(); stream.reply(spdyHeaders, closeStreamAfterHeaders); pushPromises(stream, response.getPushPromises()); if (body != null) { BufferedSink sink = Okio.buffer(stream.getSink());
private void pushPromises(FramedStream stream, List<PushPromise> promises) throws IOException { for (PushPromise pushPromise : promises) { List<Header> pushedHeaders = new ArrayList<>(); pushedHeaders.add(new Header(stream.getConnection().getProtocol() == Protocol.SPDY_3 ? Header.TARGET_HOST : Header.TARGET_AUTHORITY, url(pushPromise.getPath()).host())); pushedHeaders.add(new Header(Header.TARGET_METHOD, pushPromise.getMethod())); pushedHeaders.add(new Header(Header.TARGET_PATH, pushPromise.getPath())); Headers pushPromiseHeaders = pushPromise.getHeaders(); for (int i = 0, size = pushPromiseHeaders.size(); i < size; i++) { pushedHeaders.add(new Header(pushPromiseHeaders.name(i), pushPromiseHeaders.value(i))); } String requestLine = pushPromise.getMethod() + ' ' + pushPromise.getPath() + " HTTP/1.1"; List<Integer> chunkSizes = Collections.emptyList(); // No chunked encoding for SPDY. requestQueue.add(new RecordedRequest(requestLine, pushPromise.getHeaders(), chunkSizes, 0, new Buffer(), sequenceNumber.getAndIncrement(), socket)); boolean hasBody = pushPromise.getResponse().getBody() != null; FramedStream pushedStream = stream.getConnection().pushStream(stream.getId(), pushedHeaders, hasBody); writeResponse(pushedStream, pushPromise.getResponse()); } } }