为什么我会看到Python BaseHTTPServer的随机读错误?

时间:2011-07-14 17:23:20

标签: python http sockets concurrency mocking

我有调用外部HTTP服务的Python代码。我想通过设置模拟这些外部服务的模拟HTTP服务器来测试此代码。我这样做是通过在一个单独的线程中启动BaseHTTPServer,然后从主线程调用该服务器。它看起来像这样:

import BaseHTTPServer, httplib, threading, time

class MockHandler(BaseHTTPServer.BaseHTTPRequestHandler):
    def do_POST(self):
        self.send_response(200)
        self.send_header('Content-Type', 'application/json')
        self.end_headers()
        self.wfile.write('{"result": "success"}')

class ServerThread(threading.Thread):
    def run(self):
        svr = BaseHTTPServer.HTTPServer(('127.0.0.1', 8540), MockHandler)
        svr.handle_request()

ServerThread().start()
time.sleep(0.1)             # Give the thread some time to get up

conn = httplib.HTTPConnection('127.0.0.1', 8540)
conn.request('POST', '/', 'foo=bar&baz=qux')
resp_body = conn.getresponse().read()

但是,read()调用中的某些请求失败,socket.error: [Errno 104] Connection reset by peer。我可以使用Python 2.6在几台机器上以不同的频率重现它,但不是2.7。

但最有趣的是,如果我不发送POST数据(即如果我省略了conn.request()的第三个参数),则不会发生错误。

这可能是什么?

或者,是否有另一种快速简便的方法可以在Python中设置模拟HTTP服务器?

1 个答案:

答案 0 :(得分:1)

“...在一个单独的线程中,然后从主线程调用该服务器。”

不要将线程用于此类事情。

使用流程。 subprocess.Popen(以及您的操作系统的正常功能)将更好地确保其正常工作。