1 /**
2  * Start a HTTP server on a port and serve the files in the current directory.
3  *
4  * License:
5  *   This Source Code Form is subject to the terms of
6  *   the Mozilla Public License, v. 2.0. If a copy of
7  *   the MPL was not distributed with this file, You
8  *   can obtain one at http://mozilla.org/MPL/2.0/.
9  *
10  * Authors:
11  *   Vladimir Panteleev <ae@cy.md>
12  */
13 
14 module ae.demo.http.httpserve;
15 
16 import std.base64;
17 import std.conv;
18 import std.datetime;
19 import std.exception;
20 import std.stdio;
21 import std..string;
22 
23 import ae.net.asockets;
24 import ae.net.http.common;
25 import ae.net.http.responseex;
26 import ae.net.http.server;
27 import ae.net.ietf.headers;
28 import ae.net.ssl.openssl;
29 import ae.sys.log;
30 import ae.sys.shutdown;
31 import ae.utils.funopt;
32 import ae.utils.main;
33 
34 mixin SSLUseLib;
35 
36 void httpserve(
37 	ushort port = 0, string host = null,
38 	string sslCert = null, string sslKey = null,
39 	string userName = null, string password = null,
40 )
41 {
42 	HttpServer server;
43 
44 	if (sslCert || sslKey)
45 	{
46 		auto https = new HttpsServer();
47 		https.ctx.setCertificate(sslCert);
48 		https.ctx.setPrivateKey(sslKey);
49 		server = https;
50 	}
51 	else
52 		server = new HttpServer();
53 
54 	server.log = consoleLogger("Web");
55 	server.handleRequest =
56 		(HttpRequest request, HttpServerConnection conn)
57 		{
58 			auto response = new HttpResponseEx();
59 
60 			if ((userName || password) &&
61 				!response.authorize(request, (reqUser, reqPass) => reqUser == userName && reqPass == password))
62 				return conn.sendResponse(response);
63 
64 			response.status = HttpStatusCode.OK;
65 
66 			try
67 				response.serveFile(
68 					decodeUrlParameter(request.resource[1..$]),
69 					"",
70 					true,
71 					formatAddress("http", conn.localAddress, request.host, request.port) ~ "/");
72 			catch (Exception e)
73 				response.writeError(HttpStatusCode.InternalServerError, e.msg);
74 			conn.sendResponse(response);
75 		};
76 	server.listen(port, host);
77 	addShutdownHandler({ server.close(); });
78 
79 	socketManager.loop();
80 }
81 
82 mixin main!(funopt!httpserve);