aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDiego Nehab <diego@tecgraf.puc-rio.br>2001-09-12 18:16:09 +0000
committerDiego Nehab <diego@tecgraf.puc-rio.br>2001-09-12 18:16:09 +0000
commit504ecdc0aaeb89dd16cfc8f058de3b03d869270e (patch)
treedfe7e7fc81c11f10f2a4f270ca137103c3424b3a /src
parentcb61077f7a8c71536c3ad331f041bc4ab97c719c (diff)
downloadluasocket-504ecdc0aaeb89dd16cfc8f058de3b03d869270e.tar.gz
luasocket-504ecdc0aaeb89dd16cfc8f058de3b03d869270e.tar.bz2
luasocket-504ecdc0aaeb89dd16cfc8f058de3b03d869270e.zip
Simple HTTP functions can deal with table arguments also.
Diffstat (limited to 'src')
-rw-r--r--src/http.lua101
1 files changed, 71 insertions, 30 deletions
diff --git a/src/http.lua b/src/http.lua
index 1e4c2cd..7eaaf9e 100644
--- a/src/http.lua
+++ b/src/http.lua
@@ -1,6 +1,6 @@
1----------------------------------------------------------------------------- 1-----------------------------------------------------------------------------
2-- HTTP/1.1 client support for the Lua language. 2-- HTTP/1.1 client support for the Lua language.
3-- LuaSocket 1.4a toolkit. 3-- LuaSocket 1.4 toolkit.
4-- Author: Diego Nehab 4-- Author: Diego Nehab
5-- Date: 26/12/2000 5-- Date: 26/12/2000
6-- Conforming to: RFC 2616, LTN7 6-- Conforming to: RFC 2616, LTN7
@@ -18,23 +18,23 @@ Public.TIMEOUT = 60
18-- default port for document retrieval 18-- default port for document retrieval
19Public.PORT = 80 19Public.PORT = 80
20-- user agent field sent in request 20-- user agent field sent in request
21Public.USERAGENT = "LuaSocket 1.4a" 21Public.USERAGENT = "LuaSocket 1.4"
22-- block size used in transfers 22-- block size used in transfers
23Public.BLOCKSIZE = 8192 23Public.BLOCKSIZE = 8192
24 24
25----------------------------------------------------------------------------- 25-----------------------------------------------------------------------------
26-- Required libraries 26-- Required libraries
27----------------------------------------------------------------------------- 27-----------------------------------------------------------------------------
28dofile "buffer.lua" 28dofile "concat.lua"
29dofile "url.lua" 29dofile "url.lua"
30dofile "code.lua" 30dofile "code.lua"
31 31
32----------------------------------------------------------------------------- 32-----------------------------------------------------------------------------
33-- Tries to get a pattern from the server and closes socket on error 33-- Tries to get a pattern from the server and closes socket on error
34-- sock: socket connected to the server 34-- sock: socket connected to the server
35-- ...: patterns to receive 35-- ...: pattern to receive
36-- Returns 36-- Returns
37-- ...: received patterns 37-- ...: received pattern
38-- err: error message if any 38-- err: error message if any
39----------------------------------------------------------------------------- 39-----------------------------------------------------------------------------
40function Private.try_receive(...) 40function Private.try_receive(...)
@@ -313,6 +313,26 @@ function Private.send_indirect(data, send_cb, chunk, size)
313end 313end
314 314
315----------------------------------------------------------------------------- 315-----------------------------------------------------------------------------
316-- Sends mime headers
317-- Input
318-- sock: server socket
319-- headers: table with mime headers to be sent
320-- Returns
321-- err: error message if any
322-----------------------------------------------------------------------------
323function Private.send_headers(sock, headers)
324 local err
325 headers = headers or {}
326 -- send request headers
327 for i, v in headers do
328 err = %Private.try_send(sock, i .. ": " .. v .. "\r\n")
329 if err then return err end
330 end
331 -- mark end of request headers
332 return %Private.try_send(sock, "\r\n")
333end
334
335-----------------------------------------------------------------------------
316-- Sends a HTTP request message through socket 336-- Sends a HTTP request message through socket
317-- Input 337-- Input
318-- sock: socket connected to the server 338-- sock: socket connected to the server
@@ -340,12 +360,7 @@ function Private.send_request(sock, method, uri, headers, body_cb)
340 end 360 end
341 end 361 end
342 -- send request headers 362 -- send request headers
343 for i, v in headers do 363 err = %Private.send_headers(sock, headers)
344 err = %Private.try_send(sock, i .. ": " .. v .. "\r\n")
345 if err then return err end
346 end
347 -- mark end of request headers
348 err = %Private.try_send(sock, "\r\n")
349 if err then return err end 364 if err then return err end
350 -- send request message body, if any 365 -- send request message body, if any
351 if body_cb then 366 if body_cb then
@@ -427,7 +442,7 @@ function Private.authorize(request, parsed, response)
427 body_cb = request.body_cb, 442 body_cb = request.body_cb,
428 headers = request.headers 443 headers = request.headers
429 } 444 }
430 return %Public.request_indirect(authorize, response) 445 return %Public.request_cb(authorize, response)
431end 446end
432 447
433----------------------------------------------------------------------------- 448-----------------------------------------------------------------------------
@@ -467,7 +482,7 @@ function Private.redirect(request, response)
467 body_cb = request.body_cb, 482 body_cb = request.body_cb,
468 headers = request.headers 483 headers = request.headers
469 } 484 }
470 return %Public.request_indirect(redirect, response) 485 return %Public.request_cb(redirect, response)
471end 486end
472 487
473----------------------------------------------------------------------------- 488-----------------------------------------------------------------------------
@@ -487,6 +502,23 @@ function Private.request_uri(parsed)
487end 502end
488 503
489----------------------------------------------------------------------------- 504-----------------------------------------------------------------------------
505-- Builds a request table from a URL or request table
506-- Input
507-- url_or_request: target url or request table (a table with the fields:
508-- url: the target URL
509-- user: account user name
510-- password: account password)
511-- Returns
512-- request: request table
513-----------------------------------------------------------------------------
514function Private.build_request(data)
515 local request = {}
516 if type(data) == "table" then for i, v in data do request[i] = v end
517 else request.url = data end
518 return request
519end
520
521-----------------------------------------------------------------------------
490-- Sends a HTTP request and retrieves the server reply using callbacks to 522-- Sends a HTTP request and retrieves the server reply using callbacks to
491-- send the request body and receive the response body 523-- send the request body and receive the response body
492-- Input 524-- Input
@@ -506,8 +538,12 @@ end
506-- code: server status code, or nil if failed 538-- code: server status code, or nil if failed
507-- error: error message, or nil if successfull 539-- error: error message, or nil if successfull
508----------------------------------------------------------------------------- 540-----------------------------------------------------------------------------
509function Public.request_indirect(request, response) 541function Public.request_cb(request, response)
510 local parsed = URL.parse_url(request.url, {port = %Public.PORT, path ="/"}) 542 local parsed = URL.parse_url(request.url, {
543 host = "",
544 port = %Public.PORT,
545 path ="/"
546 })
511 -- explicit authentication info overrides that given by the URL 547 -- explicit authentication info overrides that given by the URL
512 parsed.user = request.user or parsed.user 548 parsed.user = request.user or parsed.user
513 parsed.password = request.password or parsed.password 549 parsed.password = request.password or parsed.password
@@ -578,10 +614,10 @@ function Public.request(request)
578 end 614 end
579 local cat = Concat.create() 615 local cat = Concat.create()
580 response.body_cb = function(chunk, err) 616 response.body_cb = function(chunk, err)
581 %cat:addstring(chunk) 617 if chunk then %cat:addstring(chunk) end
582 return 1 618 return 1
583 end 619 end
584 %Public.request_indirect(request, response) 620 response = %Public.request_cb(request, response)
585 response.body = cat:getresult() 621 response.body = cat:getresult()
586 response.body_cb = nil 622 response.body_cb = nil
587 return response 623 return response
@@ -590,18 +626,20 @@ end
590----------------------------------------------------------------------------- 626-----------------------------------------------------------------------------
591-- Retrieves a URL by the method "GET" 627-- Retrieves a URL by the method "GET"
592-- Input 628-- Input
593-- url: request URL, i.e. the document to be retrieved 629-- url_or_request: target url or request table (a table with the fields:
630-- url: the target URL
631-- user: account user name
632-- password: account password)
594-- Returns 633-- Returns
595-- body: response message body, or nil if failed 634-- body: response message body, or nil if failed
596-- headers: response header fields received, or nil if failed 635-- headers: response header fields received, or nil if failed
597-- status: server response status line, or nil if failed 636-- status: server response status line, or nil if failed
598-- error: error message if any 637-- error: error message if any
599----------------------------------------------------------------------------- 638-----------------------------------------------------------------------------
600function Public.get(url) 639function Public.get(url_or_request)
601 local response = %Public.request { 640 local request = %Private.build_request(url_or_request)
602 method = "GET", 641 request.method = "GET"
603 url = url 642 local response = %Public.request(request)
604 }
605 return response.body, response.headers, 643 return response.body, response.headers,
606 response.status, response.error 644 response.status, response.error
607end 645end
@@ -609,7 +647,11 @@ end
609----------------------------------------------------------------------------- 647-----------------------------------------------------------------------------
610-- Retrieves a URL by the method "POST" 648-- Retrieves a URL by the method "POST"
611-- Input 649-- Input
612-- url: request URL, i.e. the document to be retrieved 650-- url_or_request: target url or request table (a table with the fields:
651-- url: the target URL
652-- body: request message body
653-- user: account user name
654-- password: account password)
613-- body: request message body, or nil if none 655-- body: request message body, or nil if none
614-- Returns 656-- Returns
615-- body: response message body, or nil if failed 657-- body: response message body, or nil if failed
@@ -617,12 +659,11 @@ end
617-- status: server response status line, or nil if failed 659-- status: server response status line, or nil if failed
618-- error: error message, or nil if successfull 660-- error: error message, or nil if successfull
619----------------------------------------------------------------------------- 661-----------------------------------------------------------------------------
620function Public.post(url, body) 662function Public.post(url_or_request, body)
621 local response = %Public.request { 663 local request = %Private.build_request(url_or_request)
622 method = "POST", 664 request.method = "POST"
623 url = url, 665 request.body = request.body or body
624 body = body 666 local response = %Public.request(request)
625 }
626 return response.body, response.headers, 667 return response.body, response.headers,
627 response.status, response.error 668 response.status, response.error
628end 669end