Software /
code /
prosody
Annotate
net/httpserver.lua @ 3540:bc139431830b
Monster whitespace commit (beware the whitespace monster).
author | Waqas Hussain <waqas20@gmail.com> |
---|---|
date | Sat, 16 Oct 2010 23:00:42 +0500 |
parent | 3497:e9159b325e33 |
child | 3757:e8be634e217a |
rev | line source |
---|---|
1522
569d58d21612
Add copyright header to those files missing one
Matthew Wild <mwild1@gmail.com>
parents:
1435
diff
changeset
|
1 -- Prosody IM |
2923
b7049746bd29
Update copyright headers for 2010
Matthew Wild <mwild1@gmail.com>
parents:
2877
diff
changeset
|
2 -- Copyright (C) 2008-2010 Matthew Wild |
b7049746bd29
Update copyright headers for 2010
Matthew Wild <mwild1@gmail.com>
parents:
2877
diff
changeset
|
3 -- Copyright (C) 2008-2010 Waqas Hussain |
1522
569d58d21612
Add copyright header to those files missing one
Matthew Wild <mwild1@gmail.com>
parents:
1435
diff
changeset
|
4 -- |
569d58d21612
Add copyright header to those files missing one
Matthew Wild <mwild1@gmail.com>
parents:
1435
diff
changeset
|
5 -- This project is MIT/X11 licensed. Please see the |
569d58d21612
Add copyright header to those files missing one
Matthew Wild <mwild1@gmail.com>
parents:
1435
diff
changeset
|
6 -- COPYING file in the source package for more information. |
569d58d21612
Add copyright header to those files missing one
Matthew Wild <mwild1@gmail.com>
parents:
1435
diff
changeset
|
7 -- |
569d58d21612
Add copyright header to those files missing one
Matthew Wild <mwild1@gmail.com>
parents:
1435
diff
changeset
|
8 |
634
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
9 |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
10 local socket = require "socket" |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
11 local server = require "net.server" |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
12 local url_parse = require "socket.url".parse; |
3497
e9159b325e33
net.httpserver: Removed old HTTP parser, and updated to use util.httpstream.
Waqas Hussain <waqas20@gmail.com>
parents:
3473
diff
changeset
|
13 local httpstream_new = require "util.httpstream".new; |
634
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
14 |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
15 local connlisteners_start = require "net.connlisteners".start; |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
16 local connlisteners_get = require "net.connlisteners".get; |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
17 local listener; |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
18 |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
19 local t_insert, t_concat = table.insert, table.concat; |
1111
a1cf1d623695
net.http, net.httpserver: Remove urlcodes table... it really isn't needed (thanks Jan Harkes)
Matthew Wild <mwild1@gmail.com>
parents:
1110
diff
changeset
|
20 local s_match, s_gmatch = string.match, string.gmatch; |
1536
8214458eacc8
net.httpserver: Add helper function to set up HTTP server according to given config options
Matthew Wild <mwild1@gmail.com>
parents:
1522
diff
changeset
|
21 local tonumber, tostring, pairs, ipairs, type = tonumber, tostring, pairs, ipairs, type; |
634
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
22 |
1113
89ac8e9e1426
net.httpserver: Fix for urlencoding to always produce 2 digits
Matthew Wild <mwild1@gmail.com>
parents:
1111
diff
changeset
|
23 local urlencode = function (s) return s and (s:gsub("%W", function (c) return string.format("%%%02x", c:byte()); end)); end |
634
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
24 |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
25 local log = require "util.logger".init("httpserver"); |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
26 |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
27 local http_servers = {}; |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
28 |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
29 module "httpserver" |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
30 |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
31 local default_handler; |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
32 |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
33 local function expectbody(reqt) |
3540
bc139431830b
Monster whitespace commit (beware the whitespace monster).
Waqas Hussain <waqas20@gmail.com>
parents:
3497
diff
changeset
|
34 return reqt.method == "POST"; |
634
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
35 end |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
36 |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
37 local function send_response(request, response) |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
38 -- Write status line |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
39 local resp; |
2836
dfb5fa77d437
net.httpserver: Make it possible to return responses with no body
Matthew Wild <mwild1@gmail.com>
parents:
2835
diff
changeset
|
40 if response.body or response.headers then |
dfb5fa77d437
net.httpserver: Make it possible to return responses with no body
Matthew Wild <mwild1@gmail.com>
parents:
2835
diff
changeset
|
41 local body = response.body and tostring(response.body); |
1052
a3429542631d
net.httpserver: Don't log the response body (can be binary data...)
Matthew Wild <mwild1@gmail.com>
parents:
958
diff
changeset
|
42 log("debug", "Sending response to %s", request.id); |
2399
0325f241a26c
net.httpserver: Optimized response serialization.
Waqas Hussain <waqas20@gmail.com>
parents:
2371
diff
changeset
|
43 resp = { "HTTP/1.0 "..(response.status or "200 OK").."\r\n" }; |
634
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
44 local h = response.headers; |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
45 if h then |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
46 for k, v in pairs(h) do |
2399
0325f241a26c
net.httpserver: Optimized response serialization.
Waqas Hussain <waqas20@gmail.com>
parents:
2371
diff
changeset
|
47 t_insert(resp, k..": "..v.."\r\n"); |
634
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
48 end |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
49 end |
2836
dfb5fa77d437
net.httpserver: Make it possible to return responses with no body
Matthew Wild <mwild1@gmail.com>
parents:
2835
diff
changeset
|
50 if body and not (h and h["Content-Length"]) then |
2399
0325f241a26c
net.httpserver: Optimized response serialization.
Waqas Hussain <waqas20@gmail.com>
parents:
2371
diff
changeset
|
51 t_insert(resp, "Content-Length: "..#body.."\r\n"); |
634
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
52 end |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
53 t_insert(resp, "\r\n"); |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
54 |
2836
dfb5fa77d437
net.httpserver: Make it possible to return responses with no body
Matthew Wild <mwild1@gmail.com>
parents:
2835
diff
changeset
|
55 if body and request.method ~= "HEAD" then |
1632
4a70cbb0fad7
net.httpserver: Allow response.body to be a non-string
Matthew Wild <mwild1@gmail.com>
parents:
1608
diff
changeset
|
56 t_insert(resp, body); |
634
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
57 end |
2399
0325f241a26c
net.httpserver: Optimized response serialization.
Waqas Hussain <waqas20@gmail.com>
parents:
2371
diff
changeset
|
58 request.write(t_concat(resp)); |
634
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
59 else |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
60 -- Response we have is just a string (the body) |
1661
33b1aee4b77f
net.httpserver: Don't log response bodies!
Matthew Wild <mwild1@gmail.com>
parents:
1632
diff
changeset
|
61 log("debug", "Sending 200 response to %s", request.id or "<none>"); |
634
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
62 |
2399
0325f241a26c
net.httpserver: Optimized response serialization.
Waqas Hussain <waqas20@gmail.com>
parents:
2371
diff
changeset
|
63 local resp = "HTTP/1.0 200 OK\r\n" |
0325f241a26c
net.httpserver: Optimized response serialization.
Waqas Hussain <waqas20@gmail.com>
parents:
2371
diff
changeset
|
64 .. "Connection: close\r\n" |
0325f241a26c
net.httpserver: Optimized response serialization.
Waqas Hussain <waqas20@gmail.com>
parents:
2371
diff
changeset
|
65 .. "Content-Type: text/html\r\n" |
0325f241a26c
net.httpserver: Optimized response serialization.
Waqas Hussain <waqas20@gmail.com>
parents:
2371
diff
changeset
|
66 .. "Content-Length: "..#response.."\r\n" |
0325f241a26c
net.httpserver: Optimized response serialization.
Waqas Hussain <waqas20@gmail.com>
parents:
2371
diff
changeset
|
67 .. "\r\n" |
0325f241a26c
net.httpserver: Optimized response serialization.
Waqas Hussain <waqas20@gmail.com>
parents:
2371
diff
changeset
|
68 .. response; |
634
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
69 |
2399
0325f241a26c
net.httpserver: Optimized response serialization.
Waqas Hussain <waqas20@gmail.com>
parents:
2371
diff
changeset
|
70 request.write(resp); |
634
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
71 end |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
72 if not request.stayopen then |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
73 request:destroy(); |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
74 end |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
75 end |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
76 |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
77 local function call_callback(request, err) |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
78 if request.handled then return; end |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
79 request.handled = true; |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
80 local callback = request.callback; |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
81 if not callback and request.path then |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
82 local path = request.url.path; |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
83 local base = path:match("^/([^/?]+)"); |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
84 if not base then |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
85 base = path:match("^http://[^/?]+/([^/?]+)"); |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
86 end |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
87 |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
88 callback = (request.server and request.server.handlers[base]) or default_handler; |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
89 end |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
90 if callback then |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
91 if err then |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
92 log("debug", "Request error: "..err); |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
93 if not callback(nil, err, request) then |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
94 destroy_request(request); |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
95 end |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
96 return; |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
97 end |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
98 |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
99 local response = callback(request.method, request.body and t_concat(request.body), request); |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
100 if response then |
958
172fb9a73017
net.httpserver: Don't log that a request has been left open if it is destroyed
Matthew Wild <mwild1@gmail.com>
parents:
697
diff
changeset
|
101 if response == true and not request.destroyed then |
634
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
102 -- Keep connection open, we will reply later |
1608
fb53fe17af36
net.httpserver: Reduce log level of 'request left open' message
Matthew Wild <mwild1@gmail.com>
parents:
1550
diff
changeset
|
103 log("debug", "Request %s left open, on_destroy is %s", request.id, tostring(request.on_destroy)); |
1053
c04b40a0740b
net.httpserver: Fix traceback when sending response to a destroyed request
Matthew Wild <mwild1@gmail.com>
parents:
1052
diff
changeset
|
104 elseif response ~= true then |
634
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
105 -- Assume response |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
106 send_response(request, response); |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
107 destroy_request(request); |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
108 end |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
109 else |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
110 log("debug", "Request handler provided no response, destroying request..."); |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
111 -- No response, close connection |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
112 destroy_request(request); |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
113 end |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
114 end |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
115 end |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
116 |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
117 local function request_reader(request, data, startpos) |
3497
e9159b325e33
net.httpserver: Removed old HTTP parser, and updated to use util.httpstream.
Waqas Hussain <waqas20@gmail.com>
parents:
3473
diff
changeset
|
118 if not request.parser then |
e9159b325e33
net.httpserver: Removed old HTTP parser, and updated to use util.httpstream.
Waqas Hussain <waqas20@gmail.com>
parents:
3473
diff
changeset
|
119 local function success_cb(r) |
e9159b325e33
net.httpserver: Removed old HTTP parser, and updated to use util.httpstream.
Waqas Hussain <waqas20@gmail.com>
parents:
3473
diff
changeset
|
120 for k,v in pairs(r) do request[k] = v; end |
e9159b325e33
net.httpserver: Removed old HTTP parser, and updated to use util.httpstream.
Waqas Hussain <waqas20@gmail.com>
parents:
3473
diff
changeset
|
121 request.url = url_parse(request.path); |
e9159b325e33
net.httpserver: Removed old HTTP parser, and updated to use util.httpstream.
Waqas Hussain <waqas20@gmail.com>
parents:
3473
diff
changeset
|
122 request.body = { request.body }; |
634
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
123 call_callback(request); |
2837
a17e73ab5f4c
net.httpserver: More robust handling of headers split across multiple packets
Matthew Wild <mwild1@gmail.com>
parents:
2836
diff
changeset
|
124 end |
3497
e9159b325e33
net.httpserver: Removed old HTTP parser, and updated to use util.httpstream.
Waqas Hussain <waqas20@gmail.com>
parents:
3473
diff
changeset
|
125 local function error_cb(r) |
e9159b325e33
net.httpserver: Removed old HTTP parser, and updated to use util.httpstream.
Waqas Hussain <waqas20@gmail.com>
parents:
3473
diff
changeset
|
126 call_callback(request, r or "connection-closed"); |
e9159b325e33
net.httpserver: Removed old HTTP parser, and updated to use util.httpstream.
Waqas Hussain <waqas20@gmail.com>
parents:
3473
diff
changeset
|
127 destroy_request(request); |
634
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
128 end |
3497
e9159b325e33
net.httpserver: Removed old HTTP parser, and updated to use util.httpstream.
Waqas Hussain <waqas20@gmail.com>
parents:
3473
diff
changeset
|
129 request.parser = httpstream_new(success_cb, error_cb); |
634
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
130 end |
3497
e9159b325e33
net.httpserver: Removed old HTTP parser, and updated to use util.httpstream.
Waqas Hussain <waqas20@gmail.com>
parents:
3473
diff
changeset
|
131 request.parser:feed(data); |
634
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
132 end |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
133 |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
134 -- The default handler for requests |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
135 default_handler = function (method, body, request) |
2371
7ddb8ce0cd0b
net.httpserver: Fix usage of old connection API syntax
Matthew Wild <mwild1@gmail.com>
parents:
2360
diff
changeset
|
136 log("debug", method.." request for "..tostring(request.path) .. " on port "..request.handler:serverport()); |
2570
9e69aecad25e
net.httpserver: Trailing whitespace
Matthew Wild <mwild1@gmail.com>
parents:
2483
diff
changeset
|
137 return { status = "404 Not Found", |
634
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
138 headers = { ["Content-Type"] = "text/html" }, |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
139 body = "<html><head><title>Page Not Found</title></head><body>Not here :(</body></html>" }; |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
140 end |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
141 |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
142 |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
143 function new_request(handler) |
2571
8a16c5e92bcb
net.httpserver: Make request.conn be the server.lua conn instead of the underlying socket (more useful this way)
Matthew Wild <mwild1@gmail.com>
parents:
2570
diff
changeset
|
144 return { handler = handler, conn = handler, |
2570
9e69aecad25e
net.httpserver: Trailing whitespace
Matthew Wild <mwild1@gmail.com>
parents:
2483
diff
changeset
|
145 write = function (...) return handler:write(...); end, state = "request", |
2275
dd344b94d088
net.httpserver: Fix to work with new server API
Matthew Wild <mwild1@gmail.com>
parents:
2274
diff
changeset
|
146 server = http_servers[handler:serverport()], |
634
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
147 send = send_response, |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
148 destroy = destroy_request, |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
149 id = tostring{}:match("%x+$") |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
150 }; |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
151 end |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
152 |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
153 function destroy_request(request) |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
154 log("debug", "Destroying request %s", request.id); |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
155 listener = listener or connlisteners_get("httpserver"); |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
156 if not request.destroyed then |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
157 request.destroyed = true; |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
158 if request.on_destroy then |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
159 log("debug", "Request has destroy callback"); |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
160 request.on_destroy(request); |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
161 else |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
162 log("debug", "Request has no destroy callback"); |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
163 end |
2371
7ddb8ce0cd0b
net.httpserver: Fix usage of old connection API syntax
Matthew Wild <mwild1@gmail.com>
parents:
2360
diff
changeset
|
164 request.handler:close() |
634
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
165 if request.conn then |
2571
8a16c5e92bcb
net.httpserver: Make request.conn be the server.lua conn instead of the underlying socket (more useful this way)
Matthew Wild <mwild1@gmail.com>
parents:
2570
diff
changeset
|
166 listener.ondisconnect(request.conn, "closed"); |
634
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
167 end |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
168 end |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
169 end |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
170 |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
171 function new(params) |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
172 local http_server = http_servers[params.port]; |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
173 if not http_server then |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
174 http_server = { handlers = {} }; |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
175 http_servers[params.port] = http_server; |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
176 -- We weren't already listening on this port, so start now |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
177 connlisteners_start("httpserver", params); |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
178 end |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
179 if params.base then |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
180 http_server.handlers[params.base] = params.handler; |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
181 end |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
182 end |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
183 |
1666
d1243b321c45
net.httpserver: Allow overriding default request handler
Matthew Wild <mwild1@gmail.com>
parents:
1661
diff
changeset
|
184 function set_default_handler(handler) |
d1243b321c45
net.httpserver: Allow overriding default request handler
Matthew Wild <mwild1@gmail.com>
parents:
1661
diff
changeset
|
185 default_handler = handler; |
d1243b321c45
net.httpserver: Allow overriding default request handler
Matthew Wild <mwild1@gmail.com>
parents:
1661
diff
changeset
|
186 end |
d1243b321c45
net.httpserver: Allow overriding default request handler
Matthew Wild <mwild1@gmail.com>
parents:
1661
diff
changeset
|
187 |
1868
36e1238db2f2
net.httpserver: Allow modules registering to provide more than just a default path when using httpserver.new_from_config
Matthew Wild <mwild1@gmail.com>
parents:
1666
diff
changeset
|
188 function new_from_config(ports, handle_request, default_options) |
36e1238db2f2
net.httpserver: Allow modules registering to provide more than just a default path when using httpserver.new_from_config
Matthew Wild <mwild1@gmail.com>
parents:
1666
diff
changeset
|
189 if type(handle_request) == "string" then -- COMPAT with old plugins |
36e1238db2f2
net.httpserver: Allow modules registering to provide more than just a default path when using httpserver.new_from_config
Matthew Wild <mwild1@gmail.com>
parents:
1666
diff
changeset
|
190 log("warn", "Old syntax of httpserver.new_from_config being used to register %s", handle_request); |
36e1238db2f2
net.httpserver: Allow modules registering to provide more than just a default path when using httpserver.new_from_config
Matthew Wild <mwild1@gmail.com>
parents:
1666
diff
changeset
|
191 handle_request, default_options = default_options, { base = handle_request }; |
36e1238db2f2
net.httpserver: Allow modules registering to provide more than just a default path when using httpserver.new_from_config
Matthew Wild <mwild1@gmail.com>
parents:
1666
diff
changeset
|
192 end |
1536
8214458eacc8
net.httpserver: Add helper function to set up HTTP server according to given config options
Matthew Wild <mwild1@gmail.com>
parents:
1522
diff
changeset
|
193 for _, options in ipairs(ports) do |
1868
36e1238db2f2
net.httpserver: Allow modules registering to provide more than just a default path when using httpserver.new_from_config
Matthew Wild <mwild1@gmail.com>
parents:
1666
diff
changeset
|
194 local port = default_options.port or 5280; |
36e1238db2f2
net.httpserver: Allow modules registering to provide more than just a default path when using httpserver.new_from_config
Matthew Wild <mwild1@gmail.com>
parents:
1666
diff
changeset
|
195 local base = default_options.base; |
36e1238db2f2
net.httpserver: Allow modules registering to provide more than just a default path when using httpserver.new_from_config
Matthew Wild <mwild1@gmail.com>
parents:
1666
diff
changeset
|
196 local ssl = default_options.ssl or false; |
36e1238db2f2
net.httpserver: Allow modules registering to provide more than just a default path when using httpserver.new_from_config
Matthew Wild <mwild1@gmail.com>
parents:
1666
diff
changeset
|
197 local interface = default_options.interface; |
1536
8214458eacc8
net.httpserver: Add helper function to set up HTTP server according to given config options
Matthew Wild <mwild1@gmail.com>
parents:
1522
diff
changeset
|
198 if type(options) == "number" then |
8214458eacc8
net.httpserver: Add helper function to set up HTTP server according to given config options
Matthew Wild <mwild1@gmail.com>
parents:
1522
diff
changeset
|
199 port = options; |
8214458eacc8
net.httpserver: Add helper function to set up HTTP server according to given config options
Matthew Wild <mwild1@gmail.com>
parents:
1522
diff
changeset
|
200 elseif type(options) == "table" then |
1868
36e1238db2f2
net.httpserver: Allow modules registering to provide more than just a default path when using httpserver.new_from_config
Matthew Wild <mwild1@gmail.com>
parents:
1666
diff
changeset
|
201 port = options.port or port; |
36e1238db2f2
net.httpserver: Allow modules registering to provide more than just a default path when using httpserver.new_from_config
Matthew Wild <mwild1@gmail.com>
parents:
1666
diff
changeset
|
202 base = options.path or base; |
36e1238db2f2
net.httpserver: Allow modules registering to provide more than just a default path when using httpserver.new_from_config
Matthew Wild <mwild1@gmail.com>
parents:
1666
diff
changeset
|
203 ssl = options.ssl or ssl; |
36e1238db2f2
net.httpserver: Allow modules registering to provide more than just a default path when using httpserver.new_from_config
Matthew Wild <mwild1@gmail.com>
parents:
1666
diff
changeset
|
204 interface = options.interface or interface; |
1536
8214458eacc8
net.httpserver: Add helper function to set up HTTP server according to given config options
Matthew Wild <mwild1@gmail.com>
parents:
1522
diff
changeset
|
205 elseif type(options) == "string" then |
8214458eacc8
net.httpserver: Add helper function to set up HTTP server according to given config options
Matthew Wild <mwild1@gmail.com>
parents:
1522
diff
changeset
|
206 base = options; |
8214458eacc8
net.httpserver: Add helper function to set up HTTP server according to given config options
Matthew Wild <mwild1@gmail.com>
parents:
1522
diff
changeset
|
207 end |
8214458eacc8
net.httpserver: Add helper function to set up HTTP server according to given config options
Matthew Wild <mwild1@gmail.com>
parents:
1522
diff
changeset
|
208 |
8214458eacc8
net.httpserver: Add helper function to set up HTTP server according to given config options
Matthew Wild <mwild1@gmail.com>
parents:
1522
diff
changeset
|
209 if ssl then |
8214458eacc8
net.httpserver: Add helper function to set up HTTP server according to given config options
Matthew Wild <mwild1@gmail.com>
parents:
1522
diff
changeset
|
210 ssl.mode = "server"; |
8214458eacc8
net.httpserver: Add helper function to set up HTTP server according to given config options
Matthew Wild <mwild1@gmail.com>
parents:
1522
diff
changeset
|
211 ssl.protocol = "sslv23"; |
2767
473627393d40
Disable SSLv2 by default, it's known to be insecure.
Paul Aurich <paul@darkrain42.org>
parents:
2761
diff
changeset
|
212 ssl.options = "no_sslv2"; |
1536
8214458eacc8
net.httpserver: Add helper function to set up HTTP server according to given config options
Matthew Wild <mwild1@gmail.com>
parents:
1522
diff
changeset
|
213 end |
8214458eacc8
net.httpserver: Add helper function to set up HTTP server according to given config options
Matthew Wild <mwild1@gmail.com>
parents:
1522
diff
changeset
|
214 |
3540
bc139431830b
Monster whitespace commit (beware the whitespace monster).
Waqas Hussain <waqas20@gmail.com>
parents:
3497
diff
changeset
|
215 new{ port = port, interface = interface, |
bc139431830b
Monster whitespace commit (beware the whitespace monster).
Waqas Hussain <waqas20@gmail.com>
parents:
3497
diff
changeset
|
216 base = base, handler = handle_request, |
2021
43b7c0980d23
net.httpserver: Pass on interface option from new_from_config() (thanks Chris)
Matthew Wild <mwild1@gmail.com>
parents:
1868
diff
changeset
|
217 ssl = ssl, type = (ssl and "ssl") or "tcp" }; |
1536
8214458eacc8
net.httpserver: Add helper function to set up HTTP server according to given config options
Matthew Wild <mwild1@gmail.com>
parents:
1522
diff
changeset
|
218 end |
8214458eacc8
net.httpserver: Add helper function to set up HTTP server according to given config options
Matthew Wild <mwild1@gmail.com>
parents:
1522
diff
changeset
|
219 end |
8214458eacc8
net.httpserver: Add helper function to set up HTTP server according to given config options
Matthew Wild <mwild1@gmail.com>
parents:
1522
diff
changeset
|
220 |
634
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
221 _M.request_reader = request_reader; |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
222 _M.send_response = send_response; |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
223 _M.urlencode = urlencode; |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
224 |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
225 return _M; |