Kaydet (Commit) 756f547b authored tarafından Victor Stinner's avatar Victor Stinner

#9032: XML-RPC client: Transport.request() retries on EPIPE error

The EPIPE error occurs when the server closes the socket and the client sends a
"big" XML-RPC request (I don't know exactly the size threshold).

request() just have to ignore the error because single_request() closes the
socket on error, and so the next call to single_request() will open a new
socket.

Remove also a comment in the HTTP client because it's now wrong: see r70643
and issue #5542.
üst eccc5fac
...@@ -734,11 +734,6 @@ class HTTPConnection: ...@@ -734,11 +734,6 @@ class HTTPConnection:
else: else:
raise NotConnected() raise NotConnected()
# send the data to the server. if we get a broken pipe, then close
# the socket. we want to reconnect when somebody tries to send again.
#
# NOTE: we DO propagate the error, though, because we cannot simply
# ignore the error... the caller will know if they can retry.
if self.debuglevel > 0: if self.debuglevel > 0:
print("send:", repr(str)) print("send:", repr(str))
blocksize = 8192 blocksize = 8192
......
...@@ -1135,7 +1135,7 @@ class Transport: ...@@ -1135,7 +1135,7 @@ class Transport:
try: try:
return self.single_request(host, handler, request_body, verbose) return self.single_request(host, handler, request_body, verbose)
except socket.error as e: except socket.error as e:
if i or e.errno not in (errno.ECONNRESET, errno.ECONNABORTED): if i or e.errno not in (errno.ECONNRESET, errno.ECONNABORTED, errno.EPIPE):
raise raise
except http.client.BadStatusLine: #close after we sent request except http.client.BadStatusLine: #close after we sent request
if i: if i:
......
...@@ -473,6 +473,10 @@ C-API ...@@ -473,6 +473,10 @@ C-API
Library Library
------- -------
- Issue #9032: XML-RPC client retries the request on EPIPE error. The EPIPE
error occurs when the server closes the socket and the client sends a big
XML-RPC request.
- Issue #4629: getopt raises an error if an argument ends with = whereas getopt - Issue #4629: getopt raises an error if an argument ends with = whereas getopt
doesn't except a value (eg. --help= is rejected if getopt uses ['help='] long doesn't except a value (eg. --help= is rejected if getopt uses ['help='] long
options). options).
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment