Aiohttp: クライアントの接続を半分閉じ、応答を許可しません。

作成日 2019年03月21日  ·  3コメント  ·  ソース: aio-libs/aiohttp

短編小説

httpクライアントはaiohttpにリクエストを送信し、すぐにfinを送信して、接続の側を閉じます。 Aiohttpはハンドラーを呼び出して応答を生成しますが、接続を送信するのではなく閉じます。

これは、プロトコルに従って、 eol_receivedがNoneを返すことが原因です。 この関数がTrueを返すようにすると、この問題が修正されます。

応答後に接続を完全に閉じても、この修正に関する問題は見つかりませんでした。 しかし、私はaiohttpの専門家ではありません。

予想される行動

aiohttpはクライアントに応答を送信してから、接続を閉じます。 client.pyは、応答のヘッダーを出力します。

実際の動作

aiohttpは、応答を送信せずに接続を閉じます。 client.pyは単に以下を出力します:

受け取ったb ''

再現する手順

client.py(成功した場合にのみ応答のヘッダーを出力しますが、これには十分です):
「」
インポートソケット

ホスト= '127.0.0.1'
ポート= 8080
sとしてsocket.socket(socket.AF_INET、socket.SOCK_STREAM)を使用:
s.connect((HOST、PORT))
s.sendall(b'GET / HTTP / 0.9 \ r \ n \ r \ n ')
s.shutdown(socket.SHUT_WR)
データ= s.recv(1025)
print( 'Received'、repr(data))
「」

server.py:
「」
asyncioをインポートします

aiohttpインポートWebから

async def handle(request):
print( "リクエストの処理:{}"。format(request))
asyncio.sleep(0.1)#フィンが表示されることを確認します。
web.Response(text = "Hello")を返します

app = web.Application()
app.add_routes([web.get( '/'、handle)])
web.run_app(app)
「」
同じマシンで最初にserver.pyを実行し、次にclient.pyを実行します。

あなたの環境

サーバーとしてのaiohttp
aiohttpバージョン3.5.4
UbuntuとOSXで再現。 Python3.6.5。

bug

最も参考になるコメント

私が問題を抱えている実際のクライアントはPythonで書かれていません。私は、受信の前に半分閉じた再現スクリプトを持つようにそのスクリプトを書いただけです。

私は支払いますが、私は眠りに待つのを逃しました。 しかし、これらは両方ともクイックスクリプトであり、クライアントが半分閉じた後にサーバー側を閉じる問題を再現するためのものです。

全てのコメント3件

GitMate.ioは、あなたを助けることができる可能性が最も高い貢献者は

おそらく関連する問題は、 https://github.com/aio-libs/aiohttp/issues/1814 (ポンが受信されないときにWebSocket接続を閉じる)、 https://github.com/aio-libs/aiohttp/issues/2849 (取得aiohttpクライアントで接続が閉じられました)、 https://github.com/aio-libs/aiohttp/issues/2595 (クライアント接続が閉じられた後にサーバーハンドラーが停止します)、 https://github.com/aio-libs/aiohttp/issues/ 96 (応答本文が消費されていない場合は接続を閉じます。)、およびhttps://github.com/aio-libs/aiohttp/issues/691(Websocketは応答後に自動的に閉じられます)。

client.pyコードは、何も受け取らないまでrecvをループする必要がありますか? ここでは、次のようなもので機能しました。

HOST = '127.0.0.1'
PORT = 8080
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.connect((HOST, PORT))
    s.sendall(b'GET / HTTP/0.9\r\n\r\n')
    chunk = s.recv(1025)
    result = chunk
    s.shutdown(socket.SHUT_WR)

    while len(chunk) > 0:
        data = s.recv(1025)
        result += chunk

print('Received', repr(result))

それに加えて、 server.pyファイルでasyncio.sleep(0.1)への呼び出しを待つのを忘れたと思います。

私が問題を抱えている実際のクライアントはPythonで書かれていません。私は、受信の前に半分閉じた再現スクリプトを持つようにそのスクリプトを書いただけです。

私は支払いますが、私は眠りに待つのを逃しました。 しかし、これらは両方ともクイックスクリプトであり、クライアントが半分閉じた後にサーバー側を閉じる問題を再現するためのものです。

このページは役に立ちましたか?
0 / 5 - 0 評価