2016-08-30 2 views
1

Запросы на серверные прокси.aiohttp failed response.json() со статусом 500

@asyncio.coroutine 
def send_async_request(method, url, data, timeout): 
    with ClientSession() as session: 
     response = yield from asyncio.wait_for(
      session.request(method, url, data=data), timeout=timeout 
     ) 
     return response 

Все работает на кодах ответа 200. Когда дело доходит до 500 код ответа не может прочитать JSON от ответа. Исключение ServerDisconnectedError:

response = yield from send_async_request(request.method, url) 
response_json = yield from response.json() 

Traceback (most recent call last): 

File "C:\Python34\lib\site-packages\aiohttp\server.py", line 285, in start 
    yield from self.handle_request(message, payload) 
    File "C:\Python34\lib\site-packages\aiohttp\web.py", line 90, in handle_request 
    resp = yield from handler(request) 
    File "D:/projects/SeleniumGridDispatcher/trunk/application.py", line 122, in proxy_wd 
    response_json = yield from response.json() 
    File "C:\Python34\lib\site-packages\aiohttp\client_reqrep.py", line 764, in json 
    yield from self.read() 
    File "C:\Python34\lib\site-packages\aiohttp\client_reqrep.py", line 720, in read 
    self._content = yield from self.content.read() 
    File "C:\Python34\lib\site-packages\aiohttp\streams.py", line 486, in wrapper 
    result = yield from func(self, *args, **kw) 
    File "C:\Python34\lib\site-packages\aiohttp\streams.py", line 541, in read 
    return (yield from super().read(n)) 
    File "C:\Python34\lib\site-packages\aiohttp\streams.py", line 261, in read 
    block = yield from self.readany() 
    File "C:\Python34\lib\site-packages\aiohttp\streams.py", line 486, in wrapper 
    result = yield from func(self, *args, **kw) 
    File "C:\Python34\lib\site-packages\aiohttp\streams.py", line 549, in readany 
    return (yield from super().readany()) 
    File "C:\Python34\lib\site-packages\aiohttp\streams.py", line 284, in readany 
    yield from self._waiter 
    File "C:\Python34\lib\asyncio\futures.py", line 358, in __iter__ 
    yield self # This tells Task to wait for completion. 
    File "C:\Python34\lib\asyncio\tasks.py", line 290, in _wakeup 
    future.result() 
    File "C:\Python34\lib\asyncio\futures.py", line 274, in result 
    raise self._exception 
aiohttp.errors.ServerDisconnectedError 

Помогите понять, что происходит. Python: 3.4.4 aiohttp: 0.22.5

+0

http-клиент не читает полный текст запроса, не разрешает –

ответ

0

500 ошибок могут произойти в любое время, особенно если сервер находится под большой нагрузкой или нестабилен. Сделайте свой код более устойчивым, поймав исключение. Затем вы можете повторить попытку или просто вернуть ответ.

@asyncio.coroutine 
def send_async_request(method, url, data, timeout): 
    with ClientSession() as session: 
     try:    
      response = yield from asyncio.wait_for(
       session.request(method, url, data=data), timeout=timeout 
      ) 
     except Exception as e: 
      print("%s has error '%s: %s'" % (url, response.status, response.reason)) 
      # now you can decide what you want to do 
      # either return the response anyways or do some handling right here 
     return response 
+0

500 возвращает другой сервер, и это нормальное поведение его, мне просто нужно пройти через это тело 500 через мой сервер, и я не могу получить тело падает на response.json(). Сам запрос выполняется гладко. –

+0

В этом суть - сообщение, вероятно, не имеет тела. Поймайте исключение, когда я написал вам (или поймал его в нижней части вашего кода - не уверен, если это имеет значение), а затем прервите json-преобразование или, как бы то ни было, обработка ошибок должна выглядеть. – matt3o

+0

Я просматриваю локальный прокси-трафик, там есть Ошибка сервера HTTP/1.1 500 Дата: Вт, 30 Авг 2016 14:13:45 GMT Сервер: Jetty/5.1.x (Windows 7/6.1 amd64 java/1.8 .0_101 Expires: Thu, 1 января 1970 00:00:00 GMT Cache-Control: нет кэша Content-Type: применение/JSON, кодировка = UTF-8 Content-Length: 7408 Подключение: закрыть {"sessionId": ....} –

0

Пожалуйста, проверьте Content-Length на 500 откликов. Похоже, aiohttp пытается прочитать тело json, но тело короче, чем указано в заголовках.

+0

>>> response.headers.get (' CONTENT-LENGTH ') ' 7217 ' Как проверить, что это в этом вопросе? –

+0

Убедитесь, что ответ имеет ровно 7217 байт в теле. В противном случае у вас есть злонамеренный сервер. Вы можете прочитать ответ '.content.read_any()' хотя. –

+0

i performbody = yield from response.content.readany() –

Смежные вопросы