如何使spydlay模块像httplib一样工作/http.client?

2024-04-29 00:46:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我必须测试基于Jetty的服务器。这个服务器可以使用自己的协议,HTTP,HTTPS,最后它开始支持SPDY。我有一些基于^{}/http.client的压力测试——每个线程以相似的URL开始(查询字符串中的一些数据是可变的),向全局变量添加执行时间,每隔几秒钟显示一些统计信息。代码如下所示:

t_start = time.time()
connection.request("GET", path)
resp = connection.getresponse()
t_stop = time.time()
check_response(resp)
QRY_TIMES.append(t_stop - t_start)

使用本机协议共享httplibAPI的客户端,因此connection可能是本机的HTTPConnectionHTTPSConnection。你知道吗

现在我想使用^{}模块添加SPDY测试。但是它的接口是不透明的,我不知道如何将它的不透明性变成类似于httplib接口的东西。我已经基于示例创建了测试客户机,但是spdylay.urlfetch()的第二个参数是类名而不是对象,我不知道如何在测试中使用它。我已经向类的on_close()方法添加了测试,该方法扩展了spdylay.BaseSPDYStreamHandler,但它与其他测试不兼容。如果是实例,我会在spdylay.urlfetch()调用之外使用它。你知道吗

如何在基于httplib接口的代码中使用spydlay?你知道吗


Tags: 方法代码服务器http协议timeconnectionresp
1条回答
网友
1楼 · 发布于 2024-04-29 00:46:00

我唯一的想法是使用全局字典,其中url是键,handler对象是值。这并不理想,因为:

  • 具有相同url的新查询将覆盖以前的响应
  • 很容易忘记从全局字典中释放handler

但它是有效的!你知道吗

import sys
import spdylay

CLIENT_RESULTS = {}


class MyStreamHandler(spdylay.BaseSPDYStreamHandler):
    def __init__(self, url, fetcher):
        super().__init__(url, fetcher)
        self.headers = []
        self.whole_data = []

    def on_header(self, nv):
        self.headers.append(nv)

    def on_data(self, data):
        self.whole_data.append(data)

    def get_response(self, charset='UTF8'):
        return (b''.join(self.whole_data)).decode(charset)

    def on_close(self, status_code):
        CLIENT_RESULTS[self.url] = self


def spdy_simply_get(url):
    spdylay.urlfetch(url, MyStreamHandler)
    data_handler = CLIENT_RESULTS[url]
    result = data_handler.get_response()
    del CLIENT_RESULTS[url]
    return result


if __name__ == '__main__':
    if ' test' in sys.argv:
        spdy_response = spdy_simply_get('https://localhost:8443/test_spdy/get_ver_xml.hdb')

我希望有人能做得更好。你知道吗

相关问题 更多 >