V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
axisray
V2EX  ›  Python

BaseHTTPServer 写了个简易 HTTP 服务器,但是有时候 Response 没有头部,求大佬指点!

  •  
  •   axisray · 2018-08-03 23:22:51 +08:00 · 2900 次点击
    这是一个创建于 2064 天前的主题,其中的信息可能已经有所发展或是发生改变。

    就是一个很简单的 HTTP 服务器,响应任意 GET 请求,返回一个文件
    服务端用 clumsy 模拟乱序环境,乱序 10%
    然后在客户端抓包发现有时候服务端的 Response 没有 HTTP 头,不知道为什么……
    是 python 有 bug 还是我写的代码有问题?求大佬指点

    有头部的流

    GET /122879/122879.bat HTTP/1.1
    Host: 200.200.89.77:8832
    User-Agent: python-requests/2.18.4
    Accept-Encoding: gzip, deflate
    Accept: */*
    Connection: keep-alive
    
    HTTP/1.0 200 OK
    Server: BaseHTTP/0.6 Python/3.7.0
    Date: Fri, 03 Aug 2018 15:10:09 GMT
    Content-Length: 252416
    Last-Modified: Thu, 14 Sep 2017 05:05:10 GMT
    
    MZ......................@.............................................	.!..L.!This program cannot be run in DOS mode.
    
    $.......PE..L.....:1.................x...^......
    

    没有头部的流

    GET /122877/122877.bat HTTP/1.1
    Host: 200.200.89.77:8832
    User-Agent: python-requests/2.18.4
    Accept-Encoding: gzip, deflate
    Accept: */*
    Connection: keep-alive
    
    MZ......................@.............................................	.!..L.!This program cannot be run in DOS mode.
    
    $.......PE..L.....:1.................x...^......
    

    源代码

    from http.server import BaseHTTPRequestHandler
    from http.server import HTTPServer
    import datetime
    import os
    import shutil
    
    # Listen Address
    ADDR = ''
    # Listen Port
    PORT = 8832
    
    class WebRequestHandler(BaseHTTPRequestHandler):
        def do_GET(self):
            path = "./testb"
            try:
                f = open(path, 'rb')
            except IOError:
                self.send_error(404, "File not found")
                return None
            self.send_response(200)
            #self.send_header("Content-type", 'image/png')
            #self.send_header('Content-Disposition','attachment; filename=test.exe')
            fs = os.fstat(f.fileno())
            self.send_header("Content-Length", str(fs[6]))
            self.send_header("Last-Modified", self.date_time_string(fs.st_mtime))
            self.end_headers()  
            shutil.copyfileobj(f, self.wfile)
            f.close()
    
    server = HTTPServer((ADDR, PORT), WebRequestHandler)
    print("Server start!")
    server.serve_forever()
    
    
    第 1 条附言  ·  2018-08-04 10:58:52 +08:00
    散了散了,Wireshark 有 bug,导致乱序包重组失败,实际是有 HTTP 头的
    5 条回复    2018-08-06 10:57:29 +08:00
    mengzhuo
        1
    mengzhuo  
       2018-08-04 08:48:23 +08:00 via iPhone   ❤️ 1
    说明没走到 set header 逻辑里,需要打日志了
    axisray
        2
    axisray  
    OP
       2018-08-04 10:58:34 +08:00
    散了散了,Wireshark 有 bug,导致乱序包重组失败,实际是有 HTTP 头的
    anyele
        3
    anyele  
       2018-08-04 15:53:56 +08:00 via Android
    首先别怀疑编程语言有 bug
    axisray
        4
    axisray  
    OP
       2018-08-06 10:56:16 +08:00
    @anyele 我太相信 wireshark 了
    axisray
        5
    axisray  
    OP
       2018-08-06 10:57:29 +08:00
    我总以为这么历史悠久的软件怎么会有 BUG 呢?
    他还真有
    https://bugs.wireshark.org/bugzilla/show_bug.cgi?id=13517
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5400 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 08:58 · PVG 16:58 · LAX 01:58 · JFK 04:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.