栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何仅使用套接字库使用Python正确发送HTTP响应?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何仅使用套接字库使用Python正确发送HTTP响应?

根据问题变化而更新

可能,它一直在旋转,因为在缺少

Content-Length
Connection
标头的情况下,浏览器可能会假设它是
Connection:keep-alive
,因此它将继续永远从服务器接收数据。尝试发送
Connection: close
,并通过实际值
Content-Length
以查看是否有帮助。


这不会如您所愿吗?:)

#!/usr/bin/env python# coding: utf8import socketMAX_PACKET = 32768def recv_all(sock):    r'''Receive everything from `sock`, until timeout occurs, meaning sender    is exhausted, return result as string.'''    # dirty hack to simplify this stuff - you should really use zero timeout,    # deal with async socket and implement finite automata to handle incoming data    prev_timeout = sock.gettimeout()    try:        sock.settimeout(0.01)        rdata = []        while True: try:     rdata.append(sock.recv(MAX_PACKET)) except socket.timeout:     return ''.join(rdata)        # unreachable    finally:        sock.settimeout(prev_timeout)def normalize_line_endings(s):    r'''Convert string containing various line endings like n, r or rn,    to uniform n.'''    return ''.join((line + 'n') for line in s.splitlines())def run():    r'''Main loop'''    # Create TCP socket listening on 10000 port for all connections,     # with connection queue of length 1    server_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM,           socket.IPPROTO_TCP)    server_sock.bind(('0.0.0.0', 13000))    server_sock.listen(1)    while True:        # accept connection        client_sock, client_addr = server_sock.accept()        # headers and body are divided with nn (or rnrn - that's why we        # normalize endings). In real application usage, you should handle         # all variations of line endings not to screw request body        request = normalize_line_endings(recv_all(client_sock)) # hack again        request_head, request_body = request.split('nn', 1)        # first line is request headline, and others are headers        request_head = request_head.splitlines()        request_headline = request_head[0]        # headers have their name up to first ': '. In real world uses, they        # could duplicate, and dict drops duplicates by default, so        # be aware of this.        request_headers = dict(x.split(': ', 1) for x in request_head[1:])        # headline has form of "POST /can/i/haz/requests HTTP/1.0"        request_method, request_uri, request_proto = request_headline.split(' ', 3)        response_body = [ '<html><body><h1>Hello, world!</h1>', '<p>This page is in location %(request_uri)r, was requested ' % locals(), 'using %(request_method)r, and with %(request_proto)r.</p>' % locals(), '<p>Request body is %(request_body)r</p>' % locals(), '<p>Actual set of headers received:</p>', '<ul>',        ]        for request_header_name, request_header_value in request_headers.iteritems(): response_body.append('<li><b>%r</b> == %r</li>' % (request_header_name,         request_header_value))        response_body.append('</ul></body></html>')        response_body_raw = ''.join(response_body)        # Clearly state that connection will be closed after this response,        # and specify length of response body        response_headers = { 'Content-Type': 'text/html; encoding=utf8', 'Content-Length': len(response_body_raw), 'Connection': 'close',        }        response_headers_raw = ''.join('%s: %sn' % (k, v) for k, v in     response_headers.iteritems())        # Reply as HTTP/1.1 server, saying "HTTP OK" (pre 200).        response_proto = 'HTTP/1.1'        response_status = '200'        response_status_text = 'OK' # this can be random        # sending all this stuff        client_sock.send('%s %s %s' % (response_proto, response_status,  response_status_text))        client_sock.send(response_headers_raw)        client_sock.send('n') # to separate headers from body        client_sock.send(response_body_raw)        # and closing connection, as we stated before        client_sock.close()run()

有关更多详细说明,请参见HTTP协议的说明。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/660829.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号