Provided by: erlang-manpages_16.b.3-dfsg-1ubuntu2_all bug


       httpc - An HTTP/1.1 client


       This  module  provides  the  API  to  a  HTTP/1.1 compatible client according to RFC 2616,
       caching is currently not supported.

       When starting the Inets application a manager process for  the  default  profile  will  be
       started.  The  functions  in this API that do not explicitly use a profile will access the
       default profile. A profile keeps track of proxy options, cookies and  other  options  that
       can be applied to more than one request.

       If  the  scheme  https  is  used the ssl application needs to be started. When https links
       needs to go through a proxy the CONNECT method extension to HTTP-1.1 is used to  establish
       a  tunnel  and  then the connection is upgraded to TLS, however "TLS upgrade" according to
       RFC 2817 is not supported.

       Also note that pipelining will only be used if the  pipeline  timeout  is  set,  otherwise
       persistent  connections  without  pipelining will be used e.i. the client always waits for
       the previous response before sending the next request.

       There are some usage examples in the Inets User's Guide.


       Type definitions that are used more than once in this module:

       boolean()    = true | false
       string()     = list of ASCII characters
       request_id() = ref()
       profile()    = atom()
       path()       = string() representing a file path or directory path
       ip_address() = See inet(3erl)
       socket_opt() = See the Options used by gen_tcp(3erl) and
                      ssl(3erl) connect(s)


       Type definitions that are related to HTTP:

       For more information about HTTP see rfc 2616

       method()         = head | get | put | post | trace | options | delete
       request()        = {url(), headers()} |
                          {url(), headers(), content_type(), body()}
       url()            = string() - Syntax according to the URI definition in rfc 2396, ex: ""
       status_line()    = {http_version(), status_code(), reason_phrase()}
       http_version()   = string() ex: "HTTP/1.1"
       status_code()    = integer()
       reason_phrase()  = string()
       content_type()   = string()
       headers()        = [header()]
       header()         = {field(), value()}
       field()          = string()
       value()          = string()
       body()           = string() |
                          binary() |
                          {fun(accumulator()) -> body_processing_result(),
                           accumulator()} |
                           fun(accumulator()) -> body_processing_result(),
       body_processing_result() = eof | {ok, iolist(), accumulator()}
       accumulator()    = term()
       filename()       = string()


       See ssl(3erl) for information about ssl options (ssloptions()).


       A HTTP client can be configured to start when starting the inets  application  or  started
       dynamically   in   runtime   by  calling  the  inets  application  API  inets:start(httpc,
       ServiceConfig), or inets:start(httpc, ServiceConfig, How) see inets(3erl). Below follows a
       description of the available configuration options.

         {profile, profile()}:
           Name of the profile, see common data types below, this option is mandatory.

         {data_dir, path()}:
           Directory  where  the profile may save persistent data, if omitted all cookies will be
           treated as session cookies.

       The client can be stopped using inets:stop(httpc, Pid) or inets:stop(httpc, Profile).


       request(Url) ->
       request(Url, Profile) -> {ok, Result} | {error, Reason}


                 Url = url()
                 Result = {status_line(), headers(), Body} | {status_code(), Body} | request_id()
                 Body = string() | binary()
                 Profile = profile() | pid() (when started stand_alone)
                 Reason = term()

              Equivalent to httpc:request(get, {Url, []}, [], []).

       request(Method, Request, HTTPOptions, Options) ->
       request(Method,  Request,  HTTPOptions,  Options,  Profile)  ->  {ok,   Result}   |   {ok,
       saved_to_file} | {error, Reason}


                 Method = method()
                 Request = request()
                 HTTPOptions = http_options()
                 http_options() = [http_option()]
                 http_option()  =  {timeout,  timeout()}  |  {connect_timeout, timeout()} | {ssl,
                 ssloptions()} | {essl, ssloptions()} | {autoredirect, boolean()} |  {proxy_auth,
                 {userstring(),   passwordstring()}}  |  {version,  http_version()}  |  {relaxed,
                 boolean()} | {url_encode, boolean()}
                 timeout() = integer() >= 0 | infinity
                 Options = options()
                 options() = [option()]
                 option()  =  {sync,  boolean()}  |   {stream,   stream_to()}   |   {body_format,
                 body_format()}   |   {full_result,  boolean()}  |  {headers_as_is,  boolean()  |
                 {socket_opts, socket_opts()} | {receiver, receiver()}, {ipv6_host_with_brackets,
                 stream_to() = none | self | {self, once} | filename()
                 socket_opts() = [socket_opt()]
                 receiver() = pid() | function()/1 | {Module, Function, Args}
                 Module = atom()
                 Function = atom()
                 Args = list()
                 body_format() = string | binary
                 Result = {status_line(), headers(), Body} | {status_code(), Body} | request_id()
                 Body = string() | binary()
                 Profile = profile() | pid() (when started stand_alone)
                 Reason = {connect_failed, term()} | {send_failed, term()} | term()

              Sends a HTTP-request. The function can be both synchronous and asynchronous. In the
              later case the function will return {ok, RequestId} and later  on  the  information
              will be delivered to the receiver depending on that value.

              Http option (http_option()) details:

                  Timeout time for the request.

                  The clock starts ticking as soon as the request has been sent.

                  Time is in milliseconds.

                  Defaults to infinity.

                  Connection  timeout  time,  used during the initial request, when the client is
                  connecting to the server.

                  Time is in milliseconds.

                  Defaults to the value of the timeout option.

                  This is the default ssl config option, currently defaults to essl, see below.

                  Defaults to [].

                  If using the Erlang based implementation of SSL, these SSL-specific options are

                  Defaults to [].

                  Should  the  client automatically retrieve the information from the new URI and
                  return that as the result instead of a 30X-result code.

                  Note that for some 30X-result codes automatic redirect is not allowed. In these
                  cases the 30X-result will always be returned.

                  Defaults to true.

                  A  proxy-authorization header using the provided user name and password will be
                  added to the request.

                  Can be used to make the client act  as  an  HTTP/1.0  or  HTTP/0.9  client.  By
                  default  this is an HTTP/1.1 client. When using HTTP/1.0 persistent connections
                  will not be used.

                  Defaults to the string "HTTP/1.1".

                  If set to true workarounds for known server deviations from  the  HTTP-standard
                  are enabled.

                  Defaults to false.

                  Will apply Percent-encoding, also known as URL encoding on the URL.

                  Defaults to false.

              Option (option()) details:

                  Shall the request be synchronous or asynchronous.

                  Defaults to true.

                  Streams  the body of a 200 or 206 response to the calling process or to a file.
                  When streaming to the calling process  using  the  option  self  the  following
                  stream  messages will be sent to that process: {http, {RequestId, stream_start,
                  Headers}},  {http,  {RequestId,  stream,  BinBodyPart}},   {http,   {RequestId,
                  stream_end,  Headers}}.  When  streaming  to to the calling processes using the
                  option {self, once} the first message will  have  an  additional  element  e.i.
                  {http,  {RequestId,  stream_start,  Headers, Pid}}, this is the process id that
                  should be used as an argument to http:stream_next/1 to trigger the next message
                  to be sent to the calling process.

                  Note  that  it is possible that chunked encoding will add headers so that there
                  are more headers in the stream_end  message  than  in  the  stream_start.  When
                  streaming  to  a  file  and  the  request  is  asynchronous  the message {http,
                  {RequestId, saved_to_file}} will be sent.

                  Defaults to none.

                  Defines if the body shall be delivered as a string or as a binary. This  option
                  is only valid for the synchronous request.

                  Defaults to string.

                  Should  a  "full  result"  be  returned  to  the caller (that is, the body, the
                  headers and the entire status-line) or not (the body and the status code).

                  Defaults to true.

                  Shall the headers provided by the user be made lower case  or  be  regarded  as
                  case sensitive.

                  Note  that  the http standard requires them to be case insenstive. This feature
                  should only be used if there is no other way to communicate with the server  or
                  for testing purpose. Also note that when this option is used no headers will be
                  automatically added, all necessary headers have to be provided by the user.

                  Defaults to false.

                  Socket options to be used for this and subsequent request(s).

                  Overrides any value set by the set_options function.

                  Note that the validity of the options are not checked in any way.

                  Note that this may change the socket  behaviour  (see  inet:setopts/2)  for  an
                  already existing one, and therefore an already connected request handler.

                  By default the socket options set by the set_options/1,2 function are used when
                  establishing a connection.

                  Defines how the client will deliver the  result  of  an  asynchroneous  request
                  (sync has the value false).

                    Message(s) will be sent to this process in the format:

                  {http, ReplyInfo}

                    Information will be delivered to the receiver via calls to the provided fun:


                  {Module, Funcion, Args}:
                    Information  will  be  delivered  to  the  receiver via calls to the callback

                  apply(Module, Function, [ReplyInfo | Args])

                  In all of the above cases, ReplyInfo has the following structure:

                {RequestId, saved_to_file}
                {RequestId, {error, Reason}}
                {RequestId, Result}
                {RequestId, stream_start, Headers}
                {RequestId, stream_start, Headers, HandlerPid}
                {RequestId, stream,       BinBodyPart}
                {RequestId, stream_end,   Headers}

                  Defaults to the pid() of the process calling the request function (self()).

                  When parsing the Host-Port part of an URI with a IPv6  address  with  brackets,
                  shall we retain those brackets (true) or strip them (false).

                  Defaults to false.

       cancel_request(RequestId) ->
       cancel_request(RequestId, Profile) -> ok


                 RequestId = request_id() - A unique identifier as returned by request/4
                 Profile = profile() | pid() (when started stand_alone)

              Cancels an asynchronous HTTP-request. Note this does not guarantee that the request
              response will not be delivered, as it is asynchronous the the request  may  already
              have been completed when the cancellation arrives.

       set_options(Options) ->
       set_options(Options, Profile) -> ok | {error, Reason}


                 Options = [Option]
                 Option   =  {proxy,  {Proxy,  NoProxy}}  |  {https_proxy,  {Proxy,  NoProxy}}  |
                 {max_sessions,   MaxSessions}   |   {max_keep_alive_length,   MaxKeepAlive}    |
                 {keep_alive_timeout,  KeepAliveTimeout}  |  {max_pipeline_length, MaxPipeline} |
                 {pipeline_timeout,  PipelineTimeout}  |  {cookies,  CookieMode}   |   {ipfamily,
                 IpFamily}  |  {ip,  IpAddress}  |  {port, Port} | {socket_opts, socket_opts()} |
                 {verbose, VerboseMode}
                 Proxy = {Hostname, Port}
                 Hostname = string()
                   ex: "localhost" or ""
                 Port = integer()
                   ex: 8080
                 NoProxy = [NoProxyDesc]
                 NoProxyDesc = DomainDesc | HostName | IPDesc
                 DomainDesc = "*.Domain"
                   ex: "*"
                 IpDesc = string()
                   ex: "134.138" or "[FEDC:BA98"  (all  IP-addresses  starting  with  134.138  or
                   FEDC:BA98),  ""  or "[2010:836B:4179::836B:4179]" (a complete IP-
                   proxy defaults to {undefined, []} e.i. no proxy is configured and  https_proxy
                   defaults to the value of proxy.
                 MaxSessions = integer()
                   Default is 2. Maximum number of persistent connections to a host.
                 MaxKeepAlive = integer()
                   Default is 5. Maximum number of outstanding requests on the same connection to
                   a host.
                 KeepAliveTimeout = integer()
                   Default is 120000 (= 2 min). If a persistent connection is  idle  longer  than
                   the  keep_alive_timeout in milliseconds, the client will close the connection.
                   The server may also have such a time out but you should not count on it!
                 MaxPipeline = integer()
                   Default is 2. Maximum number of outstanding requests on a pipelined connection
                   to a host.
                 PipelineTimeout = integer()
                   Default  is 0, which will result in pipelining not being used. If a persistent
                   connection is idle longer  than  the  pipeline_timeout  in  milliseconds,  the
                   client will close the connection.
                 CookieMode = enabled | disabled | verify
                   Default   is   disabled.  If  Cookies  are  enabled  all  valid  cookies  will
                   automatically be saved in the client manager's cookie database. If the  option
                   verify  is  used the function store_cookies/2 has to be called for the cookies
                   to be saved.
                 IpFamily = inet | inet6 | inet6fb4
                   By default inet. When it is set to inet6fb4 you can use both ipv4 and ipv6. It
                   first tries inet6 and if that does not works falls back to inet. The option is
                   here to provide a workaround for buggy ipv6 stacks to ensure  that  ipv4  will
                   always work.
                 IpAddress = ip_address()
                   If the host has several network interfaces, this option specifies which one to
                   use. See gen_tcp:connect/3,4 for more info.
                 Port = integer()
                   Specify which local port number to use. See gen_tcp:connect/3,4 for more info.
                 socket_opts() = [socket_opt()]
                   The options are appended to the socket options used by the client.
                   These are the default values when a new request handler is  started  (for  the
                   initial  connect).  They  are  passed  directly  to  the  underlying transport
                   (gen_tcp or ssl) without verification!
                 VerboseMode = false | verbose | debug | trace
                   Default is false. This option is used to switch on (or off)  different  levels
                   of erlang trace on the client. It is a debug feature.
                 Profile = profile() | pid() (when started stand_alone)

              Sets options to be used for subsequent requests.

              If  possible  the  client  will  keep  its  connections  alive  and  use persistent
              connections with  or  without  pipeline  depending  on  configuration  and  current
              circumstances. The HTTP/1.1 specification does not provide a guideline for how many
              requests would be ideal to be sent on  a  persistent  connection,  this  very  much
              depends  on  the  application.  Note that a very long queue of requests may cause a
              user perceived delay as earlier requests may take a  long  time  to  complete.  The
              HTTP/1.1 specification does suggest a limit of 2 persistent connections per server,
              which is the default value of the max_sessions option.

       get_options(OptionItems) -> {ok, Values} | {error, Reason}
       get_options(OptionItems, Profile) -> {ok, Values} | {error, Reason}


                 OptionItems = all | [option_item()]
                 option_item()  =  proxy  |  https_proxy  max_sessions  |  keep_alive_timeout   |
                 max_keep_alive_length  |  pipeline_timeout  |  max_pipeline_length  |  cookies |
                 ipfamily | ip | port | socket_opts | verbose
                 Profile = profile() | pid() (when started stand_alone)
                 Values = [{option_item(), term()}]
                 Reason = term()

              Retrieves the options currently used by the client.

       stream_next(Pid) -> ok


                 Pid = pid() - as received in the stream_start message

              Triggers the next message to be streamed, e.i. same behavior  as  active  once  for

       store_cookies(SetCookieHeaders, Url) ->
       store_cookies(SetCookieHeaders, Url, Profile) -> ok | {error, Reason}


                 SetCookieHeaders = headers() - where field = "set-cookie"
                 Url = url()
                 Profile = profile() | pid() (when started stand_alone)

              Saves  the  cookies  defined  in  SetCookieHeaders  in  the client profile's cookie
              database. You need to call this function if you have  set  the  option  cookies  to
              verify. If no profile is specified the default profile will be used.

       cookie_header(Url) ->
       cookie_header(Url, Profile | Opts) -> header() | {error, Reason}
       cookie_header(Url, Opts, Profile) -> header() | {error, Reason}


                 Url = url()
                 Opts = [cookie_header_opt()]
                 Profile = profile() | pid() (when started stand_alone)
                 cookie_header_opt() = {ipv6_host_with_brackets, boolean()}

              Returns the cookie header that would be sent when making a request to Url using the
              profile Profile. If no profile is specified the default profile will be used.

              The option ipv6_host_with_bracket deals with how to parse IPv6 addresses.  See  the
              Options argument of the request/4,5 for more info.

       reset_cookies() -> void()
       reset_cookies(Profile) -> void()


                 Profile = profile() | pid() (when started stand_alone)

              Resets  (clears)  the  cookie  database for the specified Profile. If no profile is
              specified the default profile will be used.

       which_cookies() -> cookies()
       which_cookies(Profile) -> cookies()


                 Profile = profile() | pid() (when started stand_alone)
                 cookies() = [cookie_stores()]
                 cookie_stores() = {cookies, cookies()} | {session_cookies, cookies()}
                 cookies() = [cookie()]
                 cookie() = term()

              This function produces a list of the entire cookie database.  It  is  intended  for
              debugging/testing  purposes. If no profile is specified the default profile will be

       which_sessions() -> session_info()
       which_sessions(Profile) -> session_info()


                 Profile = profile() | pid() (when started stand_alone)
                 session_info() = {GoodSessions, BadSessions, NonSessions}
                 GoodSessions = session()
                 BadSessions = tuple()
                 NonSessions = term()

              This function produces a slightly processed dump of the  session  database.  It  is
              intended  for  debugging.  If  no  profile is specified the default profile will be

       info() -> list()
       info(Profile) -> list()


                 Profile = profile() | pid() (when started stand_alone)

              This function produces a list of miscelleneous info. It is intended for  debugging.
              If no profile is specified the default profile will be used.


       RFC 2616, inets(3erl), gen_tcp(3erl), ssl(3erl)