1
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
2
"http://www.w3.org/TR/html4/strict.dtd">
6
<meta name="description" content="LuaSocket: HTTP support">
7
<meta name="keywords" content="Lua, HTTP, Library, WWW, Browser, Network, Support">
8
<title>LuaSocket: HTTP support</title>
9
<link rel="stylesheet" href="reference.css" type="text/css">
14
<!-- header ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
19
<table summary="LuaSocket logo">
20
<tr><td align=center><a href="http://www.lua.org">
21
<img width=128 height=128 border=0 alt="LuaSocket" src="luasocket.png">
23
<tr><td align=center valign=top>Network support for the Lua language
27
<a href="home.html">home</a> ·
28
<a href="home.html#download">download</a> ·
29
<a href="introduction.html">introduction</a> ·
30
<a href="introduction.html">introduction</a> ·
31
<a href="reference.html">reference</a>
37
<!-- http +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
42
HTTP (Hyper Text Transfer Protocol) is the protocol used to exchange
43
information between web-browsers and servers. The <tt>http</tt>
44
namespace offers full support for the client side of the HTTP
46
the facilities that would be used by a web-browser implementation). The
47
implementation conforms to the HTTP/1.1 standard,
48
<a href="http://www.cs.princeton.edu/~diego/rfc/rfc2616.txt">RFC
53
The module exports functions that provide HTTP functionality in different
54
levels of abstraction. From the simple
55
string oriented requests, through generic
56
<a href="http://lua-users.org/wiki/FiltersSourcesAndSinks">LTN12</a> based, down to even lower-level if you bother to look through the source code.
60
To obtain the <tt>http</tt> namespace, run:
64
-- loads the HTTP module and any libraries it requires
65
local http = require("socket.http")
70
<a href="http://www.cs.princeton.edu/~diego/rfc/rfc1738.txt">RFC
72
that is, an URL is a string in the form:
77
[http://][<user>[:<password>]@]<host>[:<port>][/<path>]
82
MIME headers are represented as a Lua table in the form:
86
<table summary="MIME headers in Lua table">
89
field-1-name = <i>field-1-value</i>,<br>
90
field-2-name = <i>field-2-value</i>,<br>
91
field-3-name = <i>field-3-value</i>,<br>
93
field-n-name = <i>field-n-value</i><br>
100
Field names are case insensitive (as specified by the standard) and all
101
functions work with lowercase field names.
102
Field values are left unmodified.
106
Note: MIME headers are independent of order. Therefore, there is no problem
107
in representing them in a Lua table.
111
The following constants can be set to control the default behavior of
116
<li> <tt>PORT</tt>: default port used for connections;
117
<li> <tt>PROXY</tt>: default proxy used for connections;
118
<li> <tt>TIMEOUT</tt>: sets the timeout for all I/O operations;
119
<li> <tt>USERAGENT</tt>: default user agent reported to server.
122
<!-- http.request ++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
124
<p class=name id=request>
125
http.<b>request(</b>url [, body]<b>)</b><br>
126
http.<b>request{</b><br>
127
url = <i>string</i>,<br>
128
[sink = <i>LTN12 sink</i>,]<br>
129
[method = <i>string</i>,]<br>
130
[headers = <i>header-table</i>,]<br>
131
[source = <i>LTN12 source</i>],<br>
132
[step = <i>LTN12 pump step</i>,]<br>
133
[proxy = <i>string</i>,]<br>
134
[redirect = <i>boolean</i>,]<br>
135
[create = <i>function</i>]<br>
139
<p class=description>
140
The request function has two forms. The simple form downloads
141
a URL using the <tt>GET</tt> or <tt>POST</tt> method and is based
142
on strings. The generic form performs any HTTP method and is
143
<a href=http://lua-users.org/wiki/FiltersSourcesAndSinks>LTN12</a> based.
147
If the first argument of the <tt>request</tt> function is a string, it
148
should be an <tt>url</tt>. In that case, if a <tt>body</tt>
149
is provided as a string, the function will perform a <tt>POST</tt> method
150
in the <tt>url</tt>. Otherwise, it performs a <tt>GET</tt> in the
155
If the first argument is instead a table, the most important fields are
156
the <tt>url</tt> and the <em>simple</em>
157
<a href="http://lua-users.org/wiki/FiltersSourcesAndSinks">LTN12</a>
158
<tt>sink</tt> that will receive the downloaded content.
159
Any part of the <tt>url</tt> can be overridden by including
160
the appropriate field in the request table.
161
If authentication information is provided, the function
162
uses the Basic Authentication Scheme (see <a href="#authentication">note</a>)
163
to retrieve the document. If <tt>sink</tt> is <tt><b>nil</b></tt>, the
164
function discards the downloaded data. The optional parameters are the
168
<li><tt>method</tt>: The HTTP request method. Defaults to "GET";
169
<li><tt>headers</tt>: Any additional HTTP headers to send with the request;
170
<li><tt>source</tt>: <em>simple</em>
171
<a href="http://lua-users.org/wiki/FiltersSourcesAndSinks">LTN12</a>
172
source to provide the request body. If there
173
is a body, you need to provide an appropriate "<tt>content-length</tt>"
174
request header field, or the function will attempt to send the body as
175
"<tt>chunked</tt>" (something few servers support). Defaults to the empty source;
177
<a href="http://lua-users.org/wiki/FiltersSourcesAndSinks">LTN12</a>
178
pump step function used to move data.
179
Defaults to the LTN12 <tt>pump.step</tt> function.
180
<li><tt>proxy</tt>: The URL of a proxy server to use. Defaults to no proxy;
181
<li><tt>redirect</tt>: Set to <tt><b>false</b></tt> to prevent the
182
function from automatically following 301 or 302 server redirect messages;
183
<li><tt>create</tt>: An optional function to be used instead of
184
<a href=tcp.html#socket.tcp><tt>socket.tcp</tt></a> when the communications socket is created.
188
In case of failure, the function returns <tt><b>nil</b></tt> followed by an
189
error message. If successful, the simple form returns the response
190
body as a string, followed by the response status code, the response
191
headers and the response status line. The generic function returns the same
192
information, except the first return value is just the number 1 (the body
193
goes to the <tt>sink</tt>).
197
Even when the server fails to provide the contents of the requested URL (URL not found, for example),
198
it usually returns a message body (a web page informing the
199
URL was not found or some other useless page). To make sure the
200
operation was successful, check the returned status <tt>code</tt>. For
201
a list of the possible values and their meanings, refer to <a
202
href="http://www.cs.princeton.edu/~diego/rfc/rfc2616.txt">RFC
206
<p class=description>
207
Here are a few examples with the simple interface:
211
-- load the http module
212
local io = require("io")
213
local http = require("socket.http")
214
local ltn12 = require("ltn12")
216
-- connect to server "www.cs.princeton.edu" and retrieves this manual
217
-- file from "~diego/professional/luasocket/http.html" and print it to stdout
219
url = "http://www.cs.princeton.edu/~diego/professional/luasocket/http.html",
220
sink = ltn12.sink.file(io.stdout)
223
-- connect to server "www.example.com" and tries to retrieve
224
-- "/private/index.html". Fails because authentication is needed.
225
b, c, h = http.request("http://www.example.com/private/index.html")
226
-- b returns some useless page telling about the denied access,
227
-- h returns authentication information
228
-- and c returns with value 401 (Authentication Required)
230
-- tries to connect to server "wrong.host" to retrieve "/"
231
-- and fails because the host does not exist.
232
r, e = http.request("http://wrong.host/")
233
-- r is nil, and e returns with value "host not found"
236
<p class=description>
237
And here is an example using the generic interface:
241
-- load the http module
242
http = require("socket.http")
244
-- Requests information about a document, without downloading it.
245
-- Useful, for example, if you want to display a download gauge and need
246
-- to know the size of the document in advance
247
r, c, h = http.request {
249
url = "http://www.tecgraf.puc-rio.br/~diego"
251
-- r is 1, c is 200, and h would return the following headers:
253
-- date = "Tue, 18 Sep 2001 20:42:21 GMT",
254
-- server = "Apache/1.3.12 (Unix) (Red Hat/Linux)",
255
-- ["last-modified"] = "Wed, 05 Sep 2001 06:11:20 GMT",
256
-- ["content-length"] = 15652,
257
-- ["connection"] = "close",
258
-- ["content-Type"] = "text/html"
262
<p class=note id=post>
263
Note: When sending a POST request, simple interface adds a
264
"<tt>Content-type: application/x-www-form-urlencoded</tt>"
265
header to the request. This is the type used by
266
HTML forms. If you need another type, use the generic
270
<p class=note id=authentication>
271
Note: Some URLs are protected by their
272
servers from anonymous download. For those URLs, the server must receive
273
some sort of authentication along with the request or it will deny
274
download and return status "401 Authentication Required".
278
The HTTP/1.1 standard defines two authentication methods: the Basic
279
Authentication Scheme and the Digest Authentication Scheme, both
280
explained in detail in
281
<a href="http://www.cs.princeton.edu/~diego/rfc/rfc2068.txt">RFC 2068</a>.
284
<p class=note>The Basic Authentication Scheme sends
285
<tt><user></tt> and
286
<tt><password></tt> unencrypted to the server and is therefore
287
considered unsafe. Unfortunately, by the time of this implementation,
288
the wide majority of servers and browsers support the Basic Scheme only.
289
Therefore, this is the method used by the toolkit whenever
290
authentication is required.
294
-- load required modules
295
http = require("socket.http")
296
mime = require("mime")
298
-- Connect to server "www.example.com" and tries to retrieve
299
-- "/private/index.html", using the provided name and password to
300
-- authenticate the request
301
b, c, h = http.request("http://fulano:silva@www.example.com/private/index.html")
303
-- Alternatively, one could fill the appropriate header and authenticate
304
-- the request directly.
305
r, c = http.request {
306
url = "http://www.example.com/private/index.html",
307
headers = { authentication = "Basic " .. (mime.b64("fulano:silva")) }
311
<!-- footer +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
317
<a href="home.html">home</a> ·
318
<a href="home.html#download">download</a> ·
319
<a href="installation.html">installation</a> ·
320
<a href="introduction.html">introduction</a> ·
321
<a href="reference.html">reference</a>
325
Last modified by Diego Nehab on <br>
326
Thu Apr 20 00:25:26 EDT 2006