Как я могу опубликовать более 64 КБ данных через метод запроса Python httplib2.Http? - PullRequest
0 голосов
/ 18 июня 2011

Если я сделаю это:

h = httplib2.Http(timeout=60)

resp, content = h.request(uri, method=method, body=body, headers=headers,
                          redirections=redirections,
                          connection_type=connection_type)

Если тело больше 64 КБ, данные будут обрезаны.

Это на 32-битной среде исполнения Python (я не думаю, что это происходит с 64-битной рабочей средой).

Как мне это сделать?

Вотвыпуск:

https://svn.macports.org/ticket/18376

Ответы [ 2 ]

1 голос
/ 23 июня 2011

Проблема, связанная с непатченной сборкой 2.6.6.Другими словами, это относится к известной ошибке, которая позже была исправлена.Видимо, я получил сборку Python, которая не включала это исправление.

Пожалуйста, смотрите этот пост для получения дополнительной информации об этой проблеме: https://svn.macports.org/ticket/18376

Исправленная версия установила HAVE_POLL = 0, заставляя python вместо этого использовать select.Убедитесь, что вы используете версию python, включающую этот патч, или если большие блоки данных будут зависать.

Еще одно решение - переписать метод отправки httplib.py, чтобы перехватить исключение '35' и повторно отправитьданные.

Вот код, который иллюстрирует это:

            blen = len(str)
            bleft = len(str)
            bpos = 0
            bsize = 1024*8
            while bleft > 0:
                bend = bpos + bsize
                if bend >= blen:
                    bend = blen
                try:
                    slen = self.sock.send(str[bpos:bend])
                except socket.error, v:
                    if v.args[0] == 35:      # unavailable
                        #print('socket unavailable')
                        slen = 0
                        time.sleep(.5)
                    else:
                        raise
                bleft -= slen
                bpos += slen

вместо self.sock.sendall

1 голос
/ 20 июня 2011

Впервые слышу об этом. Вот короткая программа, чтобы показать, что это работает для меня. Обратите внимание, что запущенный мной скрипт full.cgi просто возвращает заголовки запроса и тело запроса обратно в тело ответа. Когда я запускаю это, все 64K + контента, в том числе 'end' туда и обратно.

import httplib2

h = httplib2.Http(timeout=60)
body = "x"* (64*1024) + " the end"
uri="http://bitworking.org/projects/httplib2/test/reflector/full.cgi"
resp, content = h.request(uri, method="POST", body=body)
print content

Вы уверены, что не видите только сегменты TCP в wireshark? Они будут усечены до 64K, но не представляют полный HTTP-запрос.

...