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

Posted

技术标签:

【中文标题】如何使 spydlay 模块像 httplib/http.client 一样工作?【英文标题】:How to make spydlay module to work like httplib/http.client? 【发布时间】:2014-02-12 07:40:52 【问题描述】:

我必须测试基于 Jetty 的服务器。该服务器可以使用自己的协议、HTTP、HTTPS,最后它开始支持 SPDY。我有一些基于httplib /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)

客户端使用本机协议共享 httplib API,因此 connection 可能是本机、HTTPConnectionHTTPSConnection

现在我想使用spdylay 模块添加 SPDY 测试。但是它的界面是不透明的,我不知道如何将它的不透明性更改为类似于httplib 界面的东西。我已经根据示例制作了测试客户端,但是 spdylay.urlfetch() 的第二个参数是类名而不是对象,我不知道如何在我的测试中使用它。我已经向我的类的 on_close() 方法添加了测试,该方法扩展了 spdylay.BaseSPDYStreamHandler,但它与其他测试不兼容。如果是实例,我会在 spdylay.urlfetch() 调用之外使用它。

如何在基于httplib 接口的代码中使用spydlay

【问题讨论】:

Jetty 还提供了一个 SPDY 客户端,可用于负载测试,例如:github.com/eclipse/jetty.project/blob/master/jetty-spdy/…。 我已经有工作的 SPDY 客户端:spydlay 工作,但工作方式与 httplib 不同。我想在我的测试应用程序中使用它是我的问题,并且我希望它能够像其他客户端一样工作。 @sborder -- 我考虑您关于使用 Jetty 客户端测试 Jetty 服务器的想法 :-) 我将尝试使用 Jython。它可能比spydlay 更容易使用,因为它不使用本机库。 【参考方案1】:

我唯一的想法是使用全局字典,其中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')

希望有人能把spdy_simply_get(url)做得更好。

【讨论】:

以上是关于如何使 spydlay 模块像 httplib/http.client 一样工作?的主要内容,如果未能解决你的问题,请参考以下文章

在线OJ项目

如何使模块导入已导入模块的模块

cpp-httplib 中的 HTTPS 给 Segfault

如何正确链接/包含 c++ 库

如何使 UIView 像 UITableviewCell 中的 Ticket

如何使自定义 UIView 与 UINavigationBar 结合使其看起来像一个