Тайм-аут Python httplib для localhost - PullRequest
0 голосов
/ 18 апреля 2011

У меня есть локальный сервер, работающий на порту 6868. Технически это микросайт, управляемый node.js, созданный с помощью Express. На самом деле у него есть единственный контроллер '/ push', считывающий некоторые данные и записывающий их в консоль (+ некоторые специфические не связанные с вопросом операции).

При использовании curl

h100:~ eugenemirotin$ curl -i http://127.0.0.1:6868/push -d password=pwd
HTTP/1.1 200 OK
X-Powered-By: Express
Connection: keep-alive
Transfer-Encoding: chunked

и файл node.js утешается, как и предполагалось.

При использовании python и httplib:

h100:~ eugenemirotin$ python
Python 2.7.1 (r271:86832, Jan  6 2011, 00:55:07) 
[GCC 4.2.1 (Apple Inc. build 5664)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import httplib, urllib
>>> params = {'password': 'pwd', 'type': 'msg', 'channel': 'chat', 'client_id': '', 'body': {'text': 'test test'}}
>>> params
{'body': {'text': 'test test'}, 'password': 'pwd', 'type': 'msg', 'client_id': '', 'channel': 'chat'}
>>> params = urllib.urlencode(params)
>>> params
'body=%7B%27text%27%3A+%27test+test%27%7D&password=pwd&type=msg&client_id=&channel=chat'
>>> conn = httplib.HTTPConnection('http://127.0.0.1:6868')
>>> conn.request("POST", "/push", params)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File    "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/httplib.py", line 941, in request
    self._send_request(method, url, body, headers)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/httplib.py", line 975, in _send_request
    self.endheaders(body)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/httplib.py", line 937, in endheaders
    self._send_output(message_body)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/httplib.py", line 797, in _send_output
    self.send(msg)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/httplib.py", line 759, in send
    self.connect()
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/httplib.py", line 740, in connect
    self.timeout, self.source_address)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/socket.py", line 571, in create_connection
    raise err
socket.error: [Errno 60] Operation timed out
>>> quit()

Разница в параметрах несущественна - запрос даже не попадает на сервер node.js.

Это ошибка httplib или я что-то не так делаю?

Ответы [ 2 ]

4 голосов
/ 18 апреля 2011

Удалить http:// с адреса.

Это:

conn = httplib.HTTPConnection('http://127.0.0.1:6868')

Должно быть:

conn = httplib.HTTPConnection('127.0.0.1:6868')
3 голосов
/ 18 апреля 2011

Вы можете значительно упростить свой код:

import urllib, urllib2
params = {'password': 'pwd', 'type': 'msg', 'channel': 'chat', 'client_id': '', 'body': {'text': 'test test'}}    
params = urllib.urlencode(params)
res = urllib2.urlopen('http://127.0.0.1:6868/push/', params)
data = res.read()
res.close()
...