net/httpserver.lua

Sat, 22 May 2010 01:48:31 +0200

author
Tobias Markmann <tm@ayena.de>
date
Sat, 22 May 2010 01:48:31 +0200
changeset 3074
7bd0dae5c84f
parent 2925
692b3c6c5bd2
child 3473
84fe4d5ac2ed
permissions
-rw-r--r--

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;

mercurial