Py学习  »  Python

python中纯套接字上的http服务器

Alex Q. • 5 年前 • 572 次点击  

我试图用python编写非常简单的http服务器。工作版本如下:

def run(self, host='localhost',port=8000):
    with socket.socket(socket.AF_INET,socket.SOCK_STREAM) as s:
        s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        s.bind((host,port))
        s.listen(1)
        while True:
            connection, adress = s.accept()
            with connection:
                data = b''
                while True:
                    recived = connection.recv(1024)
                    data += recived
                    if len(recived) < 1024:
                        break

                if data != b'':
                    handle_request(data,connection)

这很管用,但我有点误会。 据我所知,socket“s”接受来自客户端的连接->并返回新的socket对象“connection”,从中我可以读取客户端发送给我的内容并发送响应。我从连接读取数据,直到客户端发送空行B''。在此之后,TCP部分结束,我将接收的字节传递给处理程序,处理程序将接收的数据解析为HTTP。

qestions:此时,我读取了客户端发送给我的所有数据,但是如果我想限制http请求的最大大小,我应该这样做:

..................................

    with connection:
        data = b''
        request_size_limit=1024*100 # some desired http request max size
        while True:
            recived = connection.recv(1024)
            data += recived
            if len(recived) < 1024 or len(data) > request_size_limit:
                break             
            if data != b'':
                handle_request(data,connection)
  1. 如果我这样做,我如何通知客户机,例如,我有最多1024*1024个可用的内存字节,我不能处理比这更大的请求?
  2. 如果客户想发送更多的这个限制,他必须发送几个分开的请求,将包含1部分必要的数据?
  3. 例如,对于大POST请求,我必须解析每个ReV(1024),而我发现\r\n\r\n序列,将内容长度和ReCVE()内容长度由1024b部分检查到一些文件中,然后继续进行?
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/46332
 
572 次点击  
文章 [ 1 ]  |  最新文章 5 年前
Cupcake Protocol
Reply   •   1 楼
Cupcake Protocol    6 年前

A1)如果由于请求太大而无法处理,请考虑关闭连接。或者,您可以读取(并丢弃)它们发送的所有内容,然后用413请求进行响应。

A2)你需要制定一个协议,每次只发送一部分请求。http并不是以本机的方式实现这一点。

A3)如果你能将整个请求分成块读取并保存到一个文件中,那么听起来你有一个1024*1024内存限制的解决方案,不是吗?

但要解决从套接字读取分块数据的问题。