Provided by: erlang-yaws_2.1.1+dfsg-1_amd64 bug

NAME

       yaws_api - api available to yaws web server programmers

SYNOPSIS

       yaws_api:Function(...)

DESCRIPTION

       This  is  the  api  available  to yaws web server programmers. The Erlang module yaws_api contains a wide
       variety of functions that can be used inside yaws pages.

       Each chunk of yaws code is executed while the yaws page is being delivered from the  server.  We  give  a
       very simple example here to show the basic idea. Imagine the following HTML code:

       <html>
       <body>

       <h1> Header 1</h1>

       <erl>
       out(Arg) ->
           {html, "<p> Insert this text into the document"}.
       </erl>

       </body>
       </html>

       The  out(Arg)  function  is  supplied  one argument, an #arg{} structure.  We have the following relevant
       record definitions:

       -record(arg, {
                 clisock,        % the socket leading to the peer client
                 client_ip_port, % {ClientIp, ClientPort} tuple
                 headers,        % headers
                 req,            % request (possibly rewritten)
                 orig_req,       % original request
                 clidata,        % The client data (as a binary in POST requests)
                 server_path,    % The normalized server path
                                 % (pre-querystring part of URI)
                 querydata,      % For URIs of the form ...?querydata
                                 %  equiv of cgi QUERY_STRING
                 appmoddata,     % (deprecated - use pathinfo instead) the remainder
                                 % of the path leading up to the query
                 docroot,        % Physical base location of data for this request
                 docroot_mount,  % virtual directory e.g /myapp/ that the docroot
                                 %  refers to.
                 fullpath,       % full deep path to yaws file
                 cont,           % Continuation for chunked multipart uploads
                 state,          % State for use by users of the out/1 callback
                 pid,            % pid of the yaws worker process
                 opaque,         % useful to pass static data
                 appmod_prepath, % (deprecated - use prepath instead) path in front
                                 %  of: <appmod><appmoddata>
                 prepath,        % Path prior to 'dynamic' segment of URI.
                                 %  ie http://some.host/<prepath>/<script-point>/d/e
                                 % where <script-point> is an appmod mount point,
                                 % or .yaws,.php,.cgi,.fcgi etc script file.
                 pathinfo,       % Set to '/d/e' when calling c.yaws for the request
                                 % http://some.host/a/b/c.yaws/d/e
                                 %  equiv of cgi PATH_INFO
                 appmod_name     % name of the appmod handling a request,
                                 % or undefined if not applicable
                }).

       The headers argument is also a record:

       -record(headers, {
                 connection,
                 accept,
                 host,
                 if_modified_since,
                 if_match,
                 if_none_match,
                 if_range,
                 if_unmodified_since,
                 range,
                 referer,
                 user_agent,
                 accept_ranges,
                 cookie = [],
                 keep_alive,
                 location,
                 content_length,
                 content_type,
                 content_encoding,
                 authorization,
                 transfer_encoding,
                 x_forwarded_for,
                 other = []   % misc other headers
                }).

       The out/1 function can use the Arg to generate any content it likes. We have the following  functions  to
       aid that generation.

API

       ssi(DocRoot, ListOfFiles)
              Server  side  include.  Just include the files as is in the document. The files will not be parsed
              and searched for <erl> tags.

       pre_ssi_files(DocRoot, ListOfFiles) ->
              Server side include of pre-indented code.  The data in Files will be included but contained  in  a
              <pre> tag. The data will be htmlized.

       pre_ssi_string(String)
              Include htmlized content from String.

       f(Fmt, Args)
              The  equivalent  of  io_lib:format/2.  This function is automatically -included in all erlang code
              which is a part of a yaws page.

       htmlize(Binary | List | Char)
              Htmlize an IO list object.

       set_cookie(Name, Value, Options])
              Sets a cookie to the browser. Options are:

              {expires, UtcTime}  - Cookie expiration time, where UtcTime is
                                    a tuple returned by calendar:universal_time/0.
              {max_age, Age}      - Defines the lifetime of the cookie, in seconds,
                                    where age is an integer >= 0.
              {path, Path}        - Path is a string that specifies the subset of URLs to
                                    which this cookie applies.
              {domain, Domain}    - Domain is a string that specifies the domain for which
                                    the cookie is valid.
              {same_site, Policy} - Policy is one of the atoms lax, none or strict.
              {comment, Comment}  - Comment is a string that doccuments the server's
                                    intended use of the cookie.
              secure              - Directs the user agent to use only secure means to
                                    contact the origin server whenever it sends back this
                                    cookie.
              http_only           - Restricts cookie access from other non-HTTP APIs.

       setcookie(Name, Value, [Path, [ Expire, [Domain , [Secure]]]])
              Sets a cookie to the browser. This function is deprecated by set_cookie/3.

       find_cookie_val(Cookie, Header)
              This function can be used to search for a cookie that was previously  set  by  setcookie/2-6.  For
              example if we set a cookie as yaws_api:setcookie("sid",SomeRandomSid), then on subsequent requests
              from the browser we can call: find_cookie("sid",(Arg#arg.headers)#headers.cookie)

              The function returns [] if no cookie was found, otherwise the  actual  cookie  is  returned  as  a
              string.

       parse_set_cookie(Str)
              This  function  parses  the  value of a Set-Cookie header, following the RFC6265. Because old RFCs
              (2109 and 2965) are still used, it is backward compatible. So this function returns a #setcookie{}
              record  when  only one cookie is found. If multiple cookies are set in a single Set-Cookie header,
              it returns a list of #setcookie{} records. If no cookie was found or  if  an  error  occurred,  it
              returns [].

              #setcookie{} record is defined in yaws_api.hrl:

              -record(setcookie, {key,
                                  value,
                                  quoted = false,
                                  domain,
                                  max_age,
                                  expires,
                                  path,
                                  secure = false,
                                  http_only = false,
                                  extensions = []}).

       parse_cookie(Str)
              This  function  parses  the  value  of  Cookie header, following the RFC6265. It returns a list of
              #cookie{} records. If no cookie was found or if an error occurred, it returns [].

              #cookie{} record is defined in yaws_api.hrl:

              -record(cookie, {key,
                               value,
                               quoted = false}).

       format_set_cookie(SetCookie)
              Build a cookie string from a #setcookie{} record like returned by parse_set_cookie/1.

       format_cookie(Cookie | [Cookie])
              Build a cookie  string  from  a  #cookie{}  record  (or  a  list  or  records)  like  returned  by
              parse_cookie/1.

       redirect(Url)
              This  function  generates a redirect to the browser.  It will clear any previously set headers. So
              to generate a redirect and set a cookie, we need to set the cookie after the redirect as in:
              out(Arg) ->
                ... do some stuff

                Ret = [{redirect, "http://www.somewhere.com"},
                        setcookie("sid", Random)
                      ].

       redirect_self(Arg)
              If we want to issue a redirect to  ourselves,  this  function  is  useful.  It  returns  a  record
              #redir_self{} defined in yaws_api.hrl. The record contains fields to construct a URL to ourselves.

              -record(redir_self, {
                        host,        % string() - our own host
                        scheme,      % http | https
                        scheme_str,  % "https://"  | "http://"
                        port,        % integer()  - our own port
                        port_str     % "" | ":<int>" - the optional port part
                                     %                 to append to the url
                       }).

       get_line(String)
              This function is convenient when getting \r\n terminated lines from a stream of data. It returns:

              {line, Line, Tail} or {lastline, Line, Tail}

              The function handles multilines as defined in e.g. SMTP or HTTP

       mime_type(Scope, FileName)
              Returns the MIME type as defined by the extension of FileName. Scope can have following values:

                   global - returns the result obtained from the global context.
                   #sconf{}  |  {ServerName,  Port}  -  returns  the  result  obtained from the virtual server's
                   context. If no MIME type is found in this scope, it falls back on the global one.

       mime_type(FileName)
              Tries to determine the right Scope before calling mime_type/2.

       stream_chunk_deliver(YawsPid, Data)
              When a yaws function needs to deliver chunks of data which it  gets  from  a  process.  The  other
              process  can  call this function to deliver these chunks. It requires the out/1 function to return
              the value {streamcontent, MimeType, FirstChunk} to work.  YawsPid is the process identifier of the
              yaws  process  delivering  the original .yaws file. That is self() in the yaws code.  The Pid must
              typically be passed (somehow) to the producer of the stream.

       stream_chunk_deliver_blocking(YawsPid, Data)
              A synchronous version of the above function. This synchronous version must always be used when the
              producer  of  the stream is faster than the consumer. This is usually the case since the client is
              the WWW browser.

       stream_chunk_end(YawsPid)
              When the process discussed above is done delivering data, it must call this function  to  let  the
              yaws content delivering process finish up the HTTP transaction.

       stream_process_deliver(Socket, IoList)
              Yaws  allows  application  processes to deliver data directly to the client. The application tells
              yaws about such a process by returning {streamcontent_from_pid,  MimeType,  Pid}  from  its  out/1
              function.  In  this  case,  Pid  uses the stream_process_deliver/2 function to deliver data to the
              client. The application gets Socket from Arg#arg.clisock, and IoList is the data to be sent to the
              client.

       stream_process_deliver_chunk(Socket, IoList)
              Same  as  above  but  delivers  IoList using HTTP chunked transfer format. IoList must have a size
              greater than zero. The application process delivering the data will have had  to  have  make  sure
              that  the  HTTP  headers  of  the  response  indicate chunked transfer mode, either by ensuring no
              Content-Length header is set or by specifically setting the Transfer-Encoding header to chunked.

       stream_process_deliver_final_chunk(Socket, IoList)
              If the application process delivering data to the client uses chunked transfer mode, it must  call
              this  to  deliver the final chunk of the transfer. This tells yaws to create a special final chunk
              in the format required by the HTTP specification (RFC 2616). IoList may be empty, but if its  size
              is greater than zero, that data will be sent as a separate chunk before the final chunk.

       stream_process_end(Socket, YawsPid)
              Application  processes  delivering data directly to clients must call this function to inform yaws
              that they've finished using Socket. The YawsPid argument will have  been  passed  to  the  process
              earlier  when yaws sent it a message telling it to proceed with data delivery. Yaws expects Socket
              to be open.

       stream_process_end(closed, YawsPid)
              Same as the previous function but the application calls this if it closes  the  client  socket  as
              part  of  its  data  delivery process. This allows yaws to continue without assuming the socket is
              still open and encountering errors due to that assumption. The YawsPid  argument  will  have  been
              passed  to  the application process earlier when yaws sent it a message telling it to proceed with
              data delivery.

       parse_query(Arg)
              This function will parse the query part of the URL. It will return a {Key, Value} list.

       queryvar(Arg, VarName)
              This function is automatically included from yaws_api in all .yaws pages. It is used to search for
              a  variable  in the querypart of the url. Returns {ok, Val} or undefined. If a variable is defined
              multiple times, the function may also return {Val1, Val2...}.

       parse_post(Arg)
              If the browser has set the Content-Type header to the  value  "application/x-www-form-urlencoded",
              this function will parse the request's body. It will return a {Key, Value} list.

       postvar(Arg, VarName)
              This function is automatically included from yaws_api in all .yaws pages. It is used to search for
              a variable in the request's body sent by the client. Returns {ok, Val} or undefined. If a variable
              is defined multiple times, the function may also return {Val1, Val2...}.

       getvar(Arg, VarName)
              This function is used to search a variable in the query part of the URL and in the request's body.
              it invokes queryvar/2 and postvar/2 and merges the results.

       parse_multipart_post(Arg)
              If the browser has set the Content-Type header to the value "multipart/form-data",  which  is  the
              case when the browser wants to upload a file to the server the following happens:

              If the function returns {result, Res} no more data will come from the browser.

              If the function returns {cont, Cont, Res} the browser will supply more data. (The file was too big
              to come in one read)

              This indicates that there is more data to come and the out/1  function  should  return  {get_more,
              Cont,  User_state}  where User_state might usefully be a File Descriptor.  The Res value is a list
              of either: {head, {Name, Headers}} | {part_body, Binary} | {body, Binary}

              The function returns {error, Reason} when an error occurred during the parsing.

              Example usage could be:
               <erl>

               out(A) ->
                      case yaws_api:parse_multipart_post(A) of
                           {cont, Cont, Res} ->
                                  St = handle_res(A, Res),
                                  {get_more, Cont, St};
                           {result, Res} ->
                                  handle_res(A, Res),
                                  {html, f("<pre>Done </pre>",[])};
                           {error, Reason} ->
                                  {html, f("An error occured: ~p", [Reason])}
                      end.

               handle_res(A, [{head, {Name, _Hdrs}}|T]) ->
                    io:format("head:~p~n",[Name]),
                    handle_res(A, T);
               handle_res(A, [{part_body, Data}|T]) ->
                    io:format("part_body:~p~n",[Data]),
                    handle_res(A, T);
               handle_res(A, [{body, Data}|T]) ->
                    io:format("body:~p~n",[Data]),
                    handle_res(A, T);
               handle_res(A, []) ->
                    io:format("End_res~n").

               </erl>

       new_cookie_session(Opaque)
              Create a new cookie-based  session.  Yaws  will  either  generate  the  cookie  itself  or,  if  a
              ysession_cookiegen module is configured, call new_cookie() on that module to get a new cookie. The
              new cookie is returned from this function. The Opaque argument will typically  contain  user  data
              such as user name and password

       new_cookie_session(Opaque, TTL)
              As  above,  but  allows  to set a session specific time-out value, overriding the system specified
              time-out value.

       new_cookie_session(Opaque, TTL, CleanupPid)
              As above, but also sends a message {yaws_session_end, Reason,  Cookie,  Opaque}  to  the  provided
              CleanupPid  where  Reason  can  be  either  of timeout or normal. The Cookie is the HTTP cookie as
              returned by new_session() and Opaque is the user-provided Opaque parameter to new_session().   The
              purpose of the feature is to cleanup resources assigned to the session.

       cookieval_to_opaque(CookieVal)

       print_cookie_sessions()

       replace_cookie_session(Cookie, NewOpaque)

       delete_cookie_session(Cookie)

       setconf(Gconf, Groups)
              This  function  is  intended  for  embedded  mode  in  yaws.  It  makes it possible to load a yaws
              configuration from another data source than /etc/yaws.conf,  such  as  a  database.   If  yaws  is
              started   with   the  environment  {embedded,  true},  yaws  will  start  with  an  empty  default
              configuration, and wait for some other program to execute a setconf/2  The  Gconf  is  a  #gconf{}
              record  and  the  Group variable is a list of lists of #sconf{} records. Each sublist must contain
              #sconf{} records with the same IP/Port listen address.  To  create  a  suitable  initial  #gconf{}
              record  see  the  code  in  yaws_config:make_default_gconf/2. Especially the yaws_dir parameter is
              important to get right.

       url_decode(Str)
              Decode url-encoded string. A URL encoded string is a string where all alfa numeric characters  and
              the  the  character _ are preserved and all other characters are encode as "%XY" where X and Y are
              the hex values of the least respective most significant 4 bits in the 8 bit character.

       url_encode(URL)
              URL-encodes a string or binary, and returns a string. All URLs  in  HTML  documents  must  be  URL
              encoded.

       get_sslsocket(Socket)
              Returns  a  socket  for  SSL  sockets  or  the  atom  undefined  for  non-SSL  sockets. Useful for
              applications that have to deal with both SSL and non-SSL sockets.

       get_listen_port(Sconf)
              Return the actual port number used by the listen socket of the virtual  server  indicated  by  the
              function  argument, an #sconf{} record instance. If successful, returns the requested port number,
              or returns {error, not_found} if the function argument does not match any  known  virtual  server.
              This  function  is useful for retrieving the actual port number when, e.g. for testing purposes, a
              virtual server is configured to use port 0, which will cause it to have an ephemeral port assigned
              by the operating system.

       reformat_header(H)
              Returns  a list of reformatted header values from a #headers{} record. The return list is suitable
              for retransmit.

       reformat_header(H, FormatFun)
              Returns a list of reformatted header values from a #headers{} record, with  each  element  of  the
              list  formatted  via  a call to FormatFun. This enables converting #headers{} records into various
              lists of headers and their values. Note that sometimes the Set-Cookie header or other headers will
              contain  a tuple value of the form {multi, ValueList}. (The {multi, ValueList} construct typically
              results from calls to merge_header/2 or merge_header/3, where multiple values are set in  separate
              calls  for  the  same  header; see merge_header/2 below for details.)  Formatting functions should
              therefore be capable of handling a {multi, ValueList} tuple. They should handle it  by  formatting
              each  member  of ValueList as a separate header string, storing all such header strings in a list,
              and returning that list in a {multi, HdrList} tuple. Note that  in  versions  of  Yaws  2.0.6  and
              older,  formatting functions returned such header lists directly, which implies that sometimes the
              return values of reformat_header/1 and reformat_header/2 can be a multi-level list if  constructed
              by one of these older formatting functions.

       reformat_header(H, FormatFun, Options)
              Same  as  reformat_header/2  except  that  header  and  value  data  passed to FormatFun are first
              converted to the data format specified in Options. Options is expected to be either an atom  or  a
              list  of  atoms,  either string or binary. If the list contains multiple items, options earlier in
              the list override those later in the list,  so  for  example  [string,  binary]  is  the  same  as
              [string].  If  the  first item in Options specifies anything other than string or binary, data are
              passed to FormatFun without conversion.

       set_header(Headers, {Header, Value})
              Sets header Header with value Value in the #headers{} record Headers, and returns a new #headers{}
              record.   Using   the   atom   undefined  for  Value  effectively  deletes  the  header,  same  as
              delete_header/2.

       set_header(Headers, Header, Value)
              Same as set_header/2 above, except Header and Value are not passed in a tuple.

       merge_header(Headers, {Header, Value})
              Merges value Value for header Header with any existing value for that  header  in  the  #headers{}
              record  Headers,  and  returns  a new #headers{} record. Using the atom undefined for Value simply
              returns Headers. Otherwise, Value is merged with any existing value already present in the Headers
              record for header Header, comma-separated from that existing value. If no such value exists in the
              Headers record, the effect is the same as set_header/2.  Note  that  for  the  Set-Cookie  header,
              values  are  not  comma-separated  but are instead collected into a tuple {multi, ValueList} where
              ValueList is the collection of Set-Cookie values. This implies that any formatting fun  passed  to
              reformat_header/2 must be prepared to handle such tuples.

       merge_header(Headers, Header, Value)
              Same as merge_header/2 above, except Header and Value are not passed in a tuple.

       get_header(Headers, Header)
              Gets  the  value of header Header from the #headers{} record Headers and returns it. If the header
              isn't set, the atom undefined is returned.

       delete_header(Headers, Header)
              Deletes any value set for header Header in the  #headers{}  record  Headers,  and  returns  a  new
              #headers{} record.

       request_url(ARG)
              Return  the  url  as  requested  by  the  client.  Return  value  is a #url{} record as defined in
              yaws_api.hrl

       parse_url(Str)
              Parse URL in a string, returns a #url record

       format_url(UrlRecord)
              Takes a #url record a formats the Url as a string

       call_cgi(Arg, Scriptfilename)
              Calls an executable CGI script, given by its full path.  Used to make  `.yaws'  wrappers  for  CGI
              programs.  This function usually returns streamcontent.

       call_cgi(Arg, Exefilename, Scriptfilename)
              Like before, but calls Exefilename to handle the script.  The file name of the script is handed to
              the executable via a CGI meta variable.

       call_fcgi_responder(Arg)
              Calls a FastCGI responder.  The address and port of the FastCGI application server are taken  from
              the  server  configuration (see yaws.conf).  Used to make `.yaws' wrappers for FastCGI responders.
              Returns the same return values as out/1 (see below).

       call_fcgi_responder(Arg, Options)
              Same as above, but Options overrides the defaults from the server configuration:

              Options = [Option]
              Option -- one of the following:

              {app_server_host, string() |  ip_address()}  The  hostname  or  the  IP  address  of  the  FastCGI
              application server.

              {app_server_port, 0..65535} The TCP port number of the FastCGI application server.

              {path_info, string()} Override default pathinfo in Arg#arg.pathinfo.

              {extra_env,  ExtraEnv} Extra environment variables to be passed to the FastCGI application server,
              as a list of name-value pairs.

              ExtraEnv = [Var]
              Var = {Name, Value}
              Name = string() | binary()
              Value = string() | binary()

              {trace_protocol, boolean()} Enable or disable tracing of FastCGI protocol  messages  as  info  log
              messages.

              {log_app_error,  boolean()}  Enable  or  disable  logging of application error messages: output to
              stderr and non-zero exit value.

       call_fcgi_authorizer(Arg) -> {allowed, Out} | {denied, Out}
              Calls a FastCGI authorizer.  The address and port of the FastCGI application server are taken from
              the  server configuration (see yaws.conf).  Used to make `.yaws' wrappers for FastCGI authorizers.
              Variables contains the values of the variables returned by the FastCGI application server  in  the
              "Variable-XXX: YYY" headers.

              If  access  is  denied,  Out  contains  the  complete response returned by the FastCGI application
              server. This response is typically returned as-is to the HTTP client.

              If access is allowed, Out contains the response returned by the FastCGI application  server  minus
              the  body  (i.e.  minus  the  content) which should be ignored per the FastCGI specification. This
              response is typically not returned to the HTTP client. The calling application module may wish  to
              inspect the response, for example by extracting variables (see fcgi_extract_variables below) or by
              inspecting the headers returned by the FastCGI application server.

              Out -- See return values for out/1 below

       call_fcgi_authorizer(Arg, Options) -> {allowed, Out} | {denied, Out}
              Same  as  above,  but  Options  overrides  the  defaults  from  the  server   configuration.   See
              call_fcgi_responder/2 above for a description of Options.

       fcgi_extract_variables(Out) -> [{Name, Value}]
              Extracts  the  environment  variables from a FastCGI authorizer response by looking for headers of
              the form "Variable-Name: Value".

              Name = string() -- The name of the variable (the "Variable-" prefix
              has already been removed).
              Value = string() -- The value of the variable.

       dir_listing(Arg)
              Perform a directory listing. Can be used in special directories when we don't want to turn on  dir
              listings for the entire server.  Always returns ok.

RETURN VALUES from out/1

       The out/1 function can return different values to control the behavior of the server.

       {html, DeepList}
              This assumes that DeepList is formatted HTML code.  The code will be inserted in the page.

       {ehtml|exhtml, Term}
              This  will  transform  the  erlang  term  Term  into  a stream of HTML content. The exhtml variant
              transforms into strict XHTML code. The basic syntax of Term is

              EHTML = [EHTML] | {Tag, Attrs, Body} | {Tag, Attrs} | {Tag} |
                      {Module, Fun, [Args]} | fun/0 |
                      binary() | character()
              Tag   = atom()
              Attrs = [{Key, Value}]
              Key   = atom()
              Value = string() | binary() | atom() | integer() | float() |
                      {Module, Fun, [Args]} | fun/0
              Body  = EHTML

              For example, {p, [], "Howdy"} expands into "<p>Howdy</p>" and

              {form, [{action, "a.yaws"}],
                 {input, [{type,text}]}}

              expands into

              <form action="a.yaws"
                <input type="text">
              </form>

              It may be more convenient to generate erlang tuples than plain html code.

       {content, MimeType, Content}
              This function will make the web server generate different content than HTML. This return value  is
              only allowed in a yaws file which has only one <erl> </erl> part and no html parts at all.

       {streamcontent, MimeType, FirstChunk}
              This return value plays the same role as the content return value above.

              However  it makes it possible to stream data to the client if the yaws code doesn't have access to
              all the data in one go. (Typically if a file is very large  or  if  data  arrives  from  back  end
              servers on the network.

       {streamcontent_with_timeout, MimeType, FirstChunk, Timeout}
              Similar  to  above,  but  with  an  explicit  timeout.  The default timeout is 30 secs. I.e if the
              application fails to deliver data to the Yaws process, the streaming will stop. This is often  not
              the desired behaviour in Comet/Ajax applications.  It's possible to provide 'infinity' as timeout.

       {streamcontent_from_pid, MimeType, Pid}
              This return value is similar to the streamcontent return value above.

              However  it makes it possible to stream data to the client directly from an application process to
              the socket. This approach  can  be  useful  for  applications  that  employ  long-polling  (Comet)
              techniques,  for  example,  and  for  applications  wanting  to avoid buffering data or avoid HTTP
              chunked mode transfer for streamed data.

       {streamcontent_with_size, Sz, MimeType, FirstChunk}
              This return value is similar to the streamcontent return value above.

              However it makes it possible to stream data to the client by setting the  content  length  of  the
              response.  As the opposite of other ways to stream data, in this case, the response is not chunked
              encoded.

       {header, H}
              Accumulates a HTTP header. The trailing CRNL which is supposed to end all HTTP headers must NOT be
              added. It is added by the server.  The following list of headers are given special treatment.

              {connection, What}

              This  sets  the  Connection:  header. If What is the special value "close", the connection will be
              closed once the yaws page is delivered to the client.

              {server, What}

              Sets the Server: header. By setting this  header,  the  server's  signature  will  be  dynamically
              overloaded.

              {location, Url}

              Sets the Location: header. This header is typically combined with the {status, 302} return value.

              {cache_control, What}

              Sets the Cache-Control: header.

              {expires, What}

              Sets the Expires: header.

              {date, What}

              Sets the Date: header.

              {allow, What}

              Sets the Allow: header.

              {last_modified, What}

              Sets the Last-Modified: header.

              {etag, What}

              Sets the Etag: header.

              {set_cookie, Cookie}

              Prepends a Set-Cookie: header to the list of previously set Set-Cookie: headers.

              {content_range, What}

              Sets the Content-Range: header.

              {content_type, MimeType}

              Sets the Content-Type: header.

              {content_encoding, What}

              Sets  the  Content-Encoding:  header.  If this header is defined, no deflate is performed by Yaws,
              allowing you to compress data yourself if you wish to do so.

              {content_length, Len}

              Normally yaws will ship Yaws pages using Transfer-Encoding: chunked. This is because we  generally
              can't  know  how  long  a yaws page will be. If we for some reason want to force a Content-Length:
              header (and we actually do know the length of the content, we can force Yaws to not ship the  page
              chunked.

              {transfer_encoding, What}

              Sets the Transfer-Encoding: header.

              {www_authenticate, What}

              Sets the WWW-Authenticate: header.

              {vary, What}

              Sets the Vary: header.

              {accept_ranges, What}

              Sets the Accept-Ranges: header.

              All other headers must be added using the normal HTTP syntax.  Example:

              {header, {"My-X-Header", "gadong"}} or {header, "My-X-Header: gadong"}

       {header, {HeaderName, erase}}
              Clears the header named HeaderName from the accumulated headers.

       {allheaders, HeaderList}
              Will clear all previously accumulated headers and replace them.

       {status, Code}
              Will set another HTTP status code than 200.

       break  Will stop processing of any consecutive chunks of erl or html code in the yaws file.

       ok     Do nothing.

       flush  Flush remaining data sent by the client.

       {redirect, Url}
              Erase all previous headers and accumulate a single Location header. Set the status code.

       {redirect_local, Path}
              Does a redirect to the same Scheme://Host:Port/Path as we currently are executing in.

       {get_more, Cont, State}
              When  we  are  receiving  large POSTs we can return this value and be invoked again when more Data
              arrives.

       {page, Page}

              Make Yaws returns a different page than the one being requested. Page is a Request-URI, so it must
              be url-encoded and can contain a query-string.

       {page, {Options, Page}}
              Like the above, but supplying an additional deep list of options. Supported option types are:

              {status, C} - Set the HTTP response status code C for page Page.

              {header, H} - Accumulate the HTTP header H for page Page.

              {disable_cache, Bool} - if set to true, disable the cache of Page for this call.

       {websocket, CallbackModule, Options}
              Tell  Yaws to use CallbackModule as a WebSocket Protocol handler for traffic on the client socket.
              See the Yaws websocket documentation for more details.

       {ssi, File, Delimiter, Bindings}
              Server side include File and macro expansion in File.  Each occurrence of  a  string,  say  "xyz",
              inside File that's within a Delimiter pair is replaced with the corresponding value in Bindings.

              Example: Delimiter = %%

              File contains the string .... %%xyz%%  .....

              Bindings contain the tuple {"xyz", "Dingbat"}

              The  occurrence  of  %%xyz%%  in  File will be replaced with "Dingbat" in the Server side included
              output.

              The {ssi, File, Delimiter, Bindings} statement can also occur within a deep ehtml structure.

              The special directive strip_undefined can be specified in the Bindings list, just as  it  can  for
              the  {bindings, ....} directive, but it's ignored because treating undefined variables as empty is
              the default for ssi bindings.

       {bindings, [{Key1, Value2}, {Key2, Value2} .....]}
              Establish variable bindings that can be used in the page.

              All bindings can then be used in the rest of yaws code (in HTML source and within erl  tags).   In
              HTML  source  %%Key%%  is expanded to Value and within erl tags yaws_api:binding(Key) (which calls
              error if no such binding exists) or yaws_api:binding_find(Key) (which returns undefined if no such
              binding  exists)  can  be  used  to extract Value, and yaws_api:binding_exists(Key) can be used to
              check for the existence of a binding.

              If a page happens to contains text that looks like a  binding,  e.g.   %%SomeText%%,  but  no  key
              SomeText  is  supplied,  then  by  default  the  original  text is left as is.  If you prefer that
              anything parsed as a binding gets stripped out of a page whenever the bindings directive does  not
              specify its key, include the special directive strip_undefined in the bindings list:

              {bindings, [{Key1, Value1}, strip_undefined]}

       {yssi, YawsFile}
              Include a yaws file. Compile it and expand as if it had occured inline.

       #arg{} Return  an  instance of an #arg{} record. This can be useful when used as part of a [ListOfValues]
              return value, so that any subsequent elements in the return list that require an  #arg{}  get  the
              returned  instance  rather  than  the original. For example, an out/1 function might set the state
              field of an #arg{}, then return both it and {yssi, YawsFile} in a list, in which  case  Yaws  will
              pass the returned #arg{}, rather than the original instance, to the yaws file out/1 function.

       [ListOfValues]
              It  is  possible  to  return  a  deep  list  of the above defined return values. Any occurrence of
              streamcontent,   streamcontent_with_timeout,   streamcontent_with_size,    streamcontent_from_pid,
              get_more, page or break in this list is legal only if it is the last position of the list. If not,
              remaining values in the list are ignored.

AUTHOR

       Written by Claes Wikstrom

SEE ALSO

       yaws.conf(5) erl(1)

                                                                                                     YAWS_API(5)