diff --git a/src/main/java/io/vertx/core/http/impl/Http1xClientConnection.java b/src/main/java/io/vertx/core/http/impl/Http1xClientConnection.java index 0f999f86c..c0e41e2f2 100644 --- a/src/main/java/io/vertx/core/http/impl/Http1xClientConnection.java +++ b/src/main/java/io/vertx/core/http/impl/Http1xClientConnection.java @@ -188,6 +188,55 @@ class Http1xClientConnection extends Http1xConnectionBase impleme return socket; } + private HttpRequest createRequest( + HttpMethod method, + String rawMethod, + String uri, + MultiMap headerMap, + String hostHeader, + boolean chunked) { + DefaultHttpRequest request = new DefaultHttpRequest(HttpUtils.toNettyHttpVersion(version), HttpUtils.toNettyHttpMethod(method, rawMethod), uri, false); + HttpHeaders headers = request.headers(); + if (headerMap != null) { + for (Map.Entry header : headerMap) { + headers.add(header.getKey(), header.getValue()); + } + } + if (!headers.contains(HOST)) { + request.headers().set(HOST, hostHeader); + } else { + headers.remove(TRANSFER_ENCODING); + } + if (chunked) { + HttpUtil.setTransferEncodingChunked(request, true); + } + if (options.isTryUseCompression() && request.headers().get(ACCEPT_ENCODING) == null) { + // if compression should be used but nothing is specified by the user support deflate and gzip. + request.headers().set(ACCEPT_ENCODING, DEFLATE_GZIP); + } + if (!options.isKeepAlive() && options.getProtocolVersion() == io.vertx.core.http.HttpVersion.HTTP_1_1) { + request.headers().set(CONNECTION, CLOSE); + } else if (options.isKeepAlive() && options.getProtocolVersion() == io.vertx.core.http.HttpVersion.HTTP_1_0) { + request.headers().set(CONNECTION, KEEP_ALIVE); + } + return request; + } + + private void sendRequest(HttpRequest request, ByteBuf buf, boolean end, Handler> handler) { + if (end) { + if (buf != null) { + request = new AssembledFullHttpRequest(request, buf); + } else { + request = new AssembledFullHttpRequest(request); + } + } else { + if (buf != null) { + request = new AssembledHttpRequest(request, buf); + } + } + writeToChannel(request, handler == null ? null : context.promise(handler)); + } + private static class StreamImpl implements HttpClientStream { private final int id; @@ -252,13 +301,12 @@ class Http1xClientConnection extends Http1xConnectionBase impleme @Override public void writeHead(HttpMethod method, String rawMethod, String uri, MultiMap headers, String hostHeader, boolean chunked, ByteBuf buf, boolean end, StreamPriority priority, Handler contHandler, Handler> handler) { - HttpRequest request = createRequest(method, rawMethod, uri, headers); - prepareRequestHeaders(request, hostHeader, chunked); + HttpRequest request = conn.createRequest(method, rawMethod, uri, headers, hostHeader, chunked); + conn.sendRequest(request, buf, end, handler); if (buf != null) { bytesWritten += buf.readableBytes(); } continueHandler = contHandler; - sendRequest(request, buf, end, handler); if (conn.responseInProgress == null) { conn.responseInProgress = this; } else { @@ -267,52 +315,6 @@ class Http1xClientConnection extends Http1xConnectionBase impleme next = null; } - private HttpRequest createRequest(HttpMethod method, String rawMethod, String uri, MultiMap headers) { - DefaultHttpRequest request = new DefaultHttpRequest(HttpUtils.toNettyHttpVersion(conn.version), HttpUtils.toNettyHttpMethod(method, rawMethod), uri, false); - if (headers != null) { - for (Map.Entry header : headers) { - // Todo : multi valued headers - request.headers().add(header.getKey(), header.getValue()); - } - } - return request; - } - - private void prepareRequestHeaders(HttpRequest request, String hostHeader, boolean chunked) { - HttpHeaders headers = request.headers(); - headers.remove(TRANSFER_ENCODING); - if (!headers.contains(HOST)) { - request.headers().set(HOST, hostHeader); - } - if (chunked) { - HttpUtil.setTransferEncodingChunked(request, true); - } - if (conn.options.isTryUseCompression() && request.headers().get(ACCEPT_ENCODING) == null) { - // if compression should be used but nothing is specified by the user support deflate and gzip. - request.headers().set(ACCEPT_ENCODING, DEFLATE_GZIP); - } - if (!conn.options.isKeepAlive() && conn.options.getProtocolVersion() == io.vertx.core.http.HttpVersion.HTTP_1_1) { - request.headers().set(CONNECTION, CLOSE); - } else if (conn.options.isKeepAlive() && conn.options.getProtocolVersion() == io.vertx.core.http.HttpVersion.HTTP_1_0) { - request.headers().set(CONNECTION, KEEP_ALIVE); - } - } - - private void sendRequest(HttpRequest request, ByteBuf buf, boolean end, Handler> handler) { - if (end) { - if (buf != null) { - request = new AssembledFullHttpRequest(request, buf); - } else { - request = new AssembledFullHttpRequest(request); - } - } else { - if (buf != null) { - request = new AssembledHttpRequest(request, buf); - } - } - conn.writeToChannel(request, handler == null ? null : context.promise(handler)); - } - private boolean handleChunk(Buffer buff) { bytesRead += buff.length(); return queue.write(buff);