1
0
Fork 0
cl-sites/guile.html_node/Requests.html

239 lines
24 KiB
HTML
Raw Normal View History

2024-12-17 12:49:28 +01:00
<!DOCTYPE html>
<html>
<!-- Created by GNU Texinfo 7.1, https://www.gnu.org/software/texinfo/ -->
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<!-- This manual documents Guile version 3.0.10.
Copyright (C) 1996-1997, 2000-2005, 2009-2023 Free Software Foundation,
Inc.
Copyright (C) 2021 Maxime Devos
Copyright (C) 2024 Tomas Volf
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3 or
any later version published by the Free Software Foundation; with no
Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A
copy of the license is included in the section entitled "GNU Free
Documentation License." -->
<title>Requests (Guile Reference Manual)</title>
<meta name="description" content="Requests (Guile Reference Manual)">
<meta name="keywords" content="Requests (Guile Reference Manual)">
<meta name="resource-type" content="document">
<meta name="distribution" content="global">
<meta name="Generator" content=".texi2any-real">
<meta name="viewport" content="width=device-width,initial-scale=1">
<link href="index.html" rel="start" title="Top">
<link href="Concept-Index.html" rel="index" title="Concept Index">
<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
<link href="Web.html" rel="up" title="Web">
<link href="Responses.html" rel="next" title="Responses">
<link href="Transfer-Codings.html" rel="prev" title="Transfer Codings">
<style type="text/css">
<!--
a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
div.example {margin-left: 3.2em}
span:hover a.copiable-link {visibility: visible}
strong.def-name {font-family: monospace; font-weight: bold; font-size: larger}
-->
</style>
<link rel="stylesheet" type="text/css" href="https://www.gnu.org/software/gnulib/manual.css">
</head>
<body lang="en">
<div class="subsection-level-extent" id="Requests">
<div class="nav-panel">
<p>
Next: <a href="Responses.html" accesskey="n" rel="next">HTTP Responses</a>, Previous: <a href="Transfer-Codings.html" accesskey="p" rel="prev">Transfer Codings</a>, Up: <a href="Web.html" accesskey="u" rel="up"><abbr class="acronym">HTTP</abbr>, the Web, and All That</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Concept-Index.html" title="Index" rel="index">Index</a>]</p>
</div>
<hr>
<h4 class="subsection" id="HTTP-Requests"><span>7.3.6 HTTP Requests<a class="copiable-link" href="#HTTP-Requests"> &para;</a></span></h4>
<div class="example">
<pre class="example-preformatted">(use-modules (web request))
</pre></div>
<p>The request module contains a data type for HTTP requests.
</p>
<ul class="mini-toc">
<li><a href="#An-Important-Note-on-Character-Sets" accesskey="1">An Important Note on Character Sets</a></li>
<li><a href="#Request-API" accesskey="2">Request API</a></li>
</ul>
<div class="subsubsection-level-extent" id="An-Important-Note-on-Character-Sets">
<h4 class="subsubsection"><span>7.3.6.1 An Important Note on Character Sets<a class="copiable-link" href="#An-Important-Note-on-Character-Sets"> &para;</a></span></h4>
<p>HTTP requests consist of two parts: the request proper, consisting of a
request line and a set of headers, and (optionally) a body. The body
might have a binary content-type, and even in the textual case its
length is specified in bytes, not characters.
</p>
<p>Therefore, HTTP is a fundamentally binary protocol. However the request
line and headers are specified to be in a subset of ASCII, so they can
be treated as text, provided that the port&rsquo;s encoding is set to an
ASCII-compatible one-byte-per-character encoding. ISO-8859-1 (latin-1)
is just such an encoding, and happens to be very efficient for Guile.
</p>
<p>So what Guile does when reading requests from the wire, or writing them
out, is to set the port&rsquo;s encoding to latin-1, and treating the request
headers as text.
</p>
<p>The request body is another issue. For binary data, the data is
probably in a bytevector, so we use the R6RS binary output procedures to
write out the binary payload. Textual data usually has to be written
out to some character encoding, usually UTF-8, and then the resulting
bytevector is written out to the port.
</p>
<p>In summary, Guile reads and writes HTTP over latin-1 sockets, without
any loss of generality.
</p>
</div>
<div class="subsubsection-level-extent" id="Request-API">
<h4 class="subsubsection"><span>7.3.6.2 Request API<a class="copiable-link" href="#Request-API"> &para;</a></span></h4>
<dl class="first-deffn">
<dt class="deffn" id="index-request_003f"><span class="category-def">Scheme Procedure: </span><span><strong class="def-name">request?</strong> <var class="def-var-arguments">obj</var><a class="copiable-link" href="#index-request_003f"> &para;</a></span></dt>
<dt class="deffnx def-cmd-deffn" id="index-request_002dmethod"><span class="category-def">Scheme Procedure: </span><span><strong class="def-name">request-method</strong> <var class="def-var-arguments">request</var><a class="copiable-link" href="#index-request_002dmethod"> &para;</a></span></dt>
<dt class="deffnx def-cmd-deffn" id="index-request_002duri"><span class="category-def">Scheme Procedure: </span><span><strong class="def-name">request-uri</strong> <var class="def-var-arguments">request</var><a class="copiable-link" href="#index-request_002duri"> &para;</a></span></dt>
<dt class="deffnx def-cmd-deffn" id="index-request_002dversion"><span class="category-def">Scheme Procedure: </span><span><strong class="def-name">request-version</strong> <var class="def-var-arguments">request</var><a class="copiable-link" href="#index-request_002dversion"> &para;</a></span></dt>
<dt class="deffnx def-cmd-deffn" id="index-request_002dheaders"><span class="category-def">Scheme Procedure: </span><span><strong class="def-name">request-headers</strong> <var class="def-var-arguments">request</var><a class="copiable-link" href="#index-request_002dheaders"> &para;</a></span></dt>
<dt class="deffnx def-cmd-deffn" id="index-request_002dmeta"><span class="category-def">Scheme Procedure: </span><span><strong class="def-name">request-meta</strong> <var class="def-var-arguments">request</var><a class="copiable-link" href="#index-request_002dmeta"> &para;</a></span></dt>
<dt class="deffnx def-cmd-deffn" id="index-request_002dport"><span class="category-def">Scheme Procedure: </span><span><strong class="def-name">request-port</strong> <var class="def-var-arguments">request</var><a class="copiable-link" href="#index-request_002dport"> &para;</a></span></dt>
<dd><p>A predicate and field accessors for the request type. The fields are as
follows:
</p><dl class="table">
<dt><code class="code">method</code></dt>
<dd><p>The HTTP method, for example, <code class="code">GET</code>.
</p></dd>
<dt><code class="code">uri</code></dt>
<dd><p>The URI as a URI record.
</p></dd>
<dt><code class="code">version</code></dt>
<dd><p>The HTTP version pair, like <code class="code">(1 . 1)</code>.
</p></dd>
<dt><code class="code">headers</code></dt>
<dd><p>The request headers, as an alist of parsed values.
</p></dd>
<dt><code class="code">meta</code></dt>
<dd><p>An arbitrary alist of other data, for example information returned in
the <code class="code">sockaddr</code> from <code class="code">accept</code> (see <a class="pxref" href="Network-Sockets-and-Communication.html">Network Sockets and Communication</a>).
</p></dd>
<dt><code class="code">port</code></dt>
<dd><p>The port on which to read or write a request body, if any.
</p></dd>
</dl>
</dd></dl>
<dl class="first-deffn">
<dt class="deffn" id="index-read_002drequest"><span class="category-def">Scheme Procedure: </span><span><strong class="def-name">read-request</strong> <var class="def-var-arguments">port [meta=&rsquo;()]</var><a class="copiable-link" href="#index-read_002drequest"> &para;</a></span></dt>
<dd><p>Read an HTTP request from <var class="var">port</var>, optionally attaching the given
metadata, <var class="var">meta</var>.
</p>
<p>As a side effect, sets the encoding on <var class="var">port</var> to ISO-8859-1
(latin-1), so that reading one character reads one byte. See the
discussion of character sets above, for more information.
</p>
<p>Note that the body is not part of the request. Once you have read a
request, you may read the body separately, and likewise for writing
requests.
</p></dd></dl>
<dl class="first-deffn">
<dt class="deffn" id="index-build_002drequest"><span class="category-def">Scheme Procedure: </span><span><strong class="def-name">build-request</strong> <var class="def-var-arguments">uri [#:method=&rsquo;GET] [#:version=&rsquo;(1 . 1)] [#:headers=&rsquo;()] [#:port=#f] [#:meta=&rsquo;()] [#:validate-headers?=#t]</var><a class="copiable-link" href="#index-build_002drequest"> &para;</a></span></dt>
<dd><p>Construct an HTTP request object. If <var class="var">validate-headers?</var> is true,
the headers are each run through their respective validators.
</p></dd></dl>
<dl class="first-deffn">
<dt class="deffn" id="index-write_002drequest"><span class="category-def">Scheme Procedure: </span><span><strong class="def-name">write-request</strong> <var class="def-var-arguments">r port</var><a class="copiable-link" href="#index-write_002drequest"> &para;</a></span></dt>
<dd><p>Write the given HTTP request to <var class="var">port</var>.
</p>
<p>Return a new request, whose <code class="code">request-port</code> will continue writing
on <var class="var">port</var>, perhaps using some transfer encoding.
</p></dd></dl>
<dl class="first-deffn">
<dt class="deffn" id="index-read_002drequest_002dbody"><span class="category-def">Scheme Procedure: </span><span><strong class="def-name">read-request-body</strong> <var class="def-var-arguments">r</var><a class="copiable-link" href="#index-read_002drequest_002dbody"> &para;</a></span></dt>
<dd><p>Reads the request body from <var class="var">r</var>, as a bytevector. Return <code class="code">#f</code>
if there was no request body.
</p></dd></dl>
<dl class="first-deffn">
<dt class="deffn" id="index-write_002drequest_002dbody"><span class="category-def">Scheme Procedure: </span><span><strong class="def-name">write-request-body</strong> <var class="def-var-arguments">r bv</var><a class="copiable-link" href="#index-write_002drequest_002dbody"> &para;</a></span></dt>
<dd><p>Write <var class="var">bv</var>, a bytevector, to the port corresponding to the HTTP
request <var class="var">r</var>.
</p></dd></dl>
<p>The various headers that are typically associated with HTTP requests may
be accessed with these dedicated accessors. See <a class="xref" href="HTTP-Headers.html">HTTP Headers</a>, for
more information on the format of parsed headers.
</p>
<dl class="first-deffn">
<dt class="deffn" id="index-request_002daccept"><span class="category-def">Scheme Procedure: </span><span><strong class="def-name">request-accept</strong> <var class="def-var-arguments">request [default=&rsquo;()]</var><a class="copiable-link" href="#index-request_002daccept"> &para;</a></span></dt>
<dt class="deffnx def-cmd-deffn" id="index-request_002daccept_002dcharset"><span class="category-def">Scheme Procedure: </span><span><strong class="def-name">request-accept-charset</strong> <var class="def-var-arguments">request [default=&rsquo;()]</var><a class="copiable-link" href="#index-request_002daccept_002dcharset"> &para;</a></span></dt>
<dt class="deffnx def-cmd-deffn" id="index-request_002daccept_002dencoding"><span class="category-def">Scheme Procedure: </span><span><strong class="def-name">request-accept-encoding</strong> <var class="def-var-arguments">request [default=&rsquo;()]</var><a class="copiable-link" href="#index-request_002daccept_002dencoding"> &para;</a></span></dt>
<dt class="deffnx def-cmd-deffn" id="index-request_002daccept_002dlanguage"><span class="category-def">Scheme Procedure: </span><span><strong class="def-name">request-accept-language</strong> <var class="def-var-arguments">request [default=&rsquo;()]</var><a class="copiable-link" href="#index-request_002daccept_002dlanguage"> &para;</a></span></dt>
<dt class="deffnx def-cmd-deffn" id="index-request_002dallow"><span class="category-def">Scheme Procedure: </span><span><strong class="def-name">request-allow</strong> <var class="def-var-arguments">request [default=&rsquo;()]</var><a class="copiable-link" href="#index-request_002dallow"> &para;</a></span></dt>
<dt class="deffnx def-cmd-deffn" id="index-request_002dauthorization"><span class="category-def">Scheme Procedure: </span><span><strong class="def-name">request-authorization</strong> <var class="def-var-arguments">request [default=#f]</var><a class="copiable-link" href="#index-request_002dauthorization"> &para;</a></span></dt>
<dt class="deffnx def-cmd-deffn" id="index-request_002dcache_002dcontrol"><span class="category-def">Scheme Procedure: </span><span><strong class="def-name">request-cache-control</strong> <var class="def-var-arguments">request [default=&rsquo;()]</var><a class="copiable-link" href="#index-request_002dcache_002dcontrol"> &para;</a></span></dt>
<dt class="deffnx def-cmd-deffn" id="index-request_002dconnection"><span class="category-def">Scheme Procedure: </span><span><strong class="def-name">request-connection</strong> <var class="def-var-arguments">request [default=&rsquo;()]</var><a class="copiable-link" href="#index-request_002dconnection"> &para;</a></span></dt>
<dt class="deffnx def-cmd-deffn" id="index-request_002dcontent_002dencoding"><span class="category-def">Scheme Procedure: </span><span><strong class="def-name">request-content-encoding</strong> <var class="def-var-arguments">request [default=&rsquo;()]</var><a class="copiable-link" href="#index-request_002dcontent_002dencoding"> &para;</a></span></dt>
<dt class="deffnx def-cmd-deffn" id="index-request_002dcontent_002dlanguage"><span class="category-def">Scheme Procedure: </span><span><strong class="def-name">request-content-language</strong> <var class="def-var-arguments">request [default=&rsquo;()]</var><a class="copiable-link" href="#index-request_002dcontent_002dlanguage"> &para;</a></span></dt>
<dt class="deffnx def-cmd-deffn" id="index-request_002dcontent_002dlength"><span class="category-def">Scheme Procedure: </span><span><strong class="def-name">request-content-length</strong> <var class="def-var-arguments">request [default=#f]</var><a class="copiable-link" href="#index-request_002dcontent_002dlength"> &para;</a></span></dt>
<dt class="deffnx def-cmd-deffn" id="index-request_002dcontent_002dlocation"><span class="category-def">Scheme Procedure: </span><span><strong class="def-name">request-content-location</strong> <var class="def-var-arguments">request [default=#f]</var><a class="copiable-link" href="#index-request_002dcontent_002dlocation"> &para;</a></span></dt>
<dt class="deffnx def-cmd-deffn" id="index-request_002dcontent_002dmd5"><span class="category-def">Scheme Procedure: </span><span><strong class="def-name">request-content-md5</strong> <var class="def-var-arguments">request [default=#f]</var><a class="copiable-link" href="#index-request_002dcontent_002dmd5"> &para;</a></span></dt>
<dt class="deffnx def-cmd-deffn" id="index-request_002dcontent_002drange"><span class="category-def">Scheme Procedure: </span><span><strong class="def-name">request-content-range</strong> <var class="def-var-arguments">request [default=#f]</var><a class="copiable-link" href="#index-request_002dcontent_002drange"> &para;</a></span></dt>
<dt class="deffnx def-cmd-deffn" id="index-request_002dcontent_002dtype"><span class="category-def">Scheme Procedure: </span><span><strong class="def-name">request-content-type</strong> <var class="def-var-arguments">request [default=#f]</var><a class="copiable-link" href="#index-request_002dcontent_002dtype"> &para;</a></span></dt>
<dt class="deffnx def-cmd-deffn" id="index-request_002ddate"><span class="category-def">Scheme Procedure: </span><span><strong class="def-name">request-date</strong> <var class="def-var-arguments">request [default=#f]</var><a class="copiable-link" href="#index-request_002ddate"> &para;</a></span></dt>
<dt class="deffnx def-cmd-deffn" id="index-request_002dexpect"><span class="category-def">Scheme Procedure: </span><span><strong class="def-name">request-expect</strong> <var class="def-var-arguments">request [default=&rsquo;()]</var><a class="copiable-link" href="#index-request_002dexpect"> &para;</a></span></dt>
<dt class="deffnx def-cmd-deffn" id="index-request_002dexpires"><span class="category-def">Scheme Procedure: </span><span><strong class="def-name">request-expires</strong> <var class="def-var-arguments">request [default=#f]</var><a class="copiable-link" href="#index-request_002dexpires"> &para;</a></span></dt>
<dt class="deffnx def-cmd-deffn" id="index-request_002dfrom"><span class="category-def">Scheme Procedure: </span><span><strong class="def-name">request-from</strong> <var class="def-var-arguments">request [default=#f]</var><a class="copiable-link" href="#index-request_002dfrom"> &para;</a></span></dt>
<dt class="deffnx def-cmd-deffn" id="index-request_002dhost"><span class="category-def">Scheme Procedure: </span><span><strong class="def-name">request-host</strong> <var class="def-var-arguments">request [default=#f]</var><a class="copiable-link" href="#index-request_002dhost"> &para;</a></span></dt>
<dt class="deffnx def-cmd-deffn" id="index-request_002dif_002dmatch"><span class="category-def">Scheme Procedure: </span><span><strong class="def-name">request-if-match</strong> <var class="def-var-arguments">request [default=#f]</var><a class="copiable-link" href="#index-request_002dif_002dmatch"> &para;</a></span></dt>
<dt class="deffnx def-cmd-deffn" id="index-request_002dif_002dmodified_002dsince"><span class="category-def">Scheme Procedure: </span><span><strong class="def-name">request-if-modified-since</strong> <var class="def-var-arguments">request [default=#f]</var><a class="copiable-link" href="#index-request_002dif_002dmodified_002dsince"> &para;</a></span></dt>
<dt class="deffnx def-cmd-deffn" id="index-request_002dif_002dnone_002dmatch"><span class="category-def">Scheme Procedure: </span><span><strong class="def-name">request-if-none-match</strong> <var class="def-var-arguments">request [default=#f]</var><a class="copiable-link" href="#index-request_002dif_002dnone_002dmatch"> &para;</a></span></dt>
<dt class="deffnx def-cmd-deffn" id="index-request_002dif_002drange"><span class="category-def">Scheme Procedure: </span><span><strong class="def-name">request-if-range</strong> <var class="def-var-arguments">request [default=#f]</var><a class="copiable-link" href="#index-request_002dif_002drange"> &para;</a></span></dt>
<dt class="deffnx def-cmd-deffn" id="index-request_002dif_002dunmodified_002dsince"><span class="category-def">Scheme Procedure: </span><span><strong class="def-name">request-if-unmodified-since</strong> <var class="def-var-arguments">request [default=#f]</var><a class="copiable-link" href="#index-request_002dif_002dunmodified_002dsince"> &para;</a></span></dt>
<dt class="deffnx def-cmd-deffn" id="index-request_002dlast_002dmodified"><span class="category-def">Scheme Procedure: </span><span><strong class="def-name">request-last-modified</strong> <var class="def-var-arguments">request [default=#f]</var><a class="copiable-link" href="#index-request_002dlast_002dmodified"> &para;</a></span></dt>
<dt class="deffnx def-cmd-deffn" id="index-request_002dmax_002dforwards"><span class="category-def">Scheme Procedure: </span><span><strong class="def-name">request-max-forwards</strong> <var class="def-var-arguments">request [default=#f]</var><a class="copiable-link" href="#index-request_002dmax_002dforwards"> &para;</a></span></dt>
<dt class="deffnx def-cmd-deffn" id="index-request_002dpragma"><span class="category-def">Scheme Procedure: </span><span><strong class="def-name">request-pragma</strong> <var class="def-var-arguments">request [default=&rsquo;()]</var><a class="copiable-link" href="#index-request_002dpragma"> &para;</a></span></dt>
<dt class="deffnx def-cmd-deffn" id="index-request_002dproxy_002dauthorization"><span class="category-def">Scheme Procedure: </span><span><strong class="def-name">request-proxy-authorization</strong> <var class="def-var-arguments">request [default=#f]</var><a class="copiable-link" href="#index-request_002dproxy_002dauthorization"> &para;</a></span></dt>
<dt class="deffnx def-cmd-deffn" id="index-request_002drange"><span class="category-def">Scheme Procedure: </span><span><strong class="def-name">request-range</strong> <var class="def-var-arguments">request [default=#f]</var><a class="copiable-link" href="#index-request_002drange"> &para;</a></span></dt>
<dt class="deffnx def-cmd-deffn" id="index-request_002dreferer"><span class="category-def">Scheme Procedure: </span><span><strong class="def-name">request-referer</strong> <var class="def-var-arguments">request [default=#f]</var><a class="copiable-link" href="#index-request_002dreferer"> &para;</a></span></dt>
<dt class="deffnx def-cmd-deffn" id="index-request_002dte"><span class="category-def">Scheme Procedure: </span><span><strong class="def-name">request-te</strong> <var class="def-var-arguments">request [default=#f]</var><a class="copiable-link" href="#index-request_002dte"> &para;</a></span></dt>
<dt class="deffnx def-cmd-deffn" id="index-request_002dtrailer"><span class="category-def">Scheme Procedure: </span><span><strong class="def-name">request-trailer</strong> <var class="def-var-arguments">request [default=&rsquo;()]</var><a class="copiable-link" href="#index-request_002dtrailer"> &para;</a></span></dt>
<dt class="deffnx def-cmd-deffn" id="index-request_002dtransfer_002dencoding"><span class="category-def">Scheme Procedure: </span><span><strong class="def-name">request-transfer-encoding</strong> <var class="def-var-arguments">request [default=&rsquo;()]</var><a class="copiable-link" href="#index-request_002dtransfer_002dencoding"> &para;</a></span></dt>
<dt class="deffnx def-cmd-deffn" id="index-request_002dupgrade"><span class="category-def">Scheme Procedure: </span><span><strong class="def-name">request-upgrade</strong> <var class="def-var-arguments">request [default=&rsquo;()]</var><a class="copiable-link" href="#index-request_002dupgrade"> &para;</a></span></dt>
<dt class="deffnx def-cmd-deffn" id="index-request_002duser_002dagent"><span class="category-def">Scheme Procedure: </span><span><strong class="def-name">request-user-agent</strong> <var class="def-var-arguments">request [default=#f]</var><a class="copiable-link" href="#index-request_002duser_002dagent"> &para;</a></span></dt>
<dt class="deffnx def-cmd-deffn" id="index-request_002dvia"><span class="category-def">Scheme Procedure: </span><span><strong class="def-name">request-via</strong> <var class="def-var-arguments">request [default=&rsquo;()]</var><a class="copiable-link" href="#index-request_002dvia"> &para;</a></span></dt>
<dt class="deffnx def-cmd-deffn" id="index-request_002dwarning"><span class="category-def">Scheme Procedure: </span><span><strong class="def-name">request-warning</strong> <var class="def-var-arguments">request [default=&rsquo;()]</var><a class="copiable-link" href="#index-request_002dwarning"> &para;</a></span></dt>
<dd><p>Return the given request header, or <var class="var">default</var> if none was present.
</p></dd></dl>
<dl class="first-deffn">
<dt class="deffn" id="index-request_002dabsolute_002duri"><span class="category-def">Scheme Procedure: </span><span><strong class="def-name">request-absolute-uri</strong> <var class="def-var-arguments">r [default-host=#f] [default-port=#f] [default-scheme=#f]</var><a class="copiable-link" href="#index-request_002dabsolute_002duri"> &para;</a></span></dt>
<dd><p>A helper routine to determine the absolute URI of a request, using the
<code class="code">host</code> header and the default scheme, host and port. If there is
no default scheme and the URI is not itself absolute, an error is
signaled.
</p></dd></dl>
</div>
</div>
<hr>
<div class="nav-panel">
<p>
Next: <a href="Responses.html">HTTP Responses</a>, Previous: <a href="Transfer-Codings.html">Transfer Codings</a>, Up: <a href="Web.html"><abbr class="acronym">HTTP</abbr>, the Web, and All That</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Concept-Index.html" title="Index" rel="index">Index</a>]</p>
</div>
</body>
</html>