# # 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()