2016-06-28 4 views
0

Я переношу простой набор инструментов с python 2.7 на 3.5, а один из инструментов - простой веб-сервер с использованием web.py.Как закрыть соединение

К сожалению, web.py недоступен для 3.5, но для этого я переключился на bottle.py.

Согласно спецификации интерфейса я создаю мне нужно, чтобы закрыть соединение, которое я могу сделать довольно легко в web.py, добавив следующую строку:

web.header('Connection', 'close') 

Но используя бутылку я получаю ошибка, что хмель-на-хоп заголовки не допускается, когда я делаю следующее:

response.add_header('Connection', 'close') 

Как добавить этот заголовок в ответ так или иначе? Я прочитал документацию о бутылках, обыскал в Интернете и просмотрел код бутылки.

+1

Бутылка - это структура WSGI, а протокол [WSGI] (https://www.python.org/dev/peps/pep-0333/) явно запрещает устанавливать заголовки переходов по ходу: 'Приложения и промежуточное программное обеспечение запрещено использовать функции HTTP/1.1 "hop-by-hop" или заголовки. Возможно, вы можете убедить сервер http установить заголовок. Но вы уверены, что вам нужно установить это вручную, не должен ли сервер http уже иметь дело с этим? Или это какой-то пользовательский протокол HTTP, с которым вы имеете дело? – syntonym

+0

Это на самом деле объясняет довольно много. Но мне нужно отправить Connection: закрыть в заголовке клиенту по той причине, что некоторые клиенты не обрабатывают ответ в противном случае. –

+0

Вы используете встроенный сервер разработки бутылок? Вероятно, вы должны использовать это только для разработки. – syntonym

ответ

2

Я не уверен, что так я пишу с солью.

Сервер разработки бутылок - это слегка модифицированный сервер wsgiref, который является sligthly-модифицированным сервером http.server. У него нет простых способов или конфигураций для отправки «необычных» заголовков. Вы можете подклассифицировать его и написать некоторый код. Я думаю, этого должно быть достаточно, чтобы перезаписать метод send_head (here) и включить self.send_header("Connection", "close").

Вы можете использовать его с помощью любого сервера wsgi, который вам нравится. Он имеет встроенную поддержку для некоторых серверов, но любой сервер wsgi должен иметь возможность обслуживать приложение. Возможно, для других серверов есть более простой способ отправки пользовательского заголовка.

Также http.server не предназначен для производства, поэтому вы можете изменить его, даже если вы можете заставить свой заголовок работать. Если это только для внутреннего использования, вы можете уйти от использования.

+0

Это, оказывается, правильный ответ. Кажется, что бутылка активно предотвращает установку этого, поскольку он не является частью протокола wsgi, это должно быть установлено на самом сервере, а не в приложении, запущенном на сервере. –