io.vertx.core.http

## Interface HttpClientRequest

- All Superinterfaces:
    StreamBase, WriteStream<Buffer>

      public interface HttpClientRequest
      extends WriteStream<Buffer>

  Represents a client-side HTTP request.

  Instances are created by an `HttpClient` instance, via one of the methods corresponding to the specific HTTP methods, or the generic request methods. On creation the request will not have been written to the wire.

  Once a request has been obtained, headers can be set on it, and data can be written to its body if required. Once you are ready to send the request, one of the `end()` methods should be called.

  Nothing is actually sent until the request has been internally assigned an HTTP connection.

  The `HttpClient` instance will return an instance of this class immediately, even if there are no HTTP connections available in the pool. Any requests sent before a connection is assigned will be queued internally and actually sent when an HTTP connection becomes available from the pool.

  The headers of the request are queued for writing either when the `end()` method is called, or, when the first part of the body is written, whichever occurs first.

  This class supports both chunked and non-chunked HTTP.

  It implements `WriteStream` so it can be used with `Pipe` to pipe data with flow control.

  An example of using this class is as follows:

  Author:
    Tim Fox

- - ### Method Summary

    All Methods Instance Methods Abstract Methods Default Methods
    Modifier and Type | Method and Description
    --- | ---
    `String` | `absoluteURI()`
    `Future<HttpClientResponse>` | `connect()` Like `connect(Handler)` but returns a `Future` of the asynchronous result
    `void` | `connect(Handler<AsyncResult<HttpClientResponse>> handler)` Create an HTTP tunnel to the server.
    `HttpConnection` | `connection()`
    `HttpClientRequest` | `continueHandler(Handler<Void> handler)` If you send an HTTP request with the header `Expect` set to the value `100-continue` and the server responds with an interim HTTP response with a status code of `100` and a continue handler has been set using this method, then the `handler` will be called.
    `HttpClientRequest` | `drainHandler(Handler<Void> handler)` Set a drain handler on the stream.
    `Future<Void>` | `end()` Ends the request.
    `Future<Void>` | `end(Buffer chunk)` Same as `end()` but writes some data to the request body before ending.
    `void` | `end(Buffer chunk, Handler<AsyncResult<Void>> handler)` Same as `end(String)` but with an `handler` called when the operation completes
    `void` | `end(Handler<AsyncResult<Void>> handler)` Same as `end()` but with an `handler` called when the operation completes
    `Future<Void>` | `end(String chunk)` Same as `end(Buffer)` but writes a String in UTF-8 encoding
    `void` | `end(String chunk, Handler<AsyncResult<Void>> handler)` Same as `end(String)` but with an `handler` called when the operation completes
    `Future<Void>` | `end(String chunk, String enc)` Same as `end(Buffer)` but writes a String with the specified encoding
    `void` | `end(String chunk, String enc, Handler<AsyncResult<Void>> handler)` Same as `end(String,String)` but with an `handler` called when the operation completes
    `HttpClientRequest` | `exceptionHandler(Handler<Throwable> handler)` Set an exception handler on the write stream.
    `String` | `getHost()`
    `HttpMethod` | `getMethod()` The HTTP method for the request.
    `int` | `getPort()`
    `StreamPriority` | `getStreamPriority()`
    `String` | `getURI()`
    `MultiMap` | `headers()`
    `boolean` | `isChunked()`
    `String` | `path()`
    `HttpClientRequest` | `pushHandler(Handler<HttpClientRequest> handler)` Set a push handler for this request. The handler is called when the client receives a push promise from the server.
    `HttpClientRequest` | `putHeader(CharSequence name, CharSequence value)` Like `putHeader(String, String)` but using CharSequence
    `HttpClientRequest` | `putHeader(CharSequence name, Iterable<CharSequence> values)` Like `putHeader(String, Iterable)` but using CharSequence
    `HttpClientRequest` | `putHeader(String name, Iterable<String> values)` Put an HTTP header with multiple values
    `HttpClientRequest` | `putHeader(String name, String value)` Put an HTTP header
    `String` | `query()`
    `default boolean` | `reset()` Reset this stream with the error code `0`.
    `boolean` | `reset(long code)` Reset this request: for HTTP/2, this performs send an HTTP/2 reset frame with the specified error `code` for HTTP/1.x, this closes the connection when the current request is inflight When the request has not yet been sent, the request will be aborted and false is returned as indicator.
    `boolean` | `reset(long code, Throwable cause)` Reset this request: for HTTP/2, send an HTTP/2 reset frame with the specified error `code` for HTTP/1.x, close the connection when the current request is inflight When the request has not yet been sent, the request will be aborted and `false` is returned as indicator.
    `Future<HttpClientResponse>` | `response()`
    `HttpClientRequest` | `response(Handler<AsyncResult<HttpClientResponse>> handler)` Set a callback for the associated `HttpClientResponse`.
    `default Future<HttpClientResponse>` | `send()` Like `send(Handler)` but returns a `Future` of the asynchronous result
    `default Future<HttpClientResponse>` | `send(Buffer body)` Like `send(Buffer, Handler)` but returns a `Future` of the asynchronous result
    `default void` | `send(Buffer body, Handler<AsyncResult<HttpClientResponse>> handler)` Send the request with a buffer `body`.
    `default void` | `send(Handler<AsyncResult<HttpClientResponse>> handler)` Send the request with an empty body.
    `default Future<HttpClientResponse>` | `send(ReadStream<Buffer> body)` Like `send(ReadStream, Handler)` but returns a `Future` of the asynchronous result
    `default void` | `send(ReadStream<Buffer> body, Handler<AsyncResult<HttpClientResponse>> handler)` Send the request with a stream `body`.
    `default Future<HttpClientResponse>` | `send(String body)` Like `send(String, Handler)` but returns a `Future` of the asynchronous result
    `default void` | `send(String body, Handler<AsyncResult<HttpClientResponse>> handler)` Send the request with a string `body`.
    `Future<Void>` | `sendHead()` Forces the head of the request to be written before `end()` is called on the request or any data is written to it.
    `HttpClientRequest` | `sendHead(Handler<AsyncResult<Void>> completionHandler)` Like `sendHead()` but with an handler after headers have been sent.
    `HttpClientRequest` | `setChunked(boolean chunked)` If chunked is true then the request will be set into HTTP chunked mode
    `HttpClientRequest` | `setFollowRedirects(boolean followRedirects)` Set the request to follow HTTP redirects up to `HttpClientOptions.getMaxRedirects()`.
    `HttpClientRequest` | `setHost(String host)` Set the host value of the HTTP/1.1 `host` header or HTTP/2 `authority` pseudo header
    `HttpClientRequest` | `setMaxRedirects(int maxRedirects)` Set the max number of HTTP redirects this request will follow.
    `HttpClientRequest` | `setMethod(HttpMethod method)` Set the HTTP method for this request.
    `HttpClientRequest` | `setPort(int port)` Set the port value of the HTTP/1.1 `host` header or HTTP/2 `authority` pseudo header
    `default HttpClientRequest` | `setStreamPriority(StreamPriority streamPriority)` Sets the priority of the associated stream.
    `HttpClientRequest` | `setTimeout(long timeoutMs)` Set's the amount of time after which if the request does not return any data within the timeout period an `TimeoutException` will be passed to the exception handler (if provided) and the request will be closed.
    `HttpClientRequest` | `setURI(String uri)` Set the request uri.
    `HttpClientRequest` | `setWriteQueueMaxSize(int maxSize)` Set the maximum size of the write queue to `maxSize`.
    `default int` | `streamId()`
    `HttpVersion` | `version()`
    `Future<Void>` | `write(String chunk)` Write a `String` to the request body, encoded as UTF-8.
    `void` | `write(String chunk, Handler<AsyncResult<Void>> handler)` Same as `write(String)` but with an `handler` called when the operation completes
    `Future<Void>` | `write(String chunk, String enc)` Write a `String` to the request body, encoded using the encoding `enc`.
    `void` | `write(String chunk, String enc, Handler<AsyncResult<Void>> handler)` Same as `write(String,String)` but with an `handler` called when the operation completes
    `default HttpClientRequest` | `writeCustomFrame(HttpFrame frame)` Like `writeCustomFrame(int, int, Buffer)` but with an `HttpFrame`.
    `HttpClientRequest` | `writeCustomFrame(int type, int flags, Buffer payload)` Write an HTTP/2 frame to the request, allowing to extend the HTTP/2 protocol.

    - ### Methods inherited from interface io.vertx.core.streams.WriteStream

      `write, write, writeQueueFull`

- - ### Method Detail

    - #### exceptionHandler

          HttpClientRequest exceptionHandler(Handler<Throwable> handler)

      Description copied from interface: `WriteStream`
      Set an exception handler on the write stream.
      Specified by:
        `exceptionHandler` in interface `StreamBase`
      Specified by:
        `exceptionHandler` in interface `WriteStream<Buffer>`
      Parameters:
        `handler` - the exception handler
      Returns:
        a reference to this, so the API can be used fluently

    - #### setWriteQueueMaxSize

          HttpClientRequest setWriteQueueMaxSize(int maxSize)

      Description copied from interface: `WriteStream`
      Set the maximum size of the write queue to `maxSize`. You will still be able to write to the stream even if there is more than `maxSize` items in the write queue. This is used as an indicator by classes such as `Pipe` to provide flow control.

      The value is defined by the implementation of the stream, e.g in bytes for a `NetSocket`, etc...
      Specified by:
        `setWriteQueueMaxSize` in interface `WriteStream<Buffer>`
      Parameters:
        `maxSize` - the max size of the write stream
      Returns:
        a reference to this, so the API can be used fluently

    - #### drainHandler

          HttpClientRequest drainHandler(Handler<Void> handler)

      Description copied from interface: `WriteStream`
      Set a drain handler on the stream. If the write queue is full, then the handler will be called when the write queue is ready to accept buffers again. See `Pipe` for an example of this being used.

      The stream implementation defines when the drain handler, for example it could be when the queue size has been reduced to `maxSize / 2`.

      Specified by:
        `drainHandler` in interface `WriteStream<Buffer>`
      Parameters:
        `handler` - the handler
      Returns:
        a reference to this, so the API can be used fluently

    - #### setHost

          HttpClientRequest setHost(String host)

      Set the host value of the HTTP/1.1 `host` header or HTTP/2 `authority` pseudo header

      The initial value is the same than the server socket address host.

      Keep in mind that changing this value won't change the actual server socket address for this request.

      Parameters:
        `host` - the host part of the HTTP/1.1 `host` header or HTTP/2 `authority` pseudo header
      Returns:
        a reference to this, so the API can be used fluently

    - #### getHost

          String getHost()

      Returns:
        the host value of the HTTP/1.1 `host` header or HTTP/2 `authority` pseudo header

    - #### setPort

          HttpClientRequest setPort(int port)

      Set the port value of the HTTP/1.1 `host` header or HTTP/2 `authority` pseudo header

      Keep in mind that this won't change the actual server socket address for this request.

      The initial value is the same than the server socket address port.

      Parameters:
        `port` - the port part of the HTTP/1.1 `host` header or HTTP/2 `authority` pseudo header
      Returns:
        a reference to this, so the API can be used fluently

    - #### getPort

          int getPort()

      Returns:
        the port value of the HTTP/1.1 `host` header or HTTP/2 `authority` pseudo header

    - #### setFollowRedirects

          HttpClientRequest setFollowRedirects(boolean followRedirects)

      Set the request to follow HTTP redirects up to `HttpClientOptions.getMaxRedirects()`.
      Parameters:
        `followRedirects` - `true` to follow HTTP redirects
      Returns:
        a reference to this, so the API can be used fluently

    - #### setMaxRedirects

          HttpClientRequest setMaxRedirects(int maxRedirects)

      Set the max number of HTTP redirects this request will follow. The default is `0` which means no redirects.
      Parameters:
        `maxRedirects` - the number of HTTP redirect to follow
      Returns:
        a reference to this, so the API can be used fluently

    - #### setChunked

          HttpClientRequest setChunked(boolean chunked)

      If chunked is true then the request will be set into HTTP chunked mode
      Parameters:
        `chunked` - true if chunked encoding
      Returns:
        a reference to this, so the API can be used fluently

    - #### isChunked

          boolean isChunked()

      Returns:
        Is the request chunked?

    - #### getMethod

          HttpMethod getMethod()

      The HTTP method for the request.

    - #### setMethod

          HttpClientRequest setMethod(HttpMethod method)

      Set the HTTP method for this request.
      Parameters:
        `method` - the HTTP method
      Returns:
        a reference to this, so the API can be used fluently

    - #### absoluteURI

          String absoluteURI()

      Returns:
        the absolute URI corresponding to the the HTTP request

    - #### getURI

          String getURI()

      Returns:
        The URI of the request.

    - #### setURI

          HttpClientRequest setURI(String uri)

      Set the request uri.
      Parameters:
        `uri` - the request uri
      Returns:
        a reference to this, so the API can be used fluently

    - #### path

          String path()

      Returns:
        The path part of the uri. For example /somepath/somemorepath/someresource.foo

    - #### query

          String query()

      Returns:
        the query part of the uri. For example someparam=32&someotherparam=x

    - #### headers

          MultiMap headers()

      Returns:
        The HTTP headers

    - #### putHeader

          HttpClientRequest putHeader(String name,
                                      String value)

      Put an HTTP header
      Parameters:
        `name` - The header name
        `value` - The header value
      Returns:
        a reference to this, so the API can be used fluently

    - #### putHeader

          HttpClientRequest putHeader(CharSequence name,
                                      CharSequence value)

      Like `putHeader(String, String)` but using CharSequence

    - #### putHeader

          HttpClientRequest putHeader(String name,
                                      Iterable<String> values)

      Put an HTTP header with multiple values
      Parameters:
        `name` - The header name
        `values` - The header values
      Returns:
        @return a reference to this, so the API can be used fluently

    - #### putHeader

          HttpClientRequest putHeader(CharSequence name,
                                      Iterable<CharSequence> values)

      Like `putHeader(String, Iterable)` but using CharSequence

    - #### version

          HttpVersion version()

      Returns:
        the HTTP version for this request

    - #### write

          Future<Void> write(String chunk)

      Write a `String` to the request body, encoded as UTF-8.
      Parameters:
        `chunk` - the data chunk
      Returns:
        a future completed with the result
      Throws:
        `IllegalStateException` - when no response handler is set

    - #### write

          void write(String chunk,
                     Handler<AsyncResult<Void>> handler)

      Same as `write(String)` but with an `handler` called when the operation completes

    - #### write

          Future<Void> write(String chunk,
                             String enc)

      Write a `String` to the request body, encoded using the encoding `enc`.
      Parameters:
        `chunk` - the data chunk
        `enc` - the encoding
      Returns:
        a future completed with the result
      Throws:
        `IllegalStateException` - when no response handler is set

    - #### write

          void write(String chunk,
                     String enc,
                     Handler<AsyncResult<Void>> handler)

      Same as `write(String,String)` but with an `handler` called when the operation completes

    - #### continueHandler

          HttpClientRequest continueHandler(Handler<Void> handler)

      If you send an HTTP request with the header `Expect` set to the value `100-continue` and the server responds with an interim HTTP response with a status code of `100` and a continue handler has been set using this method, then the `handler` will be called.

      You can then continue to write data to the request body and later end it. This is normally used in conjunction with the `sendHead()` method to force the request header to be written before the request has ended.

      Returns:
        a reference to this, so the API can be used fluently

    - #### sendHead

          Future<Void> sendHead()

      Forces the head of the request to be written before `end()` is called on the request or any data is written to it.

      This is normally used to implement HTTP 100-continue handling, see `continueHandler(io.vertx.core.Handler)` for more information.

      Returns:
        a reference to this, so the API can be used fluently
      Throws:
        `IllegalStateException` - when no response handler is set

    - #### sendHead

          HttpClientRequest sendHead(Handler<AsyncResult<Void>> completionHandler)

      Like `sendHead()` but with an handler after headers have been sent. The handler will be called with the `HttpVersion` if it can be determined or null otherwise.

    - #### connect

          void connect(Handler<AsyncResult<HttpClientResponse>> handler)

      Create an HTTP tunnel to the server.

      Send an HTTP request to the server, then configures the transport to exchange raw buffers when the server replies with an appropriate response:

      - `200` for HTTP `CONNECT` method
      - `101` for HTTP/1.1 `GET` with `Upgrade` `connection` header

      The `handler` is called after response headers are received.

      Use `HttpClientResponse.netSocket()` to get a `NetSocket` for the interacting more conveniently with the server.

      HTTP/1.1 pipe-lined requests are not supported.

      Parameters:
        `handler` - the response completion handler

    - #### connect

          Future<HttpClientResponse> connect()

      Like `connect(Handler)` but returns a `Future` of the asynchronous result

    - #### response

          HttpClientRequest response(Handler<AsyncResult<HttpClientResponse>> handler)

      Set a callback for the associated `HttpClientResponse`.

      This method does not modify the current request being sent.

      Parameters:
        `handler` - the completion handler
      Returns:
        a reference to this, so the API can be used fluently

    - #### response

          Future<HttpClientResponse> response()

      Returns:
        a future of the `HttpClientResponse`, see `response(Handler)`

    - #### send

          default void send(Handler<AsyncResult<HttpClientResponse>> handler)

      Send the request with an empty body.
      Parameters:
        `handler` - the completion handler for the `HttpClientResponse`

    - #### send

          default Future<HttpClientResponse> send()

      Like `send(Handler)` but returns a `Future` of the asynchronous result

    - #### send

          default void send(String body,
                            Handler<AsyncResult<HttpClientResponse>> handler)

      Send the request with a string `body`.
      Parameters:
        `handler` - the completion handler for the `HttpClientResponse`

    - #### send

          default Future<HttpClientResponse> send(String body)

      Like `send(String, Handler)` but returns a `Future` of the asynchronous result

    - #### send

          default void send(Buffer body,
                            Handler<AsyncResult<HttpClientResponse>> handler)

      Send the request with a buffer `body`.
      Parameters:
        `handler` - the completion handler for the `HttpClientResponse`

    - #### send

          default Future<HttpClientResponse> send(Buffer body)

      Like `send(Buffer, Handler)` but returns a `Future` of the asynchronous result

    - #### send

          default void send(ReadStream<Buffer> body,
                            Handler<AsyncResult<HttpClientResponse>> handler)

      Send the request with a stream `body`.

      If the `HttpHeaders.CONTENT_LENGTH` is set then the request assumes this is the length of the {stream}, otherwise the request will set a chunked `HttpHeaders.CONTENT_ENCODING`.

      Parameters:
        `handler` - the completion handler for the `HttpClientResponse`

    - #### send

          default Future<HttpClientResponse> send(ReadStream<Buffer> body)

      Like `send(ReadStream, Handler)` but returns a `Future` of the asynchronous result

    - #### end

          Future<Void> end(String chunk)

      Same as `end(Buffer)` but writes a String in UTF-8 encoding
      Parameters:
        `chunk` - the data chunk
      Returns:
        a future completed with the result
      Throws:
        `IllegalStateException` - when no response handler is set

    - #### end

          void end(String chunk,
                   Handler<AsyncResult<Void>> handler)

      Same as `end(String)` but with an `handler` called when the operation completes

    - #### end

          Future<Void> end(String chunk,
                           String enc)

      Same as `end(Buffer)` but writes a String with the specified encoding
      Parameters:
        `chunk` - the data chunk
        `enc` - the encoding
      Returns:
        a future completed with the result
      Throws:
        `IllegalStateException` - when no response handler is set

    - #### end

          void end(String chunk,
                   String enc,
                   Handler<AsyncResult<Void>> handler)

      Same as `end(String,String)` but with an `handler` called when the operation completes

    - #### end

          Future<Void> end(Buffer chunk)

      Same as `end()` but writes some data to the request body before ending. If the request is not chunked and no other data has been written then the `Content-Length` header will be automatically set
      Specified by:
        `end` in interface `WriteStream<Buffer>`
      Parameters:
        `chunk` - the data to write
      Returns:
        a future completed with the result
      Throws:
        `IllegalStateException` - when no response handler is set

    - #### end

          void end(Buffer chunk,
                   Handler<AsyncResult<Void>> handler)

      Same as `end(String)` but with an `handler` called when the operation completes
      Specified by:
        `end` in interface `WriteStream<Buffer>`

    - #### end

          Future<Void> end()

      Ends the request. If no data has been written to the request body, and `sendHead()` has not been called then the actual request won't get written until this method gets called.

      Once the request has ended, it cannot be used any more,

      Specified by:
        `end` in interface `WriteStream<Buffer>`
      Returns:
        a future completed with the result
      Throws:
        `IllegalStateException` - when no response handler is set

    - #### end

          void end(Handler<AsyncResult<Void>> handler)

      Same as `end()` but with an `handler` called when the operation completes
      Specified by:
        `end` in interface `WriteStream<Buffer>`

    - #### setTimeout

          HttpClientRequest setTimeout(long timeoutMs)

      Set's the amount of time after which if the request does not return any data within the timeout period an `TimeoutException` will be passed to the exception handler (if provided) and the request will be closed.

      Calling this method more than once has the effect of canceling any existing timeout and starting the timeout from scratch.

      Parameters:
        `timeoutMs` - The quantity of time in milliseconds.
      Returns:
        a reference to this, so the API can be used fluently

    - #### pushHandler

          HttpClientRequest pushHandler(Handler<HttpClientRequest> handler)

      Set a push handler for this request.

      The handler is called when the client receives a push promise from the server. The handler can be called multiple times, for each push promise.

      The handler is called with a read-only `HttpClientRequest`, the following methods can be called:

      - `getMethod()`
      - `getURI()`
      - `headers()`
      In addition the handler should call the `response(Handler)` method to set an handler to process the response.

      Parameters:
        `handler` - the handler
      Returns:
        a reference to this, so the API can be used fluently

    - #### reset

          default boolean reset()

      Reset this stream with the error code `0`.
      See Also:
        `reset(long)`

    - #### reset

          boolean reset(long code)

      Reset this request:

      - for HTTP/2, this performs send an HTTP/2 reset frame with the specified error `code`
      - for HTTP/1.x, this closes the connection when the current request is inflight

      When the request has not yet been sent, the request will be aborted and false is returned as indicator.

      Parameters:
        `code` - the error code
      Returns:
        `true` when reset has been performed

    - #### reset

          boolean reset(long code,
                        Throwable cause)

      Reset this request:

      - for HTTP/2, send an HTTP/2 reset frame with the specified error `code`
      - for HTTP/1.x, close the connection when the current request is inflight

      When the request has not yet been sent, the request will be aborted and `false` is returned as indicator.

      Parameters:
        `code` - the error code
        `cause` - an optional cause that can be attached to the error code
      Returns:
        true when reset has been performed

    - #### connection

          HttpConnection connection()

      Returns:
        the `HttpConnection` associated with this request

    - #### writeCustomFrame

          HttpClientRequest writeCustomFrame(int type,
                                             int flags,
                                             Buffer payload)

      Write an HTTP/2 frame to the request, allowing to extend the HTTP/2 protocol.

      The frame is sent immediatly and is not subject to flow control.

      This method must be called after the request headers have been sent and only for the protocol HTTP/2. The `sendHead(Handler)` should be used for this purpose.

      Parameters:
        `type` - the 8-bit frame type
        `flags` - the 8-bit frame flags
        `payload` - the frame payload
      Returns:
        a reference to this, so the API can be used fluently

    - #### streamId

          default int streamId()

      Returns:
        the id of the stream of this response, -1 when it is not yet determined, i.e the request has not been yet sent or it is not supported HTTP/1.x

    - #### writeCustomFrame

          default HttpClientRequest writeCustomFrame(HttpFrame frame)

      Like `writeCustomFrame(int, int, Buffer)` but with an `HttpFrame`.
      Parameters:
        `frame` - the frame to write

    - #### setStreamPriority

          default HttpClientRequest setStreamPriority(StreamPriority streamPriority)

      Sets the priority of the associated stream.

      This is not implemented for HTTP/1.x.
      Parameters:
        `streamPriority` - the priority of this request's stream

    - #### getStreamPriority

          StreamPriority getStreamPriority()

      Returns:
        the priority of the associated HTTP/2 stream for HTTP/2 otherwise `null`

Copyright © 2021 Eclipse. All rights reserved.