def _wait_for_connections(self, s_left, addr, treq): # determine request method (HEAD and GET are supported) (PM: added support to POST ) request_method = treq.split(' ')[0] if (self.modep == 1): print ("Method: ", request_method) print ("Full HTTP message: -->") print (treq) # KN: Enable this print to see the value of treq in debug mode print ("<--") treqhead = treq.split("\r\n\r\n")[0] print("treqhead:", treqhead) treqbody = treq[len(treqhead):].lstrip() # PM: makes easier to handle various types of newlines if (self.modep == 1): print ("only the HTTP body: -->") print (treqbody) # KN: Enable this print to see the value of treqbody in debug mode print ("<--") # split on space "GET /file.html" -into-> ('GET','file.html',...) file_requested = treq.split(' ') #if(self.modep==1): print("Debug Server: File Requested: ", file_requested) # KN: Enable this print to see the file requested in debug mode if (file_requested == ''): file_requested = '/index.html' file_requested = file_requested[1] # get 2nd element # Check for URL arguments. Disregard them file_requested = file_requested.split('?')[0] # disregard anything after '?' if (file_requested == '/'): # in case no file is specified by the browser file_requested = '/index.html' # load index.html by default elif (file_requested == '/favicon.ico'): # most browsers ask for this file... file_requested = '/index.html' # ...giving them index.html instead file_requested = self.www_dir + file_requested if (self.modep == 1): print ("Serving web page ["+file_requested+"]") # GET method if (request_method == 'GET') | (request_method == 'HEAD') : ## Load file content if (self.modep == 1): print ("file_requested: ", file_requested) try: gc.collect() if (request_method == 'GET' and file_requested =='/flash/registro'): if (self.modep == 1): print ('Regreso del Usuario',self.userR) tabla = BaseDatos(self.modep) response_content,self.userR = tabla.ingresoRegistro(self.userR,1) if (self.modep == 1): print ('Datos Regreso', response_content) else: file_handler = open(file_requested,'rb') if (request_method == 'GET'): # only read the file when GET response_content = file_handler.read() # read file content file_handler.close() response_headers = self._gen_headers(200) if (self.modep == 1): print ('response_headers', response_headers) except Exception as e: # in case file was not found, generate 404 page error_str = str(e) if (error_str[:24] == 'memory allocation failed'): print ("Warning, memory allocation failed. Serving response code 500"+" -> "+error_str) response_headers = self._gen_headers(500) if (request_method == 'GET'): response_content = b"<html><body><p>Error 500: Memory allocation failed</p><p>Python HTTP server</p><p><a href='/'>Back to home</a></p></body></html>" else: print ("Warning, file not found from GET. Serving response code 404\n", e) response_headers = self._gen_headers( 404) if (request_method == 'GET'): response_content = b"<html><head><meta charset='utf-8'><title>LoRa</title></head><body><p>Error 404: File not found</p><p>Python HTTP server</p><p><a href='/'>Back to home</a></p></body></html>" server_response = response_headers.encode() # return headers for GET and HEAD if (request_method == 'GET'): server_response += response_content # return additional content for GET only s_left.send(server_response) if (self.modep == 1): print ("Closing connection with client") ufun.set_led_to(OFF) s_left.close() # POST method elif (request_method == 'POST'): ## Load file content try: if (file_requested.find("execposthandler") != -1): if (self.modep == 1): print ("... PM: running python code") print ("DEBUG Server: lenght message:", len(treqbody)) if (len(treqbody) > 25): self.form = treqbody response_content, self.dest_lora_address = posthandler.run(treqbody,self.s_right,self.loramac,self.userR,0, self.modep) else: if (self.modep == 1): print ("... PM: empty POST received") response_content = b"<html><body><p>Error: EMPTY FORM RECEIVED, Please Check Again</p><p>Python HTTP server</p><p><a href='/'>Back to home</a></p></body></html>" elif (file_requested.find("tabla") != -1): if (self.modep == 1): print ("DEBUG Server: Checking Messages") if (self.modep == 2): print ("Checking Messages") if (self.modep == 3): print ("Checking messages") gc.collect() tabla = BaseDatos(self.modep) response_content = tabla.consulta(self.userR) elif (file_requested.find("registro") != -1): if (self.modep == 1): print ("DEBUG Server: Register") print ("DEBUG Server: lenght user:"******"DEBUG Server: treqbody:", treqbody) tabla = BaseDatos(self.modep) if (len(treqbody) > 12 ): response_content,self.userR = tabla.ingresoRegistro(treqbody,0) gc.collect() print ("Register Ok") else: print ("... PM: empty POST received") response_content = b"<html><body><p>Error: Please Choose a username</p><p>Python HTTP server</p><p><a href='/'>Back to home</a></p></body></html>" # Handling sensors data: START elif (file_requested.find("mqttproxypush") != -1): if (self.modep == 1): print ("DEBUG Server: MqttProxy PUSH request") print ("DEBUG Server: lenght user:"******"DEBUG Server: treqbody:", treqbody) if (len(treqbody) > 10 ): # to be adapted!!! print ("MqttProxy PUSH request Ok") response_content = b"<html><body><p>MqttProxy PUSH request</p><p>Python HTTP server</p><p><a href='/'>Back to home</a></p></body></html>" else: print ("MqttProxy request ERROR") response_content = b"<html><body><p>ERROR MqttProxy PUSH request</p><p>Python HTTP server</p><p><a href='/'>Back to home</a></p></body></html>" # value 3 in "broadcast field" indicates that is anycasting, that is the closest with the service response_content, self.dest_lora_address = posthandler.run(treqbody,self.s_right,self.loramac,self.userR,3, self.modep) elif (file_requested.find("mqttproxypop") != -1): if (self.modep == 1): print ("DEBUG Server: MqttProxy POP request") print ("DEBUG Server: lenght user:"******"DEBUG Server: treqbody:", treqbody) if (len(treqbody) > 10 ): # to be adapted!!! print ("MqttProxy POP request Ok") response_content = b"<html><body><p>MqttProxy POP request</p><p>Python HTTP server</p><p><a href='/'>Back to home</a></p></body></html>" else: print ("MqttProxy request ERROR") response_content = b"<html><body><p>ERROR MqttProxy POP request</p><p>Python HTTP server</p><p><a href='/'>Back to home</a></p></body></html>" gc.collect() tabla = BaseDatos(self.modep) response_content = tabla.consulta("mqttproxy") # Handling sensors data: END elif (file_requested.find("broadcast") != -1): if (self.modep == 1 | self.modep ==2 ): print ("AM: Sending Message Broadcast") if (self.modep == 3): print ("Message Broadcast sent") gc.collect() tabla = BaseDatos(self.modep) response_content, self.dest_lora_address = posthandler.run(treqbody,self.s_right,self.loramac,self.userR,1, self.modep) elif (file_requested.find("telegram") != -1): print ("AM: Telegram Message") tabla = BaseDatos(self.modep) if (self.modep == 1): print ("DEBUG Server: lenght message:", len(treqbody)) if (len(treqbody) > 25): response_content, self.dest_lora_address = posthandler.run(treqbody,self.s_right,self.loramac,self.userR,2, self.modep) else: print ("... AM: empty POST received") response_content = b"<html><body><p>Error: EMPTY FORM RECEIVED, Please Check Again</p><p>Python HTTP server</p><p><a href='/'>Back to home</a></p></body></html>" elif (file_requested.find("resend") != -1): if (self.modep == 1): print ("DEBUG Server: Resending message") response_content = posthandler.resend(self.form, self.s_right, self.loramac, self.userR, self.dest_lora_address, self.modep) else: file_handler = open(file_requested,'rb') response_content = file_handler.read() # read file content file_handler.close() response_headers = self._gen_headers(200) except Exception as e: # in case file was not found, generate 404 page print ("Warning, file not found. Serving response code 404\n", e) response_headers = self._gen_headers(404) response_content = b"<html><body><p>Error 404: File not found</p><p>Python HTTP server</p><p><a href='/'>Back to home</a></p></body></html>" server_response = response_headers.encode() # return headers server_response += response_content # return additional content s_left.send(server_response) if (self.modep == 1): print ("Closing connection with client") ufun.set_led_to(OFF) s_left.close() else: print ("Unknown HTTP request method:", request_method)
def _wait_for_connections(self,s_left,addr,treq): #determine request method (HEAD and GET are supported) (PM: added support to POST ) request_method = treq.split(' ')[0] print ("Method: ", request_method) print ("Full HTTP message: -->") print (treq) print ("<--") treqhead = treq.split("\r\n\r\n")[0] treqbody = treq[len(treqhead):].lstrip() # PM: makes easier to handle various types of newlines print ("only the HTTP body: -->") print (treqbody) print ("<--") # split on space "GET /file.html" -into-> ('GET','file.html',...) file_requested = treq.split(' ') if DEBUG_MODE: print("File Requested: ", file_requested) if(file_requested==''): file_requested = '/index.html' file_requested = file_requested[1] # get 2nd element #Check for URL arguments. Disregard them file_requested = file_requested.split('?')[0] # disregard anything after '?' if (file_requested == '/'): # in case no file is specified by the browser file_requested = '/index.html' # load index.html by default elif (file_requested == '/favicon.ico'): # most browsers ask for this file... file_requested = '/index.html' # ...giving them index.html instead file_requested = self.www_dir + file_requested print ("Serving web page [",file_requested,"]") # GET method if (request_method == 'GET') | (request_method == 'HEAD') : ## Load file content try: gc.collect() print("mem_free: ", gc.mem_free()) file_handler = open(file_requested,'rb') if (request_method == 'GET'): #only read the file when GET response_content = file_handler.read() # read file content file_handler.close() response_headers = self._gen_headers( 200) except Exception as e: #in case file was not found, generate 404 page error_str = str(e) if (error_str[:24] == 'memory allocation failed'): print ("Warning, memory allocation failed. Serving response code 500"+" -> "+error_str) response_headers = self._gen_headers(500) if (request_method == 'GET'): response_content = b"<html><body><p>Error 500: Memory allocation failed</p><p>Python HTTP server</p><p><a href='/'>Back to home</a></p></body></html>" else: print ("Warning, file not found from GET. Serving response code 404\n", e) response_headers = self._gen_headers( 404) if (request_method == 'GET'): response_content = b"<html><head><meta charset='utf-8'><title>LoRa</title></head><body><p>Error 404: File not found</p><p>Python HTTP server</p><p><a href='/'>Back to home</a></p></body></html>" server_response = response_headers.encode() # return headers for GET and HEAD if (request_method == 'GET'): server_response += response_content # return additional conten for GET only s_left.send(server_response) print ("Closing connection with client") ufun.set_led_to(OFF) s_left.close() # POST method elif (request_method == 'POST'): ## Load file content try: if (file_requested.find("execposthandler") != -1): print("... PM: running python code") if DEBUG_MODE: print("DEBUG: lenght message:",len(treqbody)) if (len(treqbody) > 25): response_content = posthandler.run(treqbody,self.s_right,self.loramac,self.userR,0) else: print("... PM: empty POST received") response_content = b"<html><body><p>Error: EMPTY FORM RECEIVED, Please Check Again</p><p>Python HTTP server</p><p><a href='/'>Back to home</a></p></body></html>" elif (file_requested.find("tabla") != -1): print("AM: Checking Messages") tabla=BaseDatos() response_content = tabla.consulta(self.userR) elif (file_requested.find("registro") != -1): print("AM: Register") if DEBUG_MODE: print("DEBUG: lenght user:"******"DEBUG: treqbody:",treqbody) tabla=BaseDatos() if (len(treqbody) > 12 ): response_content,self.userR = tabla.ingresoRegistro(treqbody) print("Register Ok") else: print("... PM: empty POST received") response_content = b"<html><body><p>Error: Please Choose a username</p><p>Python HTTP server</p><p><a href='/'>Back to home</a></p></body></html>" elif (file_requested.find("broadcast") != -1): print("AM: Sending Message Broadcast") tabla=BaseDatos() response_content = posthandler.run(treqbody,self.s_right,self.loramac,self.userR,1) elif (file_requested.find("telegram") != -1): print("AM: Telegram Message") tabla=BaseDatos() if DEBUG_MODE: print("DEBUG: lenght message:",len(treqbody)) if (len(treqbody) > 25): response_content = posthandler.run(treqbody,self.s_right,self.loramac,self.userR,2) else: print("... AM: empty POST received") response_content = b"<html><body><p>Error: EMPTY FORM RECEIVED, Please Check Again</p><p>Python HTTP server</p><p><a href='/'>Back to home</a></p></body></html>" else: file_handler = open(file_requested,'rb') response_content = file_handler.read() # read file content file_handler.close() response_headers = self._gen_headers(200) except Exception as e: #in case file was not found, generate 404 page print ("Warning, file not found. Serving response code 404\n", e) response_headers = self._gen_headers(404) response_content = b"<html><body><p>Error 404: File not found</p><p>Python HTTP server</p><p><a href='/'>Back to home</a></p></body></html>" server_response = response_headers.encode() # return headers server_response += response_content # return additional content s_left.send(server_response) print ("Closing connection with client") ufun.set_led_to(OFF) s_left.close() else: print("Unknown HTTP request method:", request_method)