Connection-level API

The connection-level API is the lowest-level client-side API spray-can provides. It gives you full control over when HTTP connections are opened and closed and when requests are to be send across which connection. As such it offers the highest flexibility at the cost of providing the least convenience.

Opening HTTP Connections

With the connection-level API you open a new HTTP connection to a given host by sending an Http.Connect command message to the Http extensions as such:

IO(Http) ! Http.Connect("www.spray.io", port = 8080)

Apart from the host name and port the Http.Connect message also allows you to specify socket options and a larger number of configuration settings for the connection.

Upon receipt of an Http.Connect message spray-can internally spawns a new HttpClientConnection actor that manages a single HTTP connection across all of its lifetime. Your code never deals with the HttpClientConnection actor class directly, in fact it is marked private to the spray-can package. All communication with a connection actor happens purely via actor messages, the majority of which are defined in the spray.can.Http object.

After a new connection actor has been started it tries to open a new TCP connection to the given endpoint and responds with an Http.Connected event message to the sender of the Http.Connect command as soon as the connection has been successfully established. If the connection could not be opened for whatever reason an Http.CommandFailed event is being dispatched instead and the connection actor is stopped.

Request-Response Cycle

Once the connection actor has responded with an Http.Connected event you can send it one or more spray-http HttpRequestPart messages. The connection actor will serialize them across the connection and wait for responses. As soon as a response for a request has been received it is dispatched as a HttpResponsePart instance to the sender of the respective request.

After having received a response for a request the application can decide to send another request across the same connection (i.e. to the same connection actor) or close the connection and (potentially) open a new one.

Closing Connections

Unless some kind of error (or timeout) occurs the connection actor will never actively close an established connection, even if the response contains a Connection: close header. The application can decide to actively close a connection by sending the connection actor one of the Http.CloseCommand messages described in the chapter about Common Behavior.

Close notification events are dispatched to the senders of all requests that still have unfinished responses pending as well as all actors that might have already sent Http.CloseCommand messages.

Timeouts

If no response to a request is received within the configured request-timeout period the connection actor closes the connection and dispatches an Http.Closed event message to the senders of all requests that are currently open.

If the connection is closed after the configured idle-timeout has expired the connection actor simply closes the connection and stops itself. If the application would like to be notified of such events it should “watch” the connection actor and react to the respective Terminated events (which is a good idea in any case).

In order to change the respective config setting for this connection only the application can send the following messages to the connection actor:

  • spray.io.ConnectionTimeouts.SetIdleTimeout
  • spray.http.SetRequestTimeout