aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDiego Nehab <diego@tecgraf.puc-rio.br>2004-01-19 18:22:51 +0000
committerDiego Nehab <diego@tecgraf.puc-rio.br>2004-01-19 18:22:51 +0000
commit3f1712ed48f9deab4fab67d7d342dc20c2b5b0ce (patch)
tree4843296b98ab3524b9cbed1c6428b101e8107492
parentfbb42b80cb0d299f38e0a4df9b0fa01228b39225 (diff)
downloadluasocket-3f1712ed48f9deab4fab67d7d342dc20c2b5b0ce.tar.gz
luasocket-3f1712ed48f9deab4fab67d7d342dc20c2b5b0ce.tar.bz2
luasocket-3f1712ed48f9deab4fab67d7d342dc20c2b5b0ce.zip
Added gethostname.
Cleaned up TODO. Moved luasocket specific stuff from auxiliar.c to luasocket.c
-rw-r--r--TODO99
-rw-r--r--src/auxiliar.c19
-rw-r--r--src/http.lua55
-rw-r--r--src/luasocket.c58
-rw-r--r--src/luasocket.h2
-rw-r--r--src/tcp.c4
-rw-r--r--src/udp.c2
-rw-r--r--test/httptest.lua16
8 files changed, 147 insertions, 108 deletions
diff --git a/TODO b/TODO
index 4b475ae..260d9bf 100644
--- a/TODO
+++ b/TODO
@@ -1,48 +1,37 @@
1 1manual
2comment the need of a content-length header in the post method... 2 add shutdown
3 3 add gethostname
4comment the callback.lua module and the new mime module. 4 the need of a content-length header in the post method...
5 escape and unescape are missing! 5 notice the change in callback conventions
6 6 the callback.lua module and the new mime module.
7 escape and unescape in url, not in code!
8 add timeout and proxy to request table
9 change stay to redirect
10 socket.time and socket.sleep
11 connect with timeout
12 local connect
13 add thanks to 'carlos cassino' and 'david burgess'
14 add new ip- options and reuseaddr option
15
16tests
17 checar todos os metodos
18 checar todas as globais
19 checar garbage collection
20 check for interrupts
21
22new option.c module to put all options (TCP and UDP share...)?
23testar os options!
7add _tostring methods! 24add _tostring methods!
8add callback module to manual 25change all modules to use the new namespace scheme
9change stay to redirect in http.lua and in manual
10add timeout to request table
11
12change code to mime
13change *all* modules to be namespace independent
14 26
15write some utilities that use the code.lua module and put them 27write some utilities that use the code.lua module and put them
16in etc, modify the README.etc file and makefile.dist (eol.lua is done) 28in etc, modify the README.etc file and makefile.dist (eol.lua is done)
17 29
18check for interrupt compliance 30use gethostname it in SMTP
19add connect with timeout
20add gethostname and use it in HTTP, SMTP etc, and add manual entry.
21add thanks for cassino and david burgess
22
23add local connect, and manual entry
24
25add shutdown manual entry
26
27only allocate in case of success
28only call select if io fails...
29Proxy support pro http
30
31make REUSEADDR an option...
32 31
33make sure modules know if their dependencies are there. 32make sure modules know if their dependencies are there.
34_
35one thing i noticed in usocket.c is that it doesn't check for EINTR
36after write(), sendto(), read(), recvfrom() etc. ? the usual trick is
37to loop while you get EINTR:
38
39 do
40 ret = write(...);
41 while(ret < 0 && errno == EINTR)
42
43 33
44Read about 34Read about
45
46250-ENHANCEDSTATUSCODES 35250-ENHANCEDSTATUSCODES
47250-PIPELINING 36250-PIPELINING
48250-8BITMIME 37250-8BITMIME
@@ -62,29 +51,30 @@ Make sure nobody can fuck up with the metatables...
62 51
63Create a passive mode option for the FTP (good for firewall). 52Create a passive mode option for the FTP (good for firewall).
64 53
65Use environments in module definitions or declare all local and create the
66function with exported symbols later?
67
68local P = {}
69complex = P
70setfenv(1, P)
71
72Modules should return their namespace table in the end of the chunk. 54Modules should return their namespace table in the end of the chunk.
73 55
74Adjust dates in all files 56Adjust dates in all files
75 57
76Test the library on every system possible 58Test the library on every system possible
77 59
78Document socket.time and socket.sleep
79
80Implement time critical stuff from code module in C.
81Add service name translation. 60Add service name translation.
82
83Ajeitar o protocolo da luaopen_socket()... sei lá qual é. 61Ajeitar o protocolo da luaopen_socket()... sei lá qual é.
84 62
85- testar os options! 63
86- adicionar exemplos de expansão: pipe, local, named pipe 64- adicionar exemplos de expansão: pipe, local, named pipe
87 65
66* should be interrupt-safe
67* notice the change in callback conventions
68* new mime module replacing old code module (faster, more functionality)
69* new socket options (many)
70* only allocate in case of success
71* optimize for success (only call select if fails)
72* add proxy support to http
73* add gethostname
74* local connect
75* connect with timeout
76* change code to mime
77* change stay to redirect
88* add shutdown 78* add shutdown
89* change send/recv to avoid using select 79* change send/recv to avoid using select
90* O location do "redirect" pode ser relativo ao servidor atual (não pode, 80* O location do "redirect" pode ser relativo ao servidor atual (não pode,
@@ -93,24 +83,13 @@ Ajeitar o protocolo da luaopen_socket()... sei lá qual é.
93* Padronizar os retornos de funccao 83* Padronizar os retornos de funccao
94* Separar as classes em arquivos 84* Separar as classes em arquivos
95* Retorno de sendto em datagram sockets pode ser refused 85* Retorno de sendto em datagram sockets pode ser refused
96* Fazer compilar com g++
97 86
87- Fazer compilar com g++
98- Thread-safe 88- Thread-safe
99 - proteger gethostby*.* com um mutex GLOBAL! 89 - proteger gethostby*.* com um mutex GLOBAL!
100 - proteger ou atomizar o conjunto (timedout, receive), (timedout, send) 90 - proteger ou atomizar o conjunto (timedout, receive), (timedout, send)
101 - inet_ntoa também é uma merda. 91 - inet_ntoa também é uma merda.
102- SSL 92- SSL
103 93
104- checar operações em closed sockets
105- checar teste de writable socket com select
106
107
108- checar todos os metodos
109- checar options em UDP
110- checar todas as globais
111- checar os metodos virtuais
112- checar garbage collection
113
114- unix 92 bytes maximo no endereço, incluindo o zero 94- unix 92 bytes maximo no endereço, incluindo o zero
115- unix 9216 maximo de datagram size 95- unix 9216 maximo de datagram size
116
diff --git a/src/auxiliar.c b/src/auxiliar.c
index 65425c5..4b3a0f6 100644
--- a/src/auxiliar.c
+++ b/src/auxiliar.c
@@ -17,24 +17,7 @@
17\*-------------------------------------------------------------------------*/ 17\*-------------------------------------------------------------------------*/
18void aux_open(lua_State *L) 18void aux_open(lua_State *L)
19{ 19{
20 /* create namespace table */ 20 ;
21 lua_pushstring(L, LUASOCKET_LIBNAME);
22 lua_newtable(L);
23#ifdef LUASOCKET_DEBUG
24 lua_pushstring(L, "debug");
25 lua_pushnumber(L, 1);
26 lua_rawset(L, -3);
27#endif
28 /* make version string available so scripts */
29 lua_pushstring(L, "version");
30 lua_pushstring(L, LUASOCKET_VERSION);
31 lua_rawset(L, -3);
32 /* store namespace as global */
33 lua_settable(L, LUA_GLOBALSINDEX);
34 /* make sure modules know what is our namespace */
35 lua_pushstring(L, "LUASOCKET_LIBNAME");
36 lua_pushstring(L, LUASOCKET_LIBNAME);
37 lua_settable(L, LUA_GLOBALSINDEX);
38} 21}
39 22
40/*-------------------------------------------------------------------------*\ 23/*-------------------------------------------------------------------------*\
diff --git a/src/http.lua b/src/http.lua
index 72bde0a..4d6e426 100644
--- a/src/http.lua
+++ b/src/http.lua
@@ -25,7 +25,7 @@ TIMEOUT = 60
25-- default port for document retrieval 25-- default port for document retrieval
26PORT = 80 26PORT = 80
27-- user agent field sent in request 27-- user agent field sent in request
28USERAGENT = "LuaSocket 2.0" 28USERAGENT = socket.version
29-- block size used in transfers 29-- block size used in transfers
30BLOCKSIZE = 8192 30BLOCKSIZE = 8192
31 31
@@ -429,8 +429,7 @@ local function authorize(reqt, parsed, respt)
429 body_cb = reqt.body_cb, 429 body_cb = reqt.body_cb,
430 headers = reqt.headers, 430 headers = reqt.headers,
431 timeout = reqt.timeout, 431 timeout = reqt.timeout,
432 proxyhost = reqt.proxyhost, 432 proxy = reqt.proxy,
433 proxyport = reqt.proxyport
434 } 433 }
435 return request_cb(autht, respt) 434 return request_cb(autht, respt)
436end 435end
@@ -471,8 +470,7 @@ local function redirect(reqt, respt)
471 body_cb = reqt.body_cb, 470 body_cb = reqt.body_cb,
472 headers = reqt.headers, 471 headers = reqt.headers,
473 timeout = reqt.timeout, 472 timeout = reqt.timeout,
474 proxyhost = reqt.proxyhost, 473 proxy = reqt.proxy
475 proxyport = reqt.proxyport
476 } 474 }
477 respt = request_cb(redirt, respt) 475 respt = request_cb(redirt, respt)
478 -- we pass the location header as a clue we tried to redirect 476 -- we pass the location header as a clue we tried to redirect
@@ -491,7 +489,7 @@ end
491----------------------------------------------------------------------------- 489-----------------------------------------------------------------------------
492local function request_uri(reqt, parsed) 490local function request_uri(reqt, parsed)
493 local url 491 local url
494 if not reqt.proxyhost and not reqt.proxyport then 492 if not reqt.proxy then
495 url = { 493 url = {
496 path = parsed.path, 494 path = parsed.path,
497 params = parsed.params, 495 params = parsed.params,
@@ -523,6 +521,39 @@ local function build_request(data)
523end 521end
524 522
525----------------------------------------------------------------------------- 523-----------------------------------------------------------------------------
524-- Connects to a server, be it a proxy or not
525-- Input
526-- reqt: the request table
527-- parsed: the parsed request url
528-- Returns
529-- sock: connection socket, or nil in case of error
530-- err: error message
531-----------------------------------------------------------------------------
532local function try_connect(reqt, parsed)
533 reqt.proxy = reqt.proxy or PROXY
534 local host, port
535 if reqt.proxy then
536 local pproxy = socket.url.parse(reqt.proxy)
537 if not pproxy.port or not pproxy.host then
538 return nil, "invalid proxy"
539 end
540 host, port = pproxy.host, pproxy.port
541 else
542 host, port = parsed.host, parsed.port
543 end
544 local sock, ret, err
545 sock, err = socket.tcp()
546 if not sock then return nil, err end
547 sock:settimeout(reqt.timeout or TIMEOUT)
548 ret, err = sock:connect(host, port)
549 if not ret then
550 sock:close()
551 return nil, err
552 end
553 return sock
554end
555
556-----------------------------------------------------------------------------
526-- Sends a HTTP request and retrieves the server reply using callbacks to 557-- Sends a HTTP request and retrieves the server reply using callbacks to
527-- send the request body and receive the response body 558-- send the request body and receive the response body
528-- Input 559-- Input
@@ -562,18 +593,8 @@ function request_cb(reqt, respt)
562 -- fill default headers 593 -- fill default headers
563 reqt.headers = fill_headers(reqt.headers, parsed) 594 reqt.headers = fill_headers(reqt.headers, parsed)
564 -- try to connect to server 595 -- try to connect to server
565 sock, respt.error = socket.tcp() 596 sock, respt.error = try_connect(reqt, parsed)
566 if not sock then return respt end 597 if not sock then return respt end
567 -- set connection timeout so that we do not hang forever
568 sock:settimeout(reqt.timeout or TIMEOUT)
569 ret, respt.error = sock:connect(
570 reqt.proxyhost or PROXYHOST or parsed.host,
571 reqt.proxyport or PROXYPORT or parsed.port
572 )
573 if not ret then
574 sock:close()
575 return respt
576 end
577 -- send request message 598 -- send request message
578 respt.error = send_request(sock, reqt.method, 599 respt.error = send_request(sock, reqt.method,
579 request_uri(reqt, parsed), reqt.headers, reqt.body_cb) 600 request_uri(reqt, parsed), reqt.headers, reqt.body_cb)
diff --git a/src/luasocket.c b/src/luasocket.c
index 578d65c..73583a8 100644
--- a/src/luasocket.c
+++ b/src/luasocket.c
@@ -36,8 +36,63 @@
36#include "mime.h" 36#include "mime.h"
37 37
38/*=========================================================================*\ 38/*=========================================================================*\
39* Exported functions 39* Declarations
40\*=========================================================================*/ 40\*=========================================================================*/
41static int global_gethostname(lua_State *L);
42static int base_open(lua_State *L);
43
44/* functions in library namespace */
45static luaL_reg func[] = {
46 {"gethostname", global_gethostname},
47 {NULL, NULL}
48};
49
50/*-------------------------------------------------------------------------*\
51* Setup basic stuff.
52\*-------------------------------------------------------------------------*/
53static int base_open(lua_State *L)
54{
55 /* create namespace table */
56 lua_pushstring(L, LUASOCKET_LIBNAME);
57 lua_newtable(L);
58#ifdef LUASOCKET_DEBUG
59 lua_pushstring(L, "debug");
60 lua_pushnumber(L, 1);
61 lua_rawset(L, -3);
62#endif
63 /* make version string available so scripts */
64 lua_pushstring(L, "version");
65 lua_pushstring(L, LUASOCKET_VERSION);
66 lua_rawset(L, -3);
67 /* store namespace as global */
68 lua_settable(L, LUA_GLOBALSINDEX);
69 /* make sure modules know what is our namespace */
70 lua_pushstring(L, "LUASOCKET_LIBNAME");
71 lua_pushstring(L, LUASOCKET_LIBNAME);
72 lua_settable(L, LUA_GLOBALSINDEX);
73 /* define library functions */
74 luaL_openlib(L, LUASOCKET_LIBNAME, func, 0);
75 lua_pop(L, 1);
76 return 0;
77}
78
79/*-------------------------------------------------------------------------*\
80* Gets the host name
81\*-------------------------------------------------------------------------*/
82static int global_gethostname(lua_State *L)
83{
84 char name[257];
85 name[256] = '\0';
86 if (gethostname(name, 256) < 0) {
87 lua_pushnil(L);
88 lua_pushstring(L, "gethostname failed");
89 return 2;
90 } else {
91 lua_pushstring(L, name);
92 return 1;
93 }
94}
95
41/*-------------------------------------------------------------------------*\ 96/*-------------------------------------------------------------------------*\
42* Initializes all library modules. 97* Initializes all library modules.
43\*-------------------------------------------------------------------------*/ 98\*-------------------------------------------------------------------------*/
@@ -45,6 +100,7 @@ LUASOCKET_API int luaopen_socket(lua_State *L)
45{ 100{
46 if (!sock_open()) return 0; 101 if (!sock_open()) return 0;
47 /* initialize all modules */ 102 /* initialize all modules */
103 base_open(L);
48 aux_open(L); 104 aux_open(L);
49 tm_open(L); 105 tm_open(L);
50 buf_open(L); 106 buf_open(L);
diff --git a/src/luasocket.h b/src/luasocket.h
index ac26824..81d7b3f 100644
--- a/src/luasocket.h
+++ b/src/luasocket.h
@@ -13,7 +13,7 @@
13/*-------------------------------------------------------------------------*\ 13/*-------------------------------------------------------------------------*\
14* Current luasocket version 14* Current luasocket version
15\*-------------------------------------------------------------------------*/ 15\*-------------------------------------------------------------------------*/
16#define LUASOCKET_VERSION "LuaSocket 2.0 (alpha)" 16#define LUASOCKET_VERSION "LuaSocket 2.0 (beta)"
17 17
18/*-------------------------------------------------------------------------*\ 18/*-------------------------------------------------------------------------*\
19* Library's namespace 19* Library's namespace
diff --git a/src/tcp.c b/src/tcp.c
index 21aa7f5..5505848 100644
--- a/src/tcp.c
+++ b/src/tcp.c
@@ -153,7 +153,7 @@ static int opt_keepalive(lua_State *L)
153 return opt_boolean(L, SOL_SOCKET, SO_KEEPALIVE); 153 return opt_boolean(L, SOL_SOCKET, SO_KEEPALIVE);
154} 154}
155 155
156int opt_linger(lua_State *L) 156static int opt_linger(lua_State *L)
157{ 157{
158 p_tcp tcp = (p_tcp) aux_checkclass(L, "tcp{client}", 1); 158 p_tcp tcp = (p_tcp) aux_checkclass(L, "tcp{client}", 1);
159 struct linger li; 159 struct linger li;
@@ -334,7 +334,7 @@ static int meth_settimeout(lua_State *L)
334/*-------------------------------------------------------------------------*\ 334/*-------------------------------------------------------------------------*\
335* Creates a master tcp object 335* Creates a master tcp object
336\*-------------------------------------------------------------------------*/ 336\*-------------------------------------------------------------------------*/
337int global_create(lua_State *L) 337static int global_create(lua_State *L)
338{ 338{
339 t_sock sock; 339 t_sock sock;
340 const char *err = inet_trycreate(&sock, SOCK_STREAM); 340 const char *err = inet_trycreate(&sock, SOCK_STREAM);
diff --git a/src/udp.c b/src/udp.c
index c730206..c5e14d1 100644
--- a/src/udp.c
+++ b/src/udp.c
@@ -417,7 +417,7 @@ static int meth_setsockname(lua_State *L)
417/*-------------------------------------------------------------------------*\ 417/*-------------------------------------------------------------------------*\
418* Creates a master udp object 418* Creates a master udp object
419\*-------------------------------------------------------------------------*/ 419\*-------------------------------------------------------------------------*/
420int global_create(lua_State *L) 420static int global_create(lua_State *L)
421{ 421{
422 t_sock sock; 422 t_sock sock;
423 const char *err = inet_trycreate(&sock, SOCK_DGRAM); 423 const char *err = inet_trycreate(&sock, SOCK_DGRAM);
diff --git a/test/httptest.lua b/test/httptest.lua
index dc90741..44266d5 100644
--- a/test/httptest.lua
+++ b/test/httptest.lua
@@ -5,14 +5,15 @@
5-- needs "AllowOverride AuthConfig" on /home/c/diego/tec/luasocket/test/auth 5-- needs "AllowOverride AuthConfig" on /home/c/diego/tec/luasocket/test/auth
6dofile("noglobals.lua") 6dofile("noglobals.lua")
7 7
8local host, proxyhost, proxyport, request, response 8local host, proxy, request, response
9local ignore, expect, index, prefix, cgiprefix 9local ignore, expect, index, prefix, cgiprefix
10 10
11socket.http.TIMEOUT = 5
12
11local t = socket.time() 13local t = socket.time()
12 14
13host = host or "diego.princeton.edu" 15host = host or "diego.student.dyn.cs.princeton.edu"
14proxyhost = proxyhost or "localhost" 16proxy = proxy or "http://localhost:3128"
15proxyport = proxyport or 3128
16prefix = prefix or "/luasocket-test" 17prefix = prefix or "/luasocket-test"
17cgiprefix = cgiprefix or "/luasocket-test-cgi" 18cgiprefix = cgiprefix or "/luasocket-test-cgi"
18 19
@@ -66,6 +67,7 @@ end
66io.write("testing request uri correctness: ") 67io.write("testing request uri correctness: ")
67local forth = cgiprefix .. "/request-uri?" .. "this+is+the+query+string" 68local forth = cgiprefix .. "/request-uri?" .. "this+is+the+query+string"
68local back, h, c, e = socket.http.get("http://" .. host .. forth) 69local back, h, c, e = socket.http.get("http://" .. host .. forth)
70if not back then fail(e) end
69back = socket.url.parse(back) 71back = socket.url.parse(back)
70if similar(back.query, "this+is+the+query+string") then print("ok") 72if similar(back.query, "this+is+the+query+string") then print("ok")
71else fail() end 73else fail() end
@@ -129,8 +131,7 @@ request = {
129 method = "POST", 131 method = "POST",
130 body = index, 132 body = index,
131 headers = { ["content-length"] = string.len(index) }, 133 headers = { ["content-length"] = string.len(index) },
132 proxyport = proxyport, 134 proxy= proxy
133 proxyhost = proxyhost
134} 135}
135expect = { 136expect = {
136 body = index, 137 body = index,
@@ -170,8 +171,7 @@ check_request(request, expect, ignore)
170io.write("testing proxy with redirection: ") 171io.write("testing proxy with redirection: ")
171request = { 172request = {
172 url = "http://" .. host .. prefix, 173 url = "http://" .. host .. prefix,
173 proxyhost = proxyhost, 174 proxy = proxy
174 proxyport = proxyport
175} 175}
176expect = { 176expect = {
177 body = index, 177 body = index,