<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
<meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: cowboy_req(3)</title>
<link href='https://fonts.googleapis.com/css?family=Open+Sans:400,700,400italic' rel='stylesheet' type='text/css'>
<link href="/css/bootstrap.min.css" rel="stylesheet">
<link href="/css/99s.css" rel="stylesheet">
<link rel="shortcut icon" href="/img/ico/favicon.ico">
<link rel="apple-touch-icon-precomposed" sizes="114x114" href="/img/ico/apple-touch-icon-114.png">
<link rel="apple-touch-icon-precomposed" sizes="72x72" href="/img/ico/apple-touch-icon-72.png">
<link rel="apple-touch-icon-precomposed" href="/img/ico/apple-touch-icon-57.png">
</head>
<body class="">
<header id="page-head">
<div id="topbar" class="container">
<div class="row">
<div class="span2">
<h1 id="logo"><a href="/" title="99s">99s</a></h1>
</div>
<div class="span10">
<div id="side-header">
<nav>
<ul>
<li><a title="Hear my thoughts" href="/articles">Articles</a></li>
<li><a title="Watch my talks" href="/talks">Talks</a></li>
<li class="active"><a title="Read the docs" href="/docs">Documentation</a></li>
<li><a title="Request my services" href="/services">Consulting & Training</a></li>
</ul>
</nav>
<ul id="social">
<li>
<a href="https://github.com/ninenines" title="Check my Github repositories"><img src="/img/ico_github.png" data-hover="/img/ico_github_alt.png" alt="Github"></a>
</li>
<li>
<a title="Keep in touch!" href="http://twitter.com/lhoguin"><img src="/img/ico_microblog.png" data-hover="/img/ico_microblog_alt.png"></a>
</li>
<li>
<a title="Contact me" href="mailto:[email protected]"><img src="/img/ico_mail.png" data-hover="/img/ico_mail_alt.png"></a>
</li>
</ul>
</div>
</div>
</div>
</div>
</header>
<div id="contents" class="two_col">
<div class="container">
<div class="row">
<div id="docs" class="span9 maincol">
<h1 class="lined-header"><span>cowboy_req(3)</span></h1>
<div class="sect1">
<h2 id="_name">Name</h2>
<div class="sectionbody">
<div class="paragraph"><p>cowboy_req - HTTP request and response</p></div>
</div>
</div>
<div class="sect1">
<h2 id="_description">Description</h2>
<div class="sectionbody">
<div class="paragraph"><p>The module <code>cowboy_req</code> provides functions to access, manipulate
and respond to requests.</p></div>
<div class="paragraph"><p>There are four types of functions in this module. They can be
differentiated by their name and their return type:</p></div>
<div class="tableblock">
<table rules="all"
width="100%"
frame="border"
cellspacing="0" cellpadding="4">
<col width="33%" />
<col width="33%" />
<col width="33%" />
<thead>
<tr>
<th align="left" valign="top"> Type </th>
<th align="left" valign="top"> Name pattern </th>
<th align="left" valign="top"> Return type</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left" valign="top"><p class="table">access</p></td>
<td align="left" valign="top"><p class="table">no verb, parse_*, match_*</p></td>
<td align="left" valign="top"><p class="table"><code>Value</code></p></td>
</tr>
<tr>
<td align="left" valign="top"><p class="table">question</p></td>
<td align="left" valign="top"><p class="table">has_*</p></td>
<td align="left" valign="top"><p class="table"><code>boolean()</code></p></td>
</tr>
<tr>
<td align="left" valign="top"><p class="table">modification</p></td>
<td align="left" valign="top"><p class="table">set_*</p></td>
<td align="left" valign="top"><p class="table"><code>Req</code></p></td>
</tr>
<tr>
<td align="left" valign="top"><p class="table">action</p></td>
<td align="left" valign="top"><p class="table">any other verb</p></td>
<td align="left" valign="top"><p class="table"><code>ok | {Result, Value, Req}</code></p></td>
</tr>
</tbody>
</table>
</div>
<div class="paragraph"><p>Any <code>Req</code> returned must be used in place of the one passed as
argument. Functions that perform an action in particular write
state in the Req object to make sure you are using the function
correctly. For example, it’s only possible to send one response,
and to read the body once.</p></div>
</div>
</div>
<div class="sect1">
<h2 id="_exports">Exports</h2>
<div class="sectionbody">
<div class="paragraph"><p>Raw request:</p></div>
<div class="ulist"><ul>
<li>
<p>
<a href="../cowboy_req.method">cowboy_req:method(3)</a> - HTTP method
</p>
</li>
<li>
<p>
<a href="../cowboy_req.version">cowboy_req:version(3)</a> - HTTP version
</p>
</li>
<li>
<p>
<a href="../cowboy_req.scheme">cowboy_req:scheme(3)</a> - URI scheme
</p>
</li>
<li>
<p>
<a href="../cowboy_req.host">cowboy_req:host(3)</a> - URI host name
</p>
</li>
<li>
<p>
<a href="../cowboy_req.port">cowboy_req:port(3)</a> - URI port number
</p>
</li>
<li>
<p>
<a href="../cowboy_req.path">cowboy_req:path(3)</a> - URI path
</p>
</li>
<li>
<p>
<a href="../cowboy_req.qs">cowboy_req:qs(3)</a> - URI query string
</p>
</li>
<li>
<p>
<a href="../cowboy_req.uri">cowboy_req:uri(3)</a> - Reconstructed URI
</p>
</li>
<li>
<p>
<a href="../cowboy_req.header">cowboy_req:header(3)</a> - HTTP header
</p>
</li>
<li>
<p>
<a href="../cowboy_req.headers">cowboy_req:headers(3)</a> - HTTP headers
</p>
</li>
<li>
<p>
<a href="../cowboy_req.peer">cowboy_req:peer(3)</a> - Peer address and port
</p>
</li>
</ul></div>
<div class="paragraph"><p>Processed request:</p></div>
<div class="ulist"><ul>
<li>
<p>
<a href="../cowboy_req.parse_qs">cowboy_req:parse_qs(3)</a> - Parse the query string
</p>
</li>
<li>
<p>
<a href="../cowboy_req.match_qs">cowboy_req:match_qs(3)</a> - Match the query string against constraints
</p>
</li>
<li>
<p>
<a href="../cowboy_req.parse_header">cowboy_req:parse_header(3)</a> - Parse the given HTTP header
</p>
</li>
<li>
<p>
<a href="../cowboy_req.parse_cookies">cowboy_req:parse_cookies(3)</a> - Parse cookie headers
</p>
</li>
<li>
<p>
<a href="../cowboy_req.match_cookies">cowboy_req:match_cookies(3)</a> - Match cookies against constraints
</p>
</li>
<li>
<p>
<a href="../cowboy_req.binding">cowboy_req:binding(3)</a> - Access a value bound from the route
</p>
</li>
<li>
<p>
<a href="../cowboy_req.bindings">cowboy_req:bindings(3)</a> - Access all values bound from the route
</p>
</li>
<li>
<p>
<a href="../cowboy_req.host_info">cowboy_req:host_info(3)</a> - Access the route’s heading host segments
</p>
</li>
<li>
<p>
<a href="../cowboy_req.path_info">cowboy_req:path_info(3)</a> - Access the route’s trailing path segments
</p>
</li>
</ul></div>
<div class="paragraph"><p>Request body:</p></div>
<div class="ulist"><ul>
<li>
<p>
<a href="../cowboy_req.has_body">cowboy_req:has_body(3)</a> - Is there a request body?
</p>
</li>
<li>
<p>
<a href="../cowboy_req.body_length">cowboy_req:body_length(3)</a> - Body length
</p>
</li>
<li>
<p>
<a href="../cowboy_req.read_body">cowboy_req:read_body(3)</a> - Read the request body
</p>
</li>
<li>
<p>
<a href="../cowboy_req.read_urlencoded_body">cowboy_req:read_urlencoded_body(3)</a> - Read and parse a urlencoded request body
</p>
</li>
<li>
<p>
<a href="../cowboy_req.read_part">cowboy_req:read_part(3)</a> - Read the next multipart headers
</p>
</li>
<li>
<p>
<a href="../cowboy_req.read_part_body">cowboy_req:read_part_body(3)</a> - Read the current part’s body
</p>
</li>
</ul></div>
<div class="paragraph"><p>Response:</p></div>
<div class="ulist"><ul>
<li>
<p>
<a href="../cowboy_req.set_resp_cookie">cowboy_req:set_resp_cookie(3)</a> - Set a cookie
</p>
</li>
<li>
<p>
<a href="../cowboy_req.set_resp_header">cowboy_req:set_resp_header(3)</a> - Set a response header
</p>
</li>
<li>
<p>
<a href="../cowboy_req.has_resp_header">cowboy_req:has_resp_header(3)</a> - Is the given response header set?
</p>
</li>
<li>
<p>
<a href="../cowboy_req.delete_resp_header">cowboy_req:delete_resp_header(3)</a> - Delete a response header
</p>
</li>
<li>
<p>
<a href="../cowboy_req.set_resp_body">cowboy_req:set_resp_body(3)</a> - Set the response body
</p>
</li>
<li>
<p>
<a href="../cowboy_req.has_resp_body">cowboy_req:has_resp_body(3)</a> - Is there a response body?
</p>
</li>
<li>
<p>
<a href="../cowboy_req.reply">cowboy_req:reply(3)</a> - Send the response
</p>
</li>
<li>
<p>
<a href="../cowboy_req.stream_reply">cowboy_req:stream_reply(3)</a> - Send the response headers
</p>
</li>
<li>
<p>
<a href="../cowboy_req.stream_body">cowboy_req:stream_body(3)</a> - Stream the response body
</p>
</li>
<li>
<p>
<a href="../cowboy_req.push">cowboy_req:push(3)</a> - Push a resource to the client
</p>
</li>
</ul></div>
</div>
</div>
<div class="sect1">
<h2 id="_types">Types</h2>
<div class="sectionbody">
<div class="sect2">
<h3 id="_push_opts">push_opts()</h3>
<div class="listingblock">
<div class="content"><!-- Generator: GNU source-highlight 3.1.8
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite -->
<pre><tt><span style="font-weight: bold"><span style="color: #000000">push_opts</span></span>() <span style="color: #990000">::</span> #{
<span style="color: #0000FF">method</span> <span style="color: #990000">=></span> <span style="font-weight: bold"><span style="color: #000080">binary</span></span>(), <span style="font-style: italic"><span style="color: #9A1900">%% case sensitive</span></span>
<span style="color: #0000FF">scheme</span> <span style="color: #990000">=></span> <span style="font-weight: bold"><span style="color: #000080">binary</span></span>(), <span style="font-style: italic"><span style="color: #9A1900">%% lowercase; case insensitive</span></span>
<span style="color: #0000FF">host</span> <span style="color: #990000">=></span> <span style="font-weight: bold"><span style="color: #000080">binary</span></span>(), <span style="font-style: italic"><span style="color: #9A1900">%% lowercase; case insensitive</span></span>
<span style="color: #0000FF">port</span> <span style="color: #990000">=></span> <span style="font-weight: bold"><span style="color: #000000">inet:port_number</span></span>(),
<span style="color: #0000FF">qs</span> <span style="color: #990000">=></span> <span style="font-weight: bold"><span style="color: #000080">binary</span></span>() <span style="font-style: italic"><span style="color: #9A1900">%% case sensitive</span></span>
}</tt></pre></div></div>
<div class="paragraph"><p>Push options.</p></div>
<div class="paragraph"><p>By default, Cowboy will use the GET method, an empty query string,
and take the scheme, host and port directly from the current
request’s URI.</p></div>
</div>
<div class="sect2">
<h3 id="_read_body_opts">read_body_opts()</h3>
<div class="listingblock">
<div class="content"><!-- Generator: GNU source-highlight 3.1.8
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite -->
<pre><tt><span style="font-weight: bold"><span style="color: #000000">read_body_opts</span></span>() <span style="color: #990000">::</span> #{
<span style="font-weight: bold"><span style="color: #000080">length</span></span> <span style="color: #990000">=></span> <span style="font-weight: bold"><span style="color: #000000">non_neg_integer</span></span>(),
<span style="color: #0000FF">period</span> <span style="color: #990000">=></span> <span style="font-weight: bold"><span style="color: #000000">non_neg_integer</span></span>(),
<span style="color: #0000FF">timeout</span> <span style="color: #990000">=></span> <span style="font-weight: bold"><span style="color: #000000">timeout</span></span>()
}</tt></pre></div></div>
<div class="paragraph"><p>Body reading options.</p></div>
<div class="paragraph"><p>The defaults are function-specific.</p></div>
</div>
<div class="sect2">
<h3 id="_req">req()</h3>
<div class="listingblock">
<div class="content"><!-- Generator: GNU source-highlight 3.1.8
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite -->
<pre><tt><span style="font-weight: bold"><span style="color: #000000">req</span></span>() <span style="color: #990000">::</span> #{
<span style="color: #FF6600">method</span> <span style="color: #990000">:=</span> <span style="font-weight: bold"><span style="color: #000080">binary</span></span>(), <span style="font-style: italic"><span style="color: #9A1900">%% case sensitive</span></span>
<span style="color: #FF6600">version</span> <span style="color: #990000">:=</span> <span style="font-weight: bold"><span style="color: #000000">cowboy:http_version</span></span>() | <span style="font-weight: bold"><span style="color: #000080">atom</span></span>(),
<span style="color: #FF6600">scheme</span> <span style="color: #990000">:=</span> <span style="font-weight: bold"><span style="color: #000080">binary</span></span>(), <span style="font-style: italic"><span style="color: #9A1900">%% lowercase; case insensitive</span></span>
<span style="color: #FF6600">host</span> <span style="color: #990000">:=</span> <span style="font-weight: bold"><span style="color: #000080">binary</span></span>(), <span style="font-style: italic"><span style="color: #9A1900">%% lowercase; case insensitive</span></span>
<span style="color: #FF6600">port</span> <span style="color: #990000">:=</span> <span style="font-weight: bold"><span style="color: #000000">inet:port_number</span></span>(),
<span style="color: #FF6600">path</span> <span style="color: #990000">:=</span> <span style="font-weight: bold"><span style="color: #000080">binary</span></span>(), <span style="font-style: italic"><span style="color: #9A1900">%% case sensitive</span></span>
<span style="color: #FF6600">qs</span> <span style="color: #990000">:=</span> <span style="font-weight: bold"><span style="color: #000080">binary</span></span>(), <span style="font-style: italic"><span style="color: #9A1900">%% case sensitive</span></span>
<span style="color: #FF6600">headers</span> <span style="color: #990000">:=</span> <span style="font-weight: bold"><span style="color: #000000">cowboy:http_headers</span></span>(),
<span style="color: #FF6600">peer</span> <span style="color: #990000">:=</span> {<span style="font-weight: bold"><span style="color: #000000">inet:ip_address</span></span>(), <span style="font-weight: bold"><span style="color: #000000">inet:port_number</span></span>()}
}</tt></pre></div></div>
<div class="paragraph"><p>The Req object.</p></div>
<div class="paragraph"><p>Contains information about the request and response. While
some fields are publicly documented, others aren’t and shouldn’t
be used.</p></div>
<div class="paragraph"><p>You may add custom fields if required. Make sure to namespace
them by prepending an underscore and the name of your application:</p></div>
<div class="listingblock">
<div class="title">Setting a custom field</div>
<div class="content"><!-- Generator: GNU source-highlight 3.1.8
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite -->
<pre><tt><span style="color: #009900">Req</span>#{<span style="color: #009900">_myapp_auth_method</span> <span style="color: #990000">=></span> <span style="color: #FF6600">pubkey</span>}<span style="color: #990000">.</span></tt></pre></div></div>
</div>
<div class="sect2">
<h3 id="_resp_body">resp_body()</h3>
<div class="listingblock">
<div class="content"><!-- Generator: GNU source-highlight 3.1.8
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite -->
<pre><tt><span style="font-weight: bold"><span style="color: #000000">resp_body</span></span>() <span style="color: #990000">::</span> <span style="font-weight: bold"><span style="color: #000000">iodata</span></span>()
| {<span style="color: #FF6600">sendfile</span>, <span style="color: #009900">Offset</span>, <span style="color: #009900">Length</span>, <span style="color: #009900">Filename</span>}
<span style="color: #009900">Offset</span> <span style="color: #990000">::</span> <span style="font-weight: bold"><span style="color: #000000">non_neg_integer</span></span>()
<span style="color: #009900">Length</span> <span style="color: #990000">::</span> <span style="font-weight: bold"><span style="color: #000000">pos_integer</span></span>()
<span style="color: #009900">Filename</span> <span style="color: #990000">::</span> <span style="font-weight: bold"><span style="color: #000000">file:name_all</span></span>()</tt></pre></div></div>
<div class="paragraph"><p>Response body.</p></div>
<div class="paragraph"><p>It can take two forms: the actual data to be sent or a
tuple indicating which file to send.</p></div>
<div class="paragraph"><p>When sending data directly, the type is either a binary or
an iolist. Iolists are an efficient way to build output.
Instead of concatenating strings or binaries, you can simply
build a list containing the fragments you want to send in the
order they should be sent:</p></div>
<div class="listingblock">
<div class="title">Example iolists usage</div>
<div class="content"><!-- Generator: GNU source-highlight 3.1.8
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite -->
<pre><tt><span style="color: #993399">1</span><span style="color: #990000">></span> <span style="color: #009900">RespBody</span> <span style="color: #990000">=</span> [<span style="color: #FF0000">"Hello "</span>, [<span style="color: #990000"><<</span><span style="color: #FF0000">"world"</span><span style="color: #990000">>></span>, <span style="color: #FF0000">$!</span>]]<span style="color: #990000">.</span>
[<span style="color: #FF0000">"Hello "</span>,[<span style="color: #990000"><<</span><span style="color: #FF0000">"world"</span><span style="color: #990000">>></span>,<span style="color: #993399">33</span>]]
<span style="color: #993399">2</span><span style="color: #990000">></span> <span style="font-weight: bold"><span style="color: #000000">io:format</span></span>(<span style="color: #FF0000">"~s~n"</span>, [<span style="color: #009900">RespBody</span>])<span style="color: #990000">.</span>
<span style="color: #009900">Hello</span> <span style="color: #FF6600">world</span><span style="color: #990000">!</span></tt></pre></div></div>
<div class="paragraph"><p>When using the sendfile tuple, the <code>Length</code> value is mandatory
and must be higher than 0. It is sent with the response in the
content-length header.</p></div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_see_also">See also</h2>
<div class="sectionbody">
<div class="paragraph"><p><a href="..">cowboy(7)</a></p></div>
</div>
</div>
</div>
<div class="span3 sidecol">
<h3>
Cowboy
2.0
Function Reference
</h3>
<ul>
<li><a href="/docs/en/cowboy/2.0/guide">User Guide</a></li>
<li><a href="/docs/en/cowboy/2.0/manual">Function Reference</a></li>
</ul>
<h4 id="docs-nav">Navigation</h4>
<h4>Version select</h4>
<ul>
<li><a href="/docs/en/cowboy/1.0/manual">1.0</a></li>
<li><a href="/docs/en/cowboy/2.0/manual">2.0</a></li>
</ul>
</div>
</div>
</div>
</div>
<footer>
<div class="container">
<div class="row">
<div class="span6">
<p id="scroll-top"><a href="#">↑ Scroll to top</a></p>
<nav>
<ul>
<li><a href="mailto:[email protected]" title="Contact us">Contact us</a></li><li><a href="https://github.com/ninenines/ninenines.github.io" title="Github repository">Contribute to this site</a></li>
</ul>
</nav>
</div>
<div class="span6 credits">
<p><img src="/img/footer_logo.png"></p>
<p>Copyright © Loïc Hoguin 2012-2016</p>
</div>
</div>
</div>
</footer>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
<script src="/js/bootstrap-carousel.js"></script>
<script src="/js/bootstrap-dropdown.js"></script>
<script src="/js/custom.js"></script>
</body>
</html>