diff options
author | Caleb Maclennan <caleb@alerque.com> | 2023-11-10 09:12:04 +0300 |
---|---|---|
committer | Caleb Maclennan <caleb@alerque.com> | 2023-11-10 09:12:04 +0300 |
commit | 5c4fc93d5f4137bf4c22ddf1a048c907a4a26727 (patch) | |
tree | a9a68e1f6a9c3bfe2b64fa1c3a4098865b7d3b5d /docs/http.html | |
parent | ccef3bc4e2aa6ee5b997a80aabb58f4ff0b0e98f (diff) | |
parent | 43a97b7f0053313b43906371dbdc226271e6c8ab (diff) | |
download | luasocket-hjelmeland-patch-1.tar.gz luasocket-hjelmeland-patch-1.tar.bz2 luasocket-hjelmeland-patch-1.zip |
Merge branch 'master' into hjelmeland-patch-1hjelmeland-patch-1
Diffstat (limited to 'docs/http.html')
-rw-r--r-- | docs/http.html | 339 |
1 files changed, 339 insertions, 0 deletions
diff --git a/docs/http.html b/docs/http.html new file mode 100644 index 0000000..52b8a30 --- /dev/null +++ b/docs/http.html | |||
@@ -0,0 +1,339 @@ | |||
1 | <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" | ||
2 | "http://www.w3.org/TR/html4/strict.dtd"> | ||
3 | <html> | ||
4 | |||
5 | <head> | ||
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"> | ||
10 | </head> | ||
11 | |||
12 | <body> | ||
13 | |||
14 | <!-- header ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --> | ||
15 | |||
16 | <div class="header"> | ||
17 | <hr> | ||
18 | <center> | ||
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"> | ||
22 | </a></td></tr> | ||
23 | <tr><td align="center" valign="top">Network support for the Lua language | ||
24 | </td></tr> | ||
25 | </table> | ||
26 | <p class="bar"> | ||
27 | <a href="index.html">home</a> · | ||
28 | <a href="index.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> | ||
32 | </p> | ||
33 | </center> | ||
34 | <hr> | ||
35 | </div> | ||
36 | |||
37 | <!-- http +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --> | ||
38 | |||
39 | <h2 id="http">HTTP</h2> | ||
40 | |||
41 | <p> | ||
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 | ||
45 | protocol (i.e., | ||
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.ietf.org/rfc/rfc2616.txt">RFC 2616</a>. | ||
49 | </p> | ||
50 | |||
51 | <p> | ||
52 | The module exports functions that provide HTTP functionality in different | ||
53 | levels of abstraction. From the simple | ||
54 | string oriented requests, through generic | ||
55 | <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. | ||
56 | </p> | ||
57 | |||
58 | <p> | ||
59 | To obtain the <tt>http</tt> namespace, run: | ||
60 | </p> | ||
61 | |||
62 | <pre class="example"> | ||
63 | -- loads the HTTP module and any libraries it requires | ||
64 | local http = require("socket.http") | ||
65 | </pre> | ||
66 | |||
67 | <p> | ||
68 | URLs must conform to | ||
69 | <a href="http://www.ietf.org/rfc/rfc1738.txt">RFC 1738</a>, | ||
70 | that is, an URL is a string in the form: | ||
71 | </p> | ||
72 | |||
73 | <blockquote> | ||
74 | <pre> | ||
75 | [http://][<user>[:<password>]@]<host>[:<port>][/<path>] | ||
76 | </pre> | ||
77 | </blockquote> | ||
78 | |||
79 | <p> | ||
80 | MIME headers are represented as a Lua table in the form: | ||
81 | </p> | ||
82 | |||
83 | <blockquote> | ||
84 | <table summary="MIME headers in Lua table"> | ||
85 | <tr><td><tt> | ||
86 | headers = {<br> | ||
87 | field-1-name = <i>field-1-value</i>,<br> | ||
88 | field-2-name = <i>field-2-value</i>,<br> | ||
89 | field-3-name = <i>field-3-value</i>,<br> | ||
90 | ...<br> | ||
91 | field-n-name = <i>field-n-value</i><br> | ||
92 | } | ||
93 | </tt></td></tr> | ||
94 | </table> | ||
95 | </blockquote> | ||
96 | |||
97 | <p> | ||
98 | Field names are case insensitive (as specified by the standard) and all | ||
99 | functions work with lowercase field names (but see | ||
100 | <a href="socket.html#headers.canonic"><tt>socket.headers.canonic</tt></a>). | ||
101 | Field values are left unmodified. | ||
102 | </p> | ||
103 | |||
104 | <p class="note"> | ||
105 | Note: MIME headers are independent of order. Therefore, there is no problem | ||
106 | in representing them in a Lua table. | ||
107 | </p> | ||
108 | |||
109 | <p> | ||
110 | The following constants can be set to control the default behavior of | ||
111 | the HTTP module: | ||
112 | </p> | ||
113 | |||
114 | <ul> | ||
115 | <li> <tt>PROXY</tt>: default proxy used for connections;</li> | ||
116 | <li> <tt>TIMEOUT</tt>: sets the timeout for all I/O operations;</li> | ||
117 | <li> <tt>USERAGENT</tt>: default user agent reported to server.</li> | ||
118 | </ul> | ||
119 | |||
120 | <p class="note"> | ||
121 | Note: These constants are global. Changing them will also | ||
122 | change the behavior other code that might be using LuaSocket. | ||
123 | </p> | ||
124 | |||
125 | <!-- http.request ++++++++++++++++++++++++++++++++++++++++++++++++++++++ --> | ||
126 | |||
127 | <p class="name" id="request"> | ||
128 | http.<b>request(</b>url [, body]<b>)</b><br> | ||
129 | http.<b>request{</b><br> | ||
130 | url = <i>string</i>,<br> | ||
131 | [sink = <i>LTN12 sink</i>,]<br> | ||
132 | [method = <i>string</i>,]<br> | ||
133 | [headers = <i>header-table</i>,]<br> | ||
134 | [source = <i>LTN12 source</i>],<br> | ||
135 | [step = <i>LTN12 pump step</i>,]<br> | ||
136 | [proxy = <i>string</i>,]<br> | ||
137 | [redirect = <i>boolean</i>,]<br> | ||
138 | [create = <i>function</i>,]<br> | ||
139 | [maxredirects = <i>number</i>]<br> | ||
140 | <b>}</b> | ||
141 | </p> | ||
142 | |||
143 | <p class="description"> | ||
144 | The request function has two forms. The simple form downloads | ||
145 | a URL using the <tt>GET</tt> or <tt>POST</tt> method and is based | ||
146 | on strings. The generic form performs any HTTP method and is | ||
147 | <a href="http://lua-users.org/wiki/FiltersSourcesAndSinks">LTN12</a> based. | ||
148 | </p> | ||
149 | |||
150 | <p class="parameters"> | ||
151 | If the first argument of the <tt>request</tt> function is a string, it | ||
152 | should be an <tt>url</tt>. In that case, if a <tt>body</tt> | ||
153 | is provided as a string, the function will perform a <tt>POST</tt> method | ||
154 | in the <tt>url</tt>. Otherwise, it performs a <tt>GET</tt> in the | ||
155 | <tt>url</tt> | ||
156 | </p> | ||
157 | |||
158 | <p class="parameters"> | ||
159 | If the first argument is instead a table, the most important fields are | ||
160 | the <tt>url</tt> and the <em>simple</em> | ||
161 | <a href="http://lua-users.org/wiki/FiltersSourcesAndSinks">LTN12</a> | ||
162 | <tt>sink</tt> that will receive the downloaded content. | ||
163 | Any part of the <tt>url</tt> can be overridden by including | ||
164 | the appropriate field in the request table. | ||
165 | If authentication information is provided, the function | ||
166 | uses the Basic Authentication Scheme (see <a href="#authentication">note</a>) | ||
167 | to retrieve the document. If <tt>sink</tt> is <tt><b>nil</b></tt>, the | ||
168 | function discards the downloaded data. The optional parameters are the | ||
169 | following: | ||
170 | </p> | ||
171 | <ul> | ||
172 | <li><tt>method</tt>: The HTTP request method. Defaults to "GET";</li> | ||
173 | <li><tt>headers</tt>: Any additional HTTP headers to send with the request;</li> | ||
174 | <li><tt>source</tt>: <em>simple</em> | ||
175 | <a href="http://lua-users.org/wiki/FiltersSourcesAndSinks">LTN12</a> | ||
176 | source to provide the request body. If there | ||
177 | is a body, you need to provide an appropriate "<tt>content-length</tt>" | ||
178 | request header field, or the function will attempt to send the body as | ||
179 | "<tt>chunked</tt>" (something few servers support). Defaults to the empty source;</li> | ||
180 | <li><tt>step</tt>: | ||
181 | <a href="http://lua-users.org/wiki/FiltersSourcesAndSinks">LTN12</a> | ||
182 | pump step function used to move data. | ||
183 | Defaults to the LTN12 <tt>pump.step</tt> function.</li> | ||
184 | <li><tt>proxy</tt>: The URL of a proxy server to use. Defaults to no proxy;</li> | ||
185 | <li><tt>redirect</tt>: Set to <tt><b>false</b></tt> to prevent the | ||
186 | function from automatically following 301 or 302 server redirect messages;</li> | ||
187 | <li><tt>create</tt>: An optional function to be used instead of | ||
188 | <a href="tcp.html#socket.tcp"><tt>socket.tcp</tt></a> when the communications socket is created.</li> | ||
189 | <li><tt>maxredirects</tt>: An optional number specifying the maximum number of | ||
190 | redirects to follow. Defaults to <tt>5</tt> if not specified. A boolean | ||
191 | <tt>false</tt> value means no maximum (unlimited).</li> | ||
192 | </ul> | ||
193 | |||
194 | <p class="return"> | ||
195 | In case of failure, the function returns <tt><b>nil</b></tt> followed by an | ||
196 | error message. If successful, the simple form returns the response | ||
197 | body as a string, followed by the response status code, the response | ||
198 | headers and the response status line. The generic function returns the same | ||
199 | information, except the first return value is just the number 1 (the body | ||
200 | goes to the <tt>sink</tt>). | ||
201 | </p> | ||
202 | |||
203 | <p class="return"> | ||
204 | Even when the server fails to provide the contents of the requested URL (URL not found, for example), | ||
205 | it usually returns a message body (a web page informing the | ||
206 | URL was not found or some other useless page). To make sure the | ||
207 | operation was successful, check the returned status <tt>code</tt>. For | ||
208 | a list of the possible values and their meanings, refer to <a | ||
209 | href="http://www.ietf.org/rfc/rfc2616.txt">RFC 2616</a>. | ||
210 | </p> | ||
211 | |||
212 | <p class="description"> | ||
213 | Here are a few examples with the simple interface: | ||
214 | </p> | ||
215 | |||
216 | <pre class="example"> | ||
217 | -- load the http module | ||
218 | local io = require("io") | ||
219 | local http = require("socket.http") | ||
220 | local ltn12 = require("ltn12") | ||
221 | |||
222 | -- connect to server "www.cs.princeton.edu" and retrieves this manual | ||
223 | -- file from "~diego/professional/luasocket/http.html" and print it to stdout | ||
224 | http.request{ | ||
225 | url = "http://www.cs.princeton.edu/~diego/professional/luasocket/http.html", | ||
226 | sink = ltn12.sink.file(io.stdout) | ||
227 | } | ||
228 | |||
229 | -- connect to server "www.example.com" and tries to retrieve | ||
230 | -- "/private/index.html". Fails because authentication is needed. | ||
231 | b, c, h = http.request("http://www.example.com/private/index.html") | ||
232 | -- b returns some useless page telling about the denied access, | ||
233 | -- h returns authentication information | ||
234 | -- and c returns with value 401 (Authentication Required) | ||
235 | |||
236 | -- tries to connect to server "wrong.host" to retrieve "/" | ||
237 | -- and fails because the host does not exist. | ||
238 | r, e = http.request("http://wrong.host/") | ||
239 | -- r is nil, and e returns with value "host not found" | ||
240 | </pre> | ||
241 | |||
242 | <p class="description"> | ||
243 | And here is an example using the generic interface: | ||
244 | </p> | ||
245 | |||
246 | <pre class="example"> | ||
247 | -- load the http module | ||
248 | http = require("socket.http") | ||
249 | |||
250 | -- Requests information about a document, without downloading it. | ||
251 | -- Useful, for example, if you want to display a download gauge and need | ||
252 | -- to know the size of the document in advance | ||
253 | r, c, h = http.request { | ||
254 | method = "HEAD", | ||
255 | url = "http://www.tecgraf.puc-rio.br/~diego" | ||
256 | } | ||
257 | -- r is 1, c is 200, and h would return the following headers: | ||
258 | -- h = { | ||
259 | -- date = "Tue, 18 Sep 2001 20:42:21 GMT", | ||
260 | -- server = "Apache/1.3.12 (Unix) (Red Hat/Linux)", | ||
261 | -- ["last-modified"] = "Wed, 05 Sep 2001 06:11:20 GMT", | ||
262 | -- ["content-length"] = 15652, | ||
263 | -- ["connection"] = "close", | ||
264 | -- ["content-Type"] = "text/html" | ||
265 | -- } | ||
266 | </pre> | ||
267 | |||
268 | <p class="note" id="post"> | ||
269 | Note: When sending a POST request, simple interface adds a | ||
270 | "<tt>Content-type: application/x-www-form-urlencoded</tt>" | ||
271 | header to the request. This is the type used by | ||
272 | HTML forms. If you need another type, use the generic | ||
273 | interface. | ||
274 | </p> | ||
275 | |||
276 | <p class="note" id="authentication"> | ||
277 | Note: Some URLs are protected by their | ||
278 | servers from anonymous download. For those URLs, the server must receive | ||
279 | some sort of authentication along with the request or it will deny | ||
280 | download and return status "401 Authentication Required". | ||
281 | </p> | ||
282 | |||
283 | <p class="note"> | ||
284 | The HTTP/1.1 standard defines two authentication methods: the Basic | ||
285 | Authentication Scheme and the Digest Authentication Scheme, both | ||
286 | explained in detail in | ||
287 | <a href="http://www.ietf.org/rfc/rfc2068.txt">RFC 2068</a>. | ||
288 | </p> | ||
289 | |||
290 | <p class="note">The Basic Authentication Scheme sends | ||
291 | <tt><user></tt> and | ||
292 | <tt><password></tt> unencrypted to the server and is therefore | ||
293 | considered unsafe. Unfortunately, by the time of this implementation, | ||
294 | the wide majority of servers and browsers support the Basic Scheme only. | ||
295 | Therefore, this is the method used by the toolkit whenever | ||
296 | authentication is required. | ||
297 | </p> | ||
298 | |||
299 | <pre class="example"> | ||
300 | -- load required modules | ||
301 | http = require("socket.http") | ||
302 | mime = require("mime") | ||
303 | |||
304 | -- Connect to server "www.example.com" and tries to retrieve | ||
305 | -- "/private/index.html", using the provided name and password to | ||
306 | -- authenticate the request | ||
307 | b, c, h = http.request("http://fulano:silva@www.example.com/private/index.html") | ||
308 | |||
309 | -- Alternatively, one could fill the appropriate header and authenticate | ||
310 | -- the request directly. | ||
311 | r, c = http.request { | ||
312 | url = "http://www.example.com/private/index.html", | ||
313 | headers = { authorization = "Basic " .. (mime.b64("fulano:silva")) } | ||
314 | } | ||
315 | </pre> | ||
316 | |||
317 | <!-- footer +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --> | ||
318 | |||
319 | <div class="footer"> | ||
320 | <hr> | ||
321 | <center> | ||
322 | <p class="bar"> | ||
323 | <a href="index.html">home</a> · | ||
324 | <a href="index.html#download">download</a> · | ||
325 | <a href="installation.html">installation</a> · | ||
326 | <a href="introduction.html">introduction</a> · | ||
327 | <a href="reference.html">reference</a> | ||
328 | </p> | ||
329 | <p> | ||
330 | <small> | ||
331 | Last modified by Eric Westbrook on <br> | ||
332 | Sat Feb 23 19:09:42 UTC 2019 | ||
333 | </small> | ||
334 | </p> | ||
335 | </center> | ||
336 | </div> | ||
337 | |||
338 | </body> | ||
339 | </html> | ||