2012-05-11 1 views
0

У меня есть приложение Pyramid, которое блокирует определенные функции для соединений HTTPS.Как я могу эмулировать запрос HTTPS в WebTest?

Сервер находится под управлением nginx (обычно), и я использую PasteDeploy для обнаружения соединения HTTPS. С моей environment.ini:

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

Если соединение HTTPS, вставка развертывания устанавливает request.scheme переменную 'https'.

Я пытаюсь написать некоторые интегрированные тесты прямо сейчас, и я не могу понять, как получить TestApp, как это предусмотрено веб-тестированием, для обработки запроса, как если бы он был HTTPS.

ответ

0

Я попытался расчесывание через документы в третий раз, и понял, обходной путь, основанный на PasteDeploy (возможно правильное решение) ...

PasteDeploy ищет 2 заголовки, чтобы установить соединение по протоколу HTTPS. Я добавил их в заголовки dict, которые я использую для управления сессией cookie, и, похоже, сначала он работал нормально.

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

PasteDeploy имеет цепочку if/else, поэтому требуется только одна ... но отправка обеих работ.

PasteDeploy, похоже, не вызван - я вижу эти заголовки/элементы окружения в приложении, но https не установлен.

2

Убедитесь, что вы загружаете полный трубопровод WSGI, который включает в себя фильтры. Если вы этого не сделаете, заголовки не будут переведены промежуточным программным обеспечением. Обычно это означает вызов get_app на «main» вместо «myapp». Также я бы предложил попробовать вариант extra_environ WebTest, который может работать, поскольку в конечном итоге промежуточное программное обеспечение просто устанавливает environ['wsgi.url_scheme'].

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

вы могли бы описать это немного больше: Как правило, это означает, что вызов get_app на «основной» вместо «MYAPP». Основываясь на друг тестовых наборов, у меня есть по существу это: четкости setUpClass (ЦБС): cls.app = основной ({}, ** Настройка) Защиту нАлАдкИ (самостоятельно): self.app = TestApp (self.app) self.config = testing.setUp() защиту test__something (Я): self.app.get() Я попытался переходящим в wsgi.url_scheme к extra_environ - не повезло. Мне, возможно, придется реорганизовать код моих приложений, чтобы искать environment ['wsgi.url_scheme'] вместо request.scheme –

+0

"' cls.app = main ({}, ** settings) '' does ** not ** загрузите файл INI, таким образом, промежуточное ПО префикса не включено. Это означает, что вы сами должны выполнять работу промежуточного программного обеспечения и самостоятельно задавать параметр внешней среды 'wsgi.url_scheme'. Если вы хотите использовать промежуточное программное обеспечение, вы можете добавить его вручную 'app = paste.deploy.config.PrefixMiddleware (app)', или вы можете загрузить тестовый ini-файл 'app = pyramid.paster.get_app ('testing.ini # main') 'который будет загружать полный стек wsgi, определенный в разделе« main »INI. –

+0

Настройки были предварительно установлены как: settings = appconfig ('config:' + os.path.join (здесь, '../../', 'development.ini')) Я понимаю, что теперь функция get_app , собирается попробовать. благодаря тонну. –