##// END OF EJS Templates
wireprotoserver: document and improve the httplib workaround...
Gregory Szorc -
r36005:6010fe1d default
parent child Browse files
Show More
@@ -292,8 +292,9 b' def _callhttp(repo, req, proto, cmd):'
292 req.respond(HTTP_OK, HGTYPE, body=rsp)
292 req.respond(HTTP_OK, HGTYPE, body=rsp)
293 return []
293 return []
294 elif isinstance(rsp, wireproto.pusherr):
294 elif isinstance(rsp, wireproto.pusherr):
295 # drain the incoming bundle
295 # This is the httplib workaround documented in _handlehttperror().
296 req.drain()
296 req.drain()
297
297 proto.restore()
298 proto.restore()
298 rsp = '0\n%s\n' % rsp.res
299 rsp = '0\n%s\n' % rsp.res
299 req.respond(HTTP_OK, HGTYPE, body=rsp)
300 req.respond(HTTP_OK, HGTYPE, body=rsp)
@@ -306,16 +307,28 b' def _callhttp(repo, req, proto, cmd):'
306
307
307 def _handlehttperror(e, req, cmd):
308 def _handlehttperror(e, req, cmd):
308 """Called when an ErrorResponse is raised during HTTP request processing."""
309 """Called when an ErrorResponse is raised during HTTP request processing."""
309 # A client that sends unbundle without 100-continue will
310
310 # break if we respond early.
311 # Clients using Python's httplib are stateful: the HTTP client
311 if (cmd == 'unbundle' and
312 # won't process an HTTP response until all request data is
313 # sent to the server. The intent of this code is to ensure
314 # we always read HTTP request data from the client, thus
315 # ensuring httplib transitions to a state that allows it to read
316 # the HTTP response. In other words, it helps prevent deadlocks
317 # on clients using httplib.
318
319 if (req.env[r'REQUEST_METHOD'] == r'POST' and
320 # But not if Expect: 100-continue is being used.
312 (req.env.get('HTTP_EXPECT',
321 (req.env.get('HTTP_EXPECT',
313 '').lower() != '100-continue') or
322 '').lower() != '100-continue') or
323 # Or the non-httplib HTTP library is being advertised by
324 # the client.
314 req.env.get('X-HgHttp2', '')):
325 req.env.get('X-HgHttp2', '')):
315 req.drain()
326 req.drain()
316 else:
327 else:
317 req.headers.append((r'Connection', r'Close'))
328 req.headers.append((r'Connection', r'Close'))
318
329
330 # TODO This response body assumes the failed command was
331 # "unbundle." That assumption is not always valid.
319 req.respond(e, HGTYPE, body='0\n%s\n' % e)
332 req.respond(e, HGTYPE, body='0\n%s\n' % e)
320
333
321 return ''
334 return ''
General Comments 0
You need to be logged in to leave comments. Login now