import io
class GeneralResponseConsumer(twisted.internet.protocol.Protocol):
- def __init__(self, cl, req, desc):
+ def __init__(self, cl, req, resp, desc):
self._cl = cl
self._req = req
+ self._resp = resp
self._desc = desc
def _log(self, dflag, msg, **kwargs):
def connectionMade(self):
self._log(DBG.HTTP_CTRL, 'connectionMade')
+ def connectionLostOK(self, reason):
+ return (reason.check(twisted.web.client.ResponseDone) or
+ reason.check(twisted.web.client.PotentialDataLoss))
+ # twisted.web.client.PotentialDataLoss is an entirely daft
+ # exception. It will occur every time if the origin server does
+ # not provide a Content-Length. (hippotatd does, of course, but
+ # the HTTP transaction might be proxied.)
+
class ResponseConsumer(GeneralResponseConsumer):
def __init__(self, cl, req, resp):
- super().__init__(cl, req, 'RC')
+ super().__init__(cl, req, resp, 'RC')
ssddesc = '[%s] %s' % (id(req), self._desc)
self._ssd = SlipStreamDecoder(ssddesc, partial(queue_inbound, cl.ipif))
self._log(DBG.HTTP_CTRL, '__init__')
def connectionLost(self, reason):
reason_msg = 'connectionLost ' + str(reason)
self._log(DBG.HTTP_CTRL, reason_msg)
- if not reason.check(twisted.web.client.ResponseDone):
+ if not self.connectionLostOK(reason):
self._latefailure(reason_msg)
return
try:
class ErrorResponseConsumer(GeneralResponseConsumer):
def __init__(self, cl, req, resp):
- super().__init__(cl, req, 'ERROR-RC')
- self._resp = resp
+ super().__init__(cl, req, resp, 'ERROR-RC')
self._m = b''
try:
self._phrase = resp.phrase.decode('utf-8')
mbody = self._m.decode('utf-8')
except Exception:
mbody = repr(self._m)
- if not reason.check(twisted.web.client.ResponseDone):
+ if not self.connectionLostOK(reason):
mbody += ' || ' + str(reason)
self._cl.req_err(self._req,
"FAILED %d %s | %s"
cl.log(DBG.HTTP_FULL, 'requesting: ' + str(mime))
hh = { 'User-Agent': ['hippotat'],
- 'Content-Type': ['multipart/form-data; boundary="b"'],
- 'Content-Length': [str(len(mime))] }
+ 'Content-Type': ['multipart/form-data; boundary="b"'] }
bytesreader = io.BytesIO(mime)
producer = twisted.web.client.FileBodyProducer(bytesreader)