Example #1
0
    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
Example #2
0
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
Example #3
0
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!",