問題の概要
Python で記述された Web ページと API を実行しています。Web ページは POST 要求でデータを Python API に送信し、Python API はそれを処理して送り返します。API は、curl リクエストとコンソール AJAX リクエストで正常に動作します。ただし、新しいタブに Web ページを読み込むと、最初の 10 秒程度のすべての POST 要求は、失敗するまで「停止」します (Chrome によって実行されません)。約 10 秒後、POST リクエストは正常に機能し、Python API は壊れたパイプをキャッチします (ERRNO 32、以下のログ)。タブをハード更新すると、サイトはすぐに機能し、リクエストはまったく停止しませんが、サイトで新しいタブを開くと、この 10 秒の遅延が発生します。
仕様
これは Chrome でのみ発生し、Firefox と Safari では問題なく動作します。localhost と AWS インスタンスの両方で API と Web ページを実行しましたが、まだ 10 秒ほどの遅延があり、その後正常に動作します。他のコンピューターの chrome で発生し、他のコンピューターの Firefox で動作します。
私がそれを修正しようとした方法
Chrome は、プロキシ接続をネゴシエートするか、6 つの TCP 接続の制限に達すると、明らかにリクエストを停止します。ハード リセットを実行しても、API への接続を再ネゴシエートする必要がない理由、または毎回それを行う必要がない理由がわかりません。それをしている場合でも、一貫して約10秒かかるべきではありませんか?また、サイトが 6 つの TCP 接続に達していないことも確認しました。
潜在的な問題?
リクエストを別のサイトからのものに変更しても、HTTP リクエストが停止する問題はありません。この問題は Chrome に固有のものであるため、BaseHTTPRequests が処理方法を知らない方法で Chrome が XMLHTTPRequests を実装するかどうか疑問に思っています。 、そしてそれが壊れたパイプにつながっています。しかし、毎回約10秒後に常に修正される理由はわかりません。
私は今、これに何時間も費やしてきました。どんな助けでも大歓迎です!
HTML/JS:
<!DOCTYPE html>
<html>
<head>
<meta charset=utf-8>
<title>OSR Web</title>
</head>
<body>
<script>
var http = new XMLHttpRequest();
var url = "http://localhost:1234";
http.onreadystatechange = function() {
if(http.readyState == 4 && http.status == 200) {
var bestGuess = http.responseText;
console.log(bestGuess);
}
}
document.addEventListener("click", function(event){
http.open("POST", url, true);
http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
http.send("TestData");
});
</script>
</body>
</html>
パイソン API:
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
class S(BaseHTTPRequestHandler):
def _set_headers(self):
self.send_response(200)
self.send_header('Content-type', 'text/html')
self.send_header('Access-Control-Allow-Origin', '*')
self.end_headers()
def do_GET(self):
self._set_headers()
self.wfile.write("OSR API Active")
def do_POST(self):
print "received"
self._set_headers()
self.data_string = self.rfile.read(int(self.headers['Content-Length']))
inputData = self.data_string
print inputData
self.wfile.write("Received\n")
def run(server_class=HTTPServer, handler_class=S, port=1234):
server_address = ('', port)
httpd = server_class(server_address, handler_class)
print 'Starting HTTPD'
httpd.serve_forever()
run()
壊れたパイプのエラー メッセージ:
127.0.0.1 - - [11/Aug/2017 15:34:13] "GET / HTTP/1.1" 200 -
----------------------------------------
Exception happened during processing of request from ('127.0.0.1', 56506)
Traceback (most recent call last):
File "/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/SocketServer.py", line 295, in _handle_request_noblock
self.process_request(request, client_address)
File "/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/SocketServer.py", line 321, in process_request
self.finish_request(request, client_address)
File "/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/SocketServer.py", line 334, in finish_request
self.RequestHandlerClass(request, client_address, self)
File "/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/SocketServer.py", line 657, in __init__
self.finish()
File "/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/SocketServer.py", line 716, in finish
self.wfile.close()
File "/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/socket.py", line 283, in close
self.flush()
File "/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/socket.py", line 307, in flush
self._sock.sendall(view[write_offset:write_offset+buffer_size])
error: [Errno 32] Broken pipe
----------------------------------------
received
127.0.0.1 - - [11/Aug/2017 15:36:45] "POST / HTTP/1.1" 200 -
TestData