Python httplib и POST

В настоящее время я работаю с фрагментом кода, который был написан кем-то другим. Он использует httplib для выполнения запросов к серверу. В нем все данные представлены в правильном формате - например, тело сообщения, значения заголовка и т. Д.

Проблема в том, что каждый раз, когда он пытается отправить POST-запрос, данные присутствуют - я вижу их на клиенте. сторона, однако на сервер ничего не приходит. Я прочитал спецификацию библиотеки, и использование кажется правильным.

Извлеченные вызовы библиотеки выглядят следующим образом:

import httplib

conn = httplib.HTTPConnection('monkeylabs.pl', 80)
conn.connect()
request = conn.putrequest('POST', '/api/snippet/')
headers = {}
headers['Content-Type'] = 'application/json'
headers['User-Agent'] = 'Envjs/1.618 (SpyderMonkey; U; Linux x86_64 2.6.38-10-generic;  pl_PL.utf8; rv:2.7.1) Resig/20070309 PilotFish/1.3.pre03'
headers['Accept'] = '*/*'
for k in headers:
    conn.putheader(k, headers[k])
conn.endheaders()

conn.send('[{"id":"route"}]')

resp = conn.getresponse()
print resp.status
print resp.reason
print resp.read()

conn.close()

Это какая-то известная проблема или что? Я использую Python 2.7. Не знаю, как проверить версию httplib.

Пожалуйста, не предлагайте заменять httplib на что-то другое, если только это не что-то действительно похожее (возможно, httplib2). Как я сказал, код не мой, и его гораздо больше, чем то, что я только что опубликовал выше. Рефакторинг может вызвать серьезную проблему. Меня интересуют любые надежные обходные пути.

EDIT

Вывод отладки:

send: 'POST /api/snippet/ HTTP/1.1\r\nHost: monkeylabs.pl\r\nAccept-Encoding: identity\r\nContent-Type: application/json\r\nAccept: */*\r\nUser-Agent: Envjs/1.618 (SpyderMonkey; U; Linux x86_64 2.6.38-10-generic; pl_PL.utf8; rv:2.7.1) Resig/20070309 PilotFish/1.3.pre03\r\n\r\n[{"id":"route"}]'
reply: 'HTTP/1.0 201 CREATED\r\n'
header: Date: Fri, 10 Jun 2011 23:54:00 GMT
header: Server: WSGIServer/0.1 Python/2.7.1+
header: Vary: Cookie
header: Content-Type: application/json
header: Content-Length: 0
201
CREATED

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

[11/Jun/2011 01:54:00] "POST /api/snippet/ HTTP/1.1" 201 0

И эти три строки:

``
<QueryDict: {}>
<QueryDict: {}>

из:

print '`%s`' % request.raw_post_data
print request.GET
print request.POST

на сервере Django. Кажется, он пытается отправить тело, но не отправляет его в конце.

EDIT (2)

Хорошо, я сделал дамп, и он действительно сказал мне, что в сообщении, отправленном из браузера, есть дополнительный параметр Content-Length, который не используется при обычном использовании библиотеки. Глупый я.

7
задан julkiewicz 11 June 2011 в 00:51
поделиться