# Interface Request

All Known Implementing Classes:
  `HttpExchange, HttpsExchange`

public interface Request
A view of the immutable request state of an HTTP exchange.

Since:
  18

- ## Method Summary

  Modifier and Type
  Method
  Description
  `Headers`
  `getRequestHeaders()`
  Returns an immutable `Headers` containing the HTTP headers that were included with this request.
  `String`
  `getRequestMethod()`
  Returns the request method.
  `URI`
  `getRequestURI()`
  Returns the request `URI`.
  `default Request`
  `with(String headerName, List<String> headerValues)`
  Returns an identical `Request` with an additional header.

- ## Method Details

  - ### getRequestURI

    URI getRequestURI()
    Returns the request `URI`.
    Returns:
      the request `URI`

  - ### getRequestMethod

    String getRequestMethod()
    Returns the request method.
    Returns:
      the request method string

  - ### getRequestHeaders

    Headers getRequestHeaders()
    Returns an immutable `Headers` containing the HTTP headers that were included with this request.

    The keys in this `Headers` are the header names, while the values are a `List` of Strings containing each value that was included in the request, in the order they were included. Header fields appearing multiple times are represented as multiple string values.

    The keys in `Headers` are case-insensitive.

    Returns:
      a read-only `Headers` which can be used to access request headers.

  - ### with

    default Request with(String headerName, List<String> headerValues)
    Returns an identical `Request` with an additional header.

    The returned `Request` has the same set of `headers` as `this` request, but with the addition of the given header. All other request state remains unchanged.

    If `this` request already contains a header with the same name as the given `headerName`, then its value is not replaced.

    Implementation Requirements:
      The default implementation first creates a new `Headers`, `h`, then adds all the request headers from `this` request to `h`, then adds the given name-values mapping if `headerName` is not present in `h`. Then an unmodifiable view, `h'`, of `h` and a new `Request`, `r`, are created. The `getRequestMethod` and `getRequestURI` methods of `r` simply invoke the equivalently named method of `this` request. The `getRequestHeaders` method returns `h'`. Lastly, `r` is returned.
    Parameters:
      `headerName` - the header name
      `headerValues` - the list of header values
    Returns:
      a request
    Throws:
      `NullPointerException` - if any argument is null, or if any element of headerValues is null.