Sat, 22 May 2010 01:48:31 +0200
util.sasl.scram: Check nonce in client final message. Check channel binding flag in client first message. Adding some TODOs on more strict parsing. (thanks Marc Santamaria)
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; |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
13 | |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
14 | 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
|
15 | 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
|
16 | local listener; |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
17 | |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
18 | 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
|
19 | 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
|
20 | 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
|
21 | |
1113
89ac8e9e1426
net.httpserver: Fix for urlencoding to always produce 2 digits
Matthew Wild <mwild1@gmail.com>
parents:
1111
diff
changeset
|
22 | 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
|
23 | |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
24 | 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
|
25 | |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
26 | local http_servers = {}; |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
27 | |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
28 | module "httpserver" |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
29 | |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
30 | local default_handler; |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
31 | |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
32 | local function expectbody(reqt) |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
33 | return reqt.method == "POST"; |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
34 | end |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
35 | |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
36 | 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
|
37 | -- Write status line |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
38 | local resp; |
2836
dfb5fa77d437
net.httpserver: Make it possible to return responses with no body
Matthew Wild <mwild1@gmail.com>
parents:
2835
diff
changeset
|
39 | 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
|
40 | 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
|
41 | log("debug", "Sending response to %s", request.id); |
2399
0325f241a26c
net.httpserver: Optimized response serialization.
Waqas Hussain <waqas20@gmail.com>
parents:
2371
diff
changeset
|
42 | 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
|
43 | local h = response.headers; |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
44 | if h then |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
45 | for k, v in pairs(h) do |
2399
0325f241a26c
net.httpserver: Optimized response serialization.
Waqas Hussain <waqas20@gmail.com>
parents:
2371
diff
changeset
|
46 | 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
|
47 | end |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
48 | end |
2836
dfb5fa77d437
net.httpserver: Make it possible to return responses with no body
Matthew Wild <mwild1@gmail.com>
parents:
2835
diff
changeset
|
49 | 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
|
50 | 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
|
51 | end |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
52 | 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
|
53 | |
2836
dfb5fa77d437
net.httpserver: Make it possible to return responses with no body
Matthew Wild <mwild1@gmail.com>
parents:
2835
diff
changeset
|
54 | 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
|
55 | 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
|
56 | end |
2399
0325f241a26c
net.httpserver: Optimized response serialization.
Waqas Hussain <waqas20@gmail.com>
parents:
2371
diff
changeset
|
57 | 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
|
58 | else |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
59 | -- 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
|
60 | 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
|
61 | |
2399
0325f241a26c
net.httpserver: Optimized response serialization.
Waqas Hussain <waqas20@gmail.com>
parents:
2371
diff
changeset
|
62 | local resp = "HTTP/1.0 200 OK\r\n" |
0325f241a26c
net.httpserver: Optimized response serialization.
Waqas Hussain <waqas20@gmail.com>
parents:
2371
diff
changeset
|
63 | .. "Connection: close\r\n" |
0325f241a26c
net.httpserver: Optimized response serialization.
Waqas Hussain <waqas20@gmail.com>
parents:
2371
diff
changeset
|
64 | .. "Content-Type: text/html\r\n" |
0325f241a26c
net.httpserver: Optimized response serialization.
Waqas Hussain <waqas20@gmail.com>
parents:
2371
diff
changeset
|
65 | .. "Content-Length: "..#response.."\r\n" |
0325f241a26c
net.httpserver: Optimized response serialization.
Waqas Hussain <waqas20@gmail.com>
parents:
2371
diff
changeset
|
66 | .. "\r\n" |
0325f241a26c
net.httpserver: Optimized response serialization.
Waqas Hussain <waqas20@gmail.com>
parents:
2371
diff
changeset
|
67 | .. response; |
634
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
68 | |
2399
0325f241a26c
net.httpserver: Optimized response serialization.
Waqas Hussain <waqas20@gmail.com>
parents:
2371
diff
changeset
|
69 | request.write(resp); |
634
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
70 | end |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
71 | 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
|
72 | request:destroy(); |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
73 | end |
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 | |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
76 | 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
|
77 | 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
|
78 | request.handled = true; |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
79 | local callback = request.callback; |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
80 | 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
|
81 | 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
|
82 | local base = path:match("^/([^/?]+)"); |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
83 | if not base then |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
84 | base = path:match("^http://[^/?]+/([^/?]+)"); |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
85 | end |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
86 | |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
87 | 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
|
88 | end |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
89 | if callback then |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
90 | if err then |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
91 | 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
|
92 | 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
|
93 | destroy_request(request); |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
94 | end |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
95 | return; |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
96 | end |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
97 | |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
98 | 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
|
99 | 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
|
100 | 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
|
101 | -- 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
|
102 | 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
|
103 | 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
|
104 | -- Assume response |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
105 | send_response(request, response); |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
106 | destroy_request(request); |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
107 | end |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
108 | else |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
109 | 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
|
110 | -- No response, close connection |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
111 | destroy_request(request); |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
112 | end |
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 | |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
116 | local function request_reader(request, data, startpos) |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
117 | if not data then |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
118 | if request.body then |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
119 | call_callback(request); |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
120 | else |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
121 | -- Error.. connection was closed prematurely |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
122 | call_callback(request, "connection-closed"); |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
123 | end |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
124 | -- Here we force a destroy... the connection is gone, so we can't reply later |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
125 | destroy_request(request); |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
126 | return; |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
127 | end |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
128 | if request.state == "body" then |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
129 | log("debug", "Reading body...") |
697
8ddc85fa7602
core.httpserver: Rename request.responseheaders to the more logical request.headers
Matthew Wild <mwild1@gmail.com>
parents:
634
diff
changeset
|
130 | if not request.body then request.body = {}; request.havebodylength, request.bodylength = 0, tonumber(request.headers["content-length"]); end |
634
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
131 | if startpos then |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
132 | data = data:sub(startpos, -1) |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
133 | end |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
134 | t_insert(request.body, data); |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
135 | if request.bodylength then |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
136 | request.havebodylength = request.havebodylength + #data; |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
137 | if request.havebodylength >= request.bodylength then |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
138 | -- We have the body |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
139 | call_callback(request); |
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 | end |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
142 | elseif request.state == "headers" then |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
143 | log("debug", "Reading headers...") |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
144 | local pos = startpos; |
2837
a17e73ab5f4c
net.httpserver: More robust handling of headers split across multiple packets
Matthew Wild <mwild1@gmail.com>
parents:
2836
diff
changeset
|
145 | local headers, headers_complete = request.headers; |
a17e73ab5f4c
net.httpserver: More robust handling of headers split across multiple packets
Matthew Wild <mwild1@gmail.com>
parents:
2836
diff
changeset
|
146 | if not headers then |
a17e73ab5f4c
net.httpserver: More robust handling of headers split across multiple packets
Matthew Wild <mwild1@gmail.com>
parents:
2836
diff
changeset
|
147 | headers = {}; |
a17e73ab5f4c
net.httpserver: More robust handling of headers split across multiple packets
Matthew Wild <mwild1@gmail.com>
parents:
2836
diff
changeset
|
148 | request.headers = headers; |
a17e73ab5f4c
net.httpserver: More robust handling of headers split across multiple packets
Matthew Wild <mwild1@gmail.com>
parents:
2836
diff
changeset
|
149 | end |
a17e73ab5f4c
net.httpserver: More robust handling of headers split across multiple packets
Matthew Wild <mwild1@gmail.com>
parents:
2836
diff
changeset
|
150 | |
634
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
151 | for line in data:gmatch("(.-)\r\n") do |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
152 | startpos = (startpos or 1) + #line + 2; |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
153 | local k, v = line:match("(%S+): (.+)"); |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
154 | if k and v then |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
155 | headers[k:lower()] = v; |
2837
a17e73ab5f4c
net.httpserver: More robust handling of headers split across multiple packets
Matthew Wild <mwild1@gmail.com>
parents:
2836
diff
changeset
|
156 | --log("debug", "Header: '"..k:lower().."' = '"..v.."'"); |
634
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
157 | elseif #line == 0 then |
2837
a17e73ab5f4c
net.httpserver: More robust handling of headers split across multiple packets
Matthew Wild <mwild1@gmail.com>
parents:
2836
diff
changeset
|
158 | headers_complete = true; |
634
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
159 | break; |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
160 | else |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
161 | log("debug", "Unhandled header line: "..line); |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
162 | end |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
163 | end |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
164 | |
2837
a17e73ab5f4c
net.httpserver: More robust handling of headers split across multiple packets
Matthew Wild <mwild1@gmail.com>
parents:
2836
diff
changeset
|
165 | if not headers_complete then return; end |
a17e73ab5f4c
net.httpserver: More robust handling of headers split across multiple packets
Matthew Wild <mwild1@gmail.com>
parents:
2836
diff
changeset
|
166 | |
a17e73ab5f4c
net.httpserver: More robust handling of headers split across multiple packets
Matthew Wild <mwild1@gmail.com>
parents:
2836
diff
changeset
|
167 | if not expectbody(request) then |
634
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
168 | call_callback(request); |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
169 | return; |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
170 | end |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
171 | |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
172 | -- Reached the end of the headers |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
173 | request.state = "body"; |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
174 | if #data > startpos then |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
175 | return request_reader(request, data:sub(startpos, -1)); |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
176 | end |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
177 | elseif request.state == "request" then |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
178 | log("debug", "Reading request line...") |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
179 | local method, path, http, linelen = data:match("^(%S+) (%S+) HTTP/(%S+)\r\n()", startpos); |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
180 | if not method then |
2835
ff5039708b19
net.httpserver: Close connection on invalid HTTP status line
Matthew Wild <mwild1@gmail.com>
parents:
2066
diff
changeset
|
181 | log("warn", "Invalid HTTP status line, telling callback then closing"); |
ff5039708b19
net.httpserver: Close connection on invalid HTTP status line
Matthew Wild <mwild1@gmail.com>
parents:
2066
diff
changeset
|
182 | local ret = call_callback(request, "invalid-status-line"); |
ff5039708b19
net.httpserver: Close connection on invalid HTTP status line
Matthew Wild <mwild1@gmail.com>
parents:
2066
diff
changeset
|
183 | request:destroy(); |
ff5039708b19
net.httpserver: Close connection on invalid HTTP status line
Matthew Wild <mwild1@gmail.com>
parents:
2066
diff
changeset
|
184 | return ret; |
634
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
185 | end |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
186 | |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
187 | request.method, request.path, request.httpversion = method, path, http; |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
188 | |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
189 | request.url = url_parse(request.path); |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
190 | |
2371
7ddb8ce0cd0b
net.httpserver: Fix usage of old connection API syntax
Matthew Wild <mwild1@gmail.com>
parents:
2360
diff
changeset
|
191 | log("debug", method.." request for "..tostring(request.path) .. " on port "..request.handler:serverport()); |
634
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
192 | |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
193 | if request.onlystatus then |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
194 | if not call_callback(request) then |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
195 | return; |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
196 | end |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
197 | end |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
198 | |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
199 | request.state = "headers"; |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
200 | |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
201 | if #data > linelen then |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
202 | return request_reader(request, data:sub(linelen, -1)); |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
203 | end |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
204 | end |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
205 | end |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
206 | |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
207 | -- 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
|
208 | 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
|
209 | 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
|
210 | 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
|
211 | 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
|
212 | 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
|
213 | end |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
214 | |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
215 | |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
216 | 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
|
217 | return { handler = handler, conn = handler, |
2570
9e69aecad25e
net.httpserver: Trailing whitespace
Matthew Wild <mwild1@gmail.com>
parents:
2483
diff
changeset
|
218 | 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
|
219 | 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
|
220 | send = send_response, |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
221 | destroy = destroy_request, |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
222 | id = tostring{}:match("%x+$") |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
223 | }; |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
224 | end |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
225 | |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
226 | function destroy_request(request) |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
227 | 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
|
228 | 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
|
229 | 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
|
230 | request.destroyed = true; |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
231 | 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
|
232 | 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
|
233 | request.on_destroy(request); |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
234 | else |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
235 | 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
|
236 | end |
2371
7ddb8ce0cd0b
net.httpserver: Fix usage of old connection API syntax
Matthew Wild <mwild1@gmail.com>
parents:
2360
diff
changeset
|
237 | request.handler:close() |
634
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
238 | 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
|
239 | 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
|
240 | end |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
241 | end |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
242 | end |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
243 | |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
244 | function new(params) |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
245 | 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
|
246 | 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
|
247 | http_server = { handlers = {} }; |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
248 | 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
|
249 | -- 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
|
250 | connlisteners_start("httpserver", params); |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
251 | end |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
252 | if params.base then |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
253 | 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
|
254 | end |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
255 | end |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
256 | |
1666
d1243b321c45
net.httpserver: Allow overriding default request handler
Matthew Wild <mwild1@gmail.com>
parents:
1661
diff
changeset
|
257 | function set_default_handler(handler) |
d1243b321c45
net.httpserver: Allow overriding default request handler
Matthew Wild <mwild1@gmail.com>
parents:
1661
diff
changeset
|
258 | default_handler = handler; |
d1243b321c45
net.httpserver: Allow overriding default request handler
Matthew Wild <mwild1@gmail.com>
parents:
1661
diff
changeset
|
259 | end |
d1243b321c45
net.httpserver: Allow overriding default request handler
Matthew Wild <mwild1@gmail.com>
parents:
1661
diff
changeset
|
260 | |
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
|
261 | 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
|
262 | 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
|
263 | 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
|
264 | 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
|
265 | 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
|
266 | 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
|
267 | 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
|
268 | 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
|
269 | 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
|
270 | 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
|
271 | 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
|
272 | 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
|
273 | 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
|
274 | 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
|
275 | 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
|
276 | 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
|
277 | 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
|
278 | 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
|
279 | 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
|
280 | 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
|
281 | |
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
|
282 | 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
|
283 | 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
|
284 | ssl.protocol = "sslv23"; |
2767
473627393d40
Disable SSLv2 by default, it's known to be insecure.
Paul Aurich <paul@darkrain42.org>
parents:
2761
diff
changeset
|
285 | 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
|
286 | 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
|
287 | |
2021
43b7c0980d23
net.httpserver: Pass on interface option from new_from_config() (thanks Chris)
Matthew Wild <mwild1@gmail.com>
parents:
1868
diff
changeset
|
288 | new{ port = port, interface = interface, |
43b7c0980d23
net.httpserver: Pass on interface option from new_from_config() (thanks Chris)
Matthew Wild <mwild1@gmail.com>
parents:
1868
diff
changeset
|
289 | base = base, handler = handle_request, |
43b7c0980d23
net.httpserver: Pass on interface option from new_from_config() (thanks Chris)
Matthew Wild <mwild1@gmail.com>
parents:
1868
diff
changeset
|
290 | 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
|
291 | 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
|
292 | 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
|
293 | |
634
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
294 | _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
|
295 | _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
|
296 | _M.urlencode = urlencode; |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
297 | |
1af93ea23f96
Adding initial net.httpserver (lots of work to do on it)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
298 | return _M; |