http chunked 理解

https://imququ.com/post/transfer-encoding-header-in-http.html

复制代码
#! /usr/bin/python
#coding:utf8

import socket
import signal
import errno

from time import sleep

def sig_handler(signo, frame):
    print "get signo ", signo
    global runFlg
    runFlg = False
    global listeningFd
    listeningFd.shutdown(socket.SHUT_RD)

def http_response_with_content_length(sock):
    """ 有长度没有 close """
    sock.send('HTTP/1.1 200 OK\r\n')
    sock.send('Content-Length: 12\r\n')
    sock.send('\r\n')
    sock.send('Hello World!')

def http_response_with_close(sock):
    """" 没有长度有 close """
    sock.send('HTTP/1.1 200 OK\r\n')
    sock.send('\r\n')
    sock.send('Hello World!')
    sock.close()

def http_response_chunked(sock):
    """" 没有长度,没有 close """
    sock.send('HTTP/1.1 200 OK\r\n')
    sock.send('Transfer-Encoding: chunked\r\n')
    sock.send('\r\n')

    # 第一个 chunk
    sock.send('a\r\n')
    sock.send('1234567890\r\n')

    # 第二个 chunk
    sock.send('5\r\n')
    sock.send('12345\r\n')

    # 第三个 chunk,也是最后一个
    sock.send('0\r\n')
    sock.send('\r\n')

def http_response(sock):
    """" 没有长度,没有 close """
    sock.send('HTTP/1.1 200 OK\r\n')
    sock.send('\r\n')
    sock.send('Hello World!')

signal.signal(signal.SIGINT, sig_handler)

HOST = "127.0.0.1"
PORT = 37001

listeningFd = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
listeningFd.bind((HOST, PORT))
listeningFd.listen(2)

print "HttpServer Started"

runFlg = True
while runFlg:
    try:
        connectedFd, addr = listeningFd.accept()
    except socket.error as e:
        if e.errno == errno.EINT:
            print "get a except EINTR"
        else:
            raise
        continue
        
    if runFlg == False:
        break
        
    print "connected by ", addr
    
    data = connectedFd.recv(1024)
    if not data:
        break
    print data
    #http_response_with_close(connectedFd)               # 流量器能正确处理
    #http_response(connectedFd)                          # 浏览器不能正确处理 pending
    #http_response_with_content_length(connectedFd)      # 浏览器能正确处理
    http_response_chunked(connectedFd)                  # 浏览器能正确处理
else:
    print "runFlg ", runFlg
    
print "Done"
复制代码

 

posted @   WendellYih  阅读(1201)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· Ollama——大语言模型本地部署的极速利器
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· Windows编程----内核对象竟然如此简单?
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
点击右上角即可分享
微信分享提示