#
# http_server.py - test for espidf based MP http server
#
import espidf as esp
server = esp.http_server_t()
server.start()
def get_header_value(req, name):
blen = req.get_hdr_value_len(name);
if not blen: return None
data = bytearray(blen+1);
req.get_hdr_value_str(name, data, blen+1);
return data.decode("utf-8")
def dump_hdr_info(req):
for i in [ "Content-Type", "Accept", "Content-Length"]:
print(i, get_header_value(req, i));
def post_handler(handler, req):
print("POST!");
dump_hdr_info(req);
# receiving a POST needs some additional work as the
# multipart object needs to be handled
print("SIZE:", req.content_len);
buffer = bytearray(req.content_len);
ret = req.recv(buffer, len(buffer));
print("Recv retval:", ret);
print("Recv buffer:", buffer.decode("utf-8"));
handler.send_str("
POST!
", False);
return 0
def index_html_get_handler(handler, req):
# send index.html in chunks
handler.send_str("", True);
handler.send_str("", True);
handler.send_str("Hello from Python!
", True);
handler.send_str("", True);
handler.send_str(None, True);
return 0
def root_get_handler(handler,req):
# redirect incoming GET request for / to /index.html
req.resp_set_status("307 Temporary Redirect");
req.resp_set_hdr("Location", "/index.html");
handler.send(None, 0, False);
return 0;
def get_mimetype(name):
CONTENT_TYPES = {
"html": "text/html",
"css": "text/css",
"mp3": "audio/mpeg",
"wav": "audio/wav",
"ogg": "audio/ogg",
"json": "application/json",
"svg": "image/svg+xml",
"png": "image/png",
"jpg": "image/jpeg",
"svg": "image/svg+xml",
"xml": "application/xml",
"py": "text/x-python",
"js": "application/javascript",
"ico": "image/x-icon"
}
ext = name.split('.')[-1]
if ext in CONTENT_TYPES:
return CONTENT_TYPES[ext]
return "application/octet-stream"
def fs_get_handler(handler,req):
dump_hdr_info(req);
# replace leading /fs/ by /www/ in request to create
# path for file access
name = req.get_uri();
name = "/www/" + name.split("/",2)[2]
print("sending file:", name);
try:
# read file
f = open(name, "rb")
data = f.read()
f.close();
# and set mime type
req.resp_set_type(get_mimetype(name));
except Exception as e:
print("Exception during file access:", e);
req.resp_set_status("404 FILE NOT FOUND");
data = "File error: " + str(e) + "
";
# httpd will set content length itself ...
handler.send(data, len(data), False);
return 0
# set redirect
handler = esp.http_server_handler_t()
handler.httpd_uri.uri = "/index.html"
handler.httpd_uri.method = esp.http_server.GET
server.register(handler, index_html_get_handler, None)
# set root
handler = esp.http_server_handler_t()
handler.httpd_uri.uri = "/"
handler.httpd_uri.method = esp.http_server.GET
server.register(handler, root_get_handler, None)
# set post handler
handler = esp.http_server_handler_t()
handler.httpd_uri.uri = "/fs/post.html"
handler.httpd_uri.method = esp.http_server.POST
server.register(handler, post_handler, None)
handler = esp.http_server_handler_t()
handler.httpd_uri.uri = "/fs/*"
handler.httpd_uri.method = esp.http_server.GET
server.register(handler, fs_get_handler, None)
print("Server running");
try:
while True:
pass
except KeyboardInterrupt:
print("CTRL-C");
print("Stopping server");
server.stop()