def login(self): self.log("Trying to connect with uid", self.uid, "and token", self.token) self._sock = socket.socket() # set keepalive when supported # self._sock.setsockopt(socket.SOL_SOCKET,socket.SO_KEEPALIVE,1) # self._sock.setsockopt(socket.IPPROTO_TCP,socket.TCP_KEEPIDLE,20000) # self._sock.setsockopt(socket.IPPROTO_TCP,socket.TCP_KEEPINTVL,5) # self._sock.setsockopt(socket.IPPROTO_TCP,socket.TCP_KEEPCNT,3) self._client = streams.SocketStream(self._sock) try: if not self.ip: self.ip = __builtins__.__default_net["sock"][0].gethostbyname( self.address) self._sock.connect((self.ip, self.port)) except: self.log("Can't connect!") self._closeall() return False try: vminfo = vm.info() data = { "uid": self.uid, "token": self.token, "platform": vminfo[1], "vmuid": vminfo[0], "hearbeat": self.heartbeat, } try: rec = fota.get_record() data["ota"] = True if rec[0]: data["bc"] = rec[4] data["vm"] = rec[1] data["chunk"] = rec[8] except: data["ota"] = False self._send(data) msg = self._getmsg() if "err" in msg: self.log("oops, error", msg) self._closeall() return False if "ts" in msg: self.ts = msg["ts"] #current time if "htbm" in msg: self.heartbeat = msg["htbm"] try: fota.accept() except: pass except Exception as e: self.log("Login exception!", e) self._closeall() return False return True
def _verb(url, data=None, params=None, headers=None, connection=None, verb=None, ctx=None, stream_callback=None, stream_chunk=512): urlp = urlparse.parse(url) netl = urlparse.parse_netloc(urlp[1]) host = netl[2] # print(verb,urlp,netl) if connection: sock = connection else: sock = _connect(host, netl[3], urlp[0], ctx) # print("CREATED SOCKET",sock.channel) #Generate and send Request Line msg = bytearray(BUFFER_LEN) p = 0 endline = "\r\n" p = add_to_buffer(msg, verb, p) p = add_to_buffer(msg, " ", p) if not urlp[2]: p = add_to_buffer(msg, "/", p) else: p = add_to_buffer(msg, urlp[2], p) if (verb in zverbs) and (urlp[-2] or params): p = add_to_buffer(msg, "?", p) if urlp[-2]: p = add_to_buffer(msg, urlp[-2], p) if params: p = add_to_buffer(msg, "&", p) if params: p = add_to_buffer(msg, urlparse.urlencode(params), p) if msg[p - 1] != __ORD(" "): p = add_to_buffer(msg, " ", p) p = add_to_buffer(msg, "HTTP/1.1", p) p = add_to_buffer(msg, endline, p) __elements_set(msg, p) #clamp buffer #send cmd try: # print(">>",msg) sock.sendall(msg) except Exception as e: sock.close() raise HTTPConnectionError __elements_set(msg, BUFFER_LEN) p = 0 #Generated and send Request headers p = add_to_buffer(msg, "Host: ", p) p = add_to_buffer(msg, host, p) if netl[3]: p = add_to_buffer(msg, ":", p) p = add_to_buffer(msg, netl[3], p) p = add_to_buffer(msg, endline, p) __elements_set(msg, p) # print(">>",msg) sock.sendall(msg) __elements_set(msg, BUFFER_LEN) p = 0 rh = {} if headers: for k in headers: rh[k.lower()] = headers[k] if "connection" not in rh: rh["connection"] = "close" if data is not None: rh["content-length"] = str(len(data[0])) #data[0] is actual data rh["content-type"] = data[1] #data[1] is data type header for k, v in rh.items(): p = add_to_buffer(msg, k, p) p = add_to_buffer(msg, ": ", p) p = add_to_buffer(msg, v, p) p = add_to_buffer(msg, endline, p) __elements_set(msg, p) # print(">>",msg) sock.sendall(msg) __elements_set(msg, BUFFER_LEN) p = 0 # Generate and send Body p = add_to_buffer(msg, endline, p) if data is not None: p = add_to_buffer(msg, data[0], p) __elements_set(msg, p) # print(">>",msg) sock.sendall(msg) __elements_set(msg, BUFFER_LEN) p = 0 #Parse Response rr = Response() ssock = streams.SocketStream(sock) buffer = msg msg = _readline(ssock, buffer, 0, BUFFER_LEN) # print("<<",msg) if msg.startswith("HTTP/1.1"): rr.status = int(msg[9:12]) __elements_set(msg, BUFFER_LEN) msg = _readline(ssock, buffer, 0, BUFFER_LEN) # print("<<",msg) #print(msg) #print(">[",msg,"]",msg=="\n",msg==endline) while not (msg == endline or msg == "\n"): idx_cl = msg.find(__ORD(":")) if idx_cl < 0: sock.close() raise HTTPResponseError rr.headers[str(msg[0:idx_cl].lower())] = str(msg[idx_cl + 1:-2].strip(endline)) __elements_set(msg, BUFFER_LEN) msg = _readline(ssock, buffer, 0, BUFFER_LEN) # print("<<",msg) # print(msg) #print(">[",msg,"]",msg=="\n",msg==endline) #print(rr.headers) rr.connection = sock if "content-length" in rr.headers: bodysize = int(rr.headers["content-length"]) #print("bodysize",bodysize) contentsize = bodysize reset_content = False if stream_callback is not None: reset_content = True contentsize = stream_chunk rr.content = bytearray(contentsize) tmp = 0 rdr = 0 while bodysize > 0: if reset_content: ofs = 0 else: ofs = tmp rdr = sock.recv_into(rr.content, min(bodysize, contentsize), ofs=ofs) if rdr and stream_callback: __elements_set(rr.content, rdr) stream_callback(rr.content) #print(rdr,rr.content[tmp:tmp+rdr]) tmp += rdr bodysize -= rdr if not rdr: break #print("CLOSED SOCKET A",sock.channel,rdr,tmp,bodysize) sock.close() rr.connection = None elif "transfer-encoding" in rr.headers: while True: __elements_set(msg, BUFFER_LEN) msg = _readline(ssock, buffer, 0, BUFFER_LEN) chsize = int(msg, 16) #print("chsize",chsize) if chsize: msg = sock.recv(chsize) #print(msg) if msg: rr.content.extend(msg) else: break __elements_set(buffer, BUFFER_LEN) msg = _readline(ssock, buffer, 0, BUFFER_LEN) else: __elements_set(buffer, BUFFER_LEN) msg = _readline(ssock, buffer, 0, BUFFER_LEN) #terminator break #print("CLOSED SOCKET B",sock.channel) sock.close() else: while True: tmp = sock.recv(32) if tmp: rr.content.extend(tmp) #print(tmp) else: break #print("CLOSED SOCKET C",sock.channel) sock.close() rr.connection = None return rr
sock.bind(80) sock.listen() while True: try: # Type in your browser the board ip! print("Waiting for connection...") # here we wait for a connection clientsock, addr = sock.accept() print("Incoming connection from", addr) # yes! a connection is ready to use # first let's create a SocketStream # it's like a serial stream, but with a socket underneath. # This way we can read and print to the socket client = streams.SocketStream(clientsock) # let's read all the HTTP headers from the browser # stop when a blank line is received line = client.readline() while line != "\n" and line != "\r\n": line = client.readline() print("HTTP request received!") # let's now send our headers (very minimal) # hint: \n is added by print print("HTTP/1.1 200 OK\r", stream=client) print("Content-Type: text/html\r", stream=client) print("Connection: close\r\n\r", stream=client) # see? as easy as print! print("<html><body>Hello Zerynth!",