aboutsummaryrefslogblamecommitdiffstats
path: root/manual/gun.md
blob: 3baa1f78b12cde8930cb607d8b158d1f72636ccc (plain) (tree)






























                                                                            

















































































                                                                




































                                                              
                                      









                                                       
                                      









                                                        
                                      











                                                              
                                      













                                                                        
                                      




















                                                               
                                      























                                                               
                                      























                                                                
                                      























































                                                                   
                                      









                                        
gun
===

The `gun` module provides an asynchronous interface for
connecting and communicating with Web servers over SPDY,
HTTP or Websocket.

Types
-----

### opts() = [{keepalive, pos_integer()}
	| {retry, non_neg_integer()}
	| {retry_timeout, pos_integer()}
	| {type, ssl | tcp | tcp_spdy}].

> Configuration for the connection.

Option descriptions
-------------------

The default value is given next to the option name.

 -  keepalive (5000)
   -  Time between pings in milliseconds.
 -  retry (5)
   -  Number of times Gun will try to reconnect on failure before giving up.
 -  retry_timeout (5000)
   -  Time between retries in milliseconds.
 -  type (ssl)
   -  Whether to use SSL, plain TCP (for HTTP/Websocket) or SPDY over TCP.

Messages
--------

Calling functions from this module may result in the following
messages being sent.

### {gun_push, ServerPid, StreamRef, AssocToStreamRef,
	Method, Host, Path, Headers}

> Types:
>  *  ServerPid = pid()
>  *  StreamRef = AssocToStreamRef = reference()
>  *  Method = binary()
>  *  Host = binary()
>  *  Path = binary()
>  *  Headers = [{binary(), binary()}]
>
> A resource pushed alongside an HTTP response.

### {gun_response, ServerPid, StreamRef, IsFin, Status, Headers}

> Types:
>  *  ServerPid = pid()
>  *  StreamRef = reference()
>  *  IsFin = fin | nofin
>  *  Status = binary()
>  *  Headers = [{binary(), binary()}]
>
> A response to an HTTP request.

### {gun_data, ServerPid, StreamRef, IsFin, Data}

> Types:
>  *  ServerPid = pid()
>  *  StreamRef = reference()
>  *  IsFin = fin | nofin
>  *  Data = binary()
>
> Data associated with a response or pushed resource.

### {gun_error, ServerPid, StreamRef, Reason}

> Types:
>  *  ServerPid = pid()
>  *  StreamRef = reference()
>  *  Reason = any()
>
> An error specific to a particular stream.

### {gun_error, ServerPid, Reason}

> Types:
>  *  ServerPid = pid()
>  *  Reason = any()
>
> A general error.

### {gun_ws_upgrade, ServerPid, ok}

> Types:
>  *  ServerPid = pid()
>
> Websocket upgrade success.

### {gun_ws_upgrade, ServerPid, error, IsFin, Status, Headers}

> Types:
>  *  ServerPid = pid()
>  *  IsFin = fin | nofin
>  *  Status = binary()
>  *  Headers = [{binary(), binary()}]
>
> Websocket upgrade failure, with the HTTP response received.

### {gun_ws, ServerPid, Frame}

> Types:
>  *  ServerPid = pid()
>  *  Frame = ws_frame()
>
> A Websocket frame just received.

Exports
-------

### open(Host, Port) -> open(Host, Port, [])
### open(Host, Port, Opts) -> {ok, ServerPid} | {error, any()}

> Types:
>  *  Host = inet:hostname()
>  *  Port = inet:port_number()
>  *  Opts = opts()
>  *  ServerPid = pid()
>
> Open a connection to the given host.

### close(ServerPid) -> ok

> Types:
>  *  ServerPid = pid()
>
> Brutally close the connection.

### shutdown(ServerPid) -> ok

> Types:
>  *  ServerPid = pid()
>
> Gracefully close the connection.
>
> A monitor can be used to be notified when the connection is
> effectively closed.

### delete(ServerPid, Path) -> delete(ServerPid, Path, [])
### delete(ServerPid, Path, Headers) -> StreamRef

> Types:
>  *  ServerPid = pid()
>  *  Path = iodata()
>  *  Headers = [{binary(), iodata()}]
>  *  StreamRef = reference()
>
> Delete a resource.

### get(ServerPid, Path) -> delete(ServerPid, Path, [])
### get(ServerPid, Path, Headers) -> StreamRef

> Types:
>  *  ServerPid = pid()
>  *  Path = iodata()
>  *  Headers = [{binary(), iodata()}]
>  *  StreamRef = reference()
>
> Fetch a resource.

### head(ServerPid, Path) -> delete(ServerPid, Path, [])
### head(ServerPid, Path, Headers) -> StreamRef

> Types:
>  *  ServerPid = pid()
>  *  Path = iodata()
>  *  Headers = [{binary(), iodata()}]
>  *  StreamRef = reference()
>
> Fetch a resource's headers.
>
> The server will not send the resource content, only headers.

### options(ServerPid, Path) -> delete(ServerPid, Path, [])
### options(ServerPid, Path, Headers) -> StreamRef

> Types:
>  *  ServerPid = pid()
>  *  Path = iodata()
>  *  Headers = [{binary(), iodata()}]
>  *  StreamRef = reference()
>
> Obtain information about the capabilities of the server or a resource.
>
> The special path "*" can be used to obtain information about
> the server as a whole. Any other path will return information
> about the resource only.

### patch(ServerPid, Path, Headers) -> StreamRef
### patch(ServerPid, Path, Headers, Body) -> StreamRef

> Types:
>  *  ServerPid = pid()
>  *  Path = iodata()
>  *  Headers = [{binary(), iodata()}]
>  *  StreamRef = reference()
>  *  Body = iodata()
>
> Partially update a resource.
>
> Always set the content-type header so that Gun and the server
> can be made aware that a body is going to be sent. Also try
> to set the content-length header when possible.
>
> If a body is given, even an empty one, it is expected to be
> the full resource.
>
> If not, Gun will assume there is no body if content-type
> isn't set, and otherwise will expect you to stream the body.

### post(ServerPid, Path, Headers) -> StreamRef
### post(ServerPid, Path, Headers, Body) -> StreamRef

> Types:
>  *  ServerPid = pid()
>  *  Path = iodata()
>  *  Headers = [{binary(), iodata()}]
>  *  StreamRef = reference()
>  *  Body = iodata()
>
> Create or update a resource.
>
> The resource may be created at a different URL than the one
> given.
>
> Always set the content-type header so that Gun and the server
> can be made aware that a body is going to be sent. Also try
> to set the content-length header when possible.
>
> If a body is given, even an empty one, it is expected to be
> the full resource.
>
> If not, Gun will assume there is no body if content-type
> isn't set, and otherwise will expect you to stream the body.

### put(ServerPid, Path, Headers) -> StreamRef
### put(ServerPid, Path, Headers, Body) -> StreamRef

> Types:
>  *  ServerPid = pid()
>  *  Path = iodata()
>  *  Headers = [{binary(), iodata()}]
>  *  StreamRef = reference()
>  *  Body = iodata()
>
> Create or update a resource.
>
> The resource will be created at this exact URL.
>
> Always set the content-type header so that Gun and the server
> can be made aware that a body is going to be sent. Also try
> to set the content-length header when possible.
>
> If a body is given, even an empty one, it is expected to be
> the full resource.
>
> If not, Gun will assume there is no body if content-type
> isn't set, and otherwise will expect you to stream the body.

### request(ServerPid, Method, Path, Headers) -> StreamRef
### request(ServerPid, Method, Path, Headers, Body) -> StreamRef

> Types:
>  *  ServerPid = pid()
>  *  Method = iodata()
>  *  Path = iodata()
>  *  Headers = [{binary(), iodata()}]
>  *  StreamRef = reference()
>  *  Body = iodata()
>
> Perform the given request on a resource.
>
> This is a general purpose function that should only be used
> when no other function can be used.
>
> Method names are case sensitive.
>
> Always set the content-type header so that Gun and the server
> can be made aware that a body is going to be sent. Also try
> to set the content-length header when possible.
>
> If a body is given, even an empty one, it is expected to be
> the full resource.
>
> If not, Gun will assume there is no body if content-type
> isn't set, and otherwise will expect you to stream the body.

### data(ServerPid, StreamRef, IsFin, Data) -> ok

> Types:
>  *  ServerPid = pid()
>  *  StreamRef = reference()
>  *  IsFin = fin | nofin
>  *  Data = iodata()
>
> Stream data.
>
> The `StreamRef` argument is the one returned by any of the
> request functions beforehand and uniquely identifies a request.
>
> Use `nofin` for all chunks except the last which should be `fin`.
> The last chunk may be empty.

### cancel(ServerPid, StreamRef) -> ok

> Types:
>  *  ServerPid = pid()
>  *  StreamRef = reference()
>
> Cancel the given stream.
>
> The `StreamRef` argument is the one returned by any of the
> request functions beforehand and uniquely identifies a request.
>
> This function will do a best effort at canceling the stream,
> depending on the capabilities of the protocol.

### ws_upgrade(ServerPid, Path) -> ws_upgrade(ServerPid, Path, [])
### ws_upgrade(ServerPid, Path, Headers) -> ok

> Types:
>  *  ServerPid = pid()
>  *  Path = iodata()
>  *  Headers = [{binary(), iodata()}]
>
> Upgrade the connection to Websocket.

### ws_send(ServerPid, Frames) -> ok

> Types:
>  *  ServerPid = pid()
>  *  Frames = ws_frame() | [ws_frame()]
>
> Send a Websocket frame.