2012-05-11 165 views
0

我有一个金字塔应用程序,可以将某些功能锁定到HTTPS连接。如何模拟WebTest下的HTTPS请求?

服务器由nginx(通常)前端,我使用PasteDeploy检测HTTPS连接。从我environment.ini:

[filter:proxy-prefix] 
use = egg:PasteDeploy#prefix 

如果连接是HTTPS,粘贴部署设置request.scheme变量'https'

我正试图编写一些集成的测试,我似乎无法弄清楚如何让webtest提供的TestApp处理请求,就好像它是HTTPS一样。

回答

0

我试图通过梳理文档第三次,并推断出了基于PasteDeploy一种解决方法(也许是正确的解决方案)......

PasteDeploy查找2头设置HTTPS连接。我将它们添加到头文件字典中,我用它来管理cookie会话,并且它起初看起来工作正常。

{ 
    "HTTP_X_FORWARDED_SCHEME" : 'https', 
    "HTTP_X_FORWARDED_PROTO" : 'https', 
} 

PasteDeploy有一个if/else链,所以只需要一个...但是同时提交这两个作品。

虽然PasteDeploy似乎没有被调用 - 我在应用程序中看到这些标头/环境项,但未设置https。

2

确保您正在加载包含过滤器的完整WSGI管道。如果你不是,那么头文件不会被中间件翻译。通常这意味着在“main”而不是“myapp”上调用get_app。另外我会建议尝试WebTest的extra_environ选项,这可能会起作用,因为最终中间件只是设置environ['wsgi.url_scheme']

testapp.get('/foo', extra_environ={'wsgi.url_scheme': 'https'}) 
+0

你能介绍更多这一点: 一般来说,这意味着呼吁“主”,而不是“MYAPP” get_app。 基于其他的测试套件,我有这个本质: 高清setUpClass(CLS): cls.app =主({} **设置) 画质设置(个体经营): self.app = TestApp (self.app) self.config = testing.setUp() 高清test__something(个体经营): self.app.get() 我试图在wsgi.url_scheme传递给extra_environ - 没有运气。 我可能不得不重构我的应用代码来查找environ ['wsgi.url_scheme']而不是request.scheme –

+0

“'cls.app = main({},** settings)'”does ** not **加载INI文件,因此不包括前缀中间件。这意味着你必须自己完成中间件的工作,并自己设置'wsgi.url_scheme' environ参数。如果你想要中间件,你可以手动添加它'app = paste.deploy.config.PrefixMiddleware(app)',或者你可以加载一个测试ini文件'app = pyramid.paster.get_app('testing.ini#main') '这将加载由INI的“main”部分定义的完整wsgi堆栈。 –

+0

设置先前设置为: settings = appconfig('config:'+ os.path.join(here,'../../','development.ini')) 我明白了get_app功能。去尝试它。万分感谢。 –