def connectionLost(self, reason):
        """
        Deliver the accumulated response bytes to the waiting L{Deferred}, if
        the response body has been completely received without error.
        """
        if reason.check(ResponseDone):

            body = b''.join(self.dataBuffer)

            # ---8<--- snippet from u1db.remote.http_client
            if self.status in (200, 201):
                self.deferred.callback(body)
            elif self.status in http_errors.ERROR_STATUSES:
                try:
                    respdic = json.loads(body)
                except ValueError:
                    self.deferred.errback(
                        errors.HTTPError(self.status, body, self.headers))
                else:
                    self._error(respdic)
            # special cases
            elif self.status == 503:
                self.deferred.errback(errors.Unavailable(body, self.headers))
            else:
                self.deferred.errback(
                    errors.HTTPError(self.status, body, self.headers))
            # ---8<--- end of snippet from u1db.remote.http_client

        elif reason.check(PotentialDataLoss):
            self.deferred.errback(
                PartialDownloadError(self.status, self.message,
                                     b''.join(self.dataBuffer)))
        else:
            self.deferred.errback(reason)
Exemple #2
0
    def test_HTTPError(self):
        err = errors.HTTPError(500)
        self.assertEqual(500, err.status)
        self.assertIs(None, err.wire_description)
        self.assertIs(None, err.message)

        err = errors.HTTPError(500, "Crash.")
        self.assertEqual(500, err.status)
        self.assertIs(None, err.wire_description)
        self.assertEqual("Crash.", err.message)
Exemple #3
0
 def test_get_doc_deleted_include_deleted(self):
     self.response_val = errors.HTTPError(
         404, json.dumps({"error": errors.DOCUMENT_DELETED}), {
             'x-u1db-rev': 'doc-rev-gone',
             'x-u1db-has-conflicts': 'false'
         })
     doc = self.db.get_doc('deleted', include_deleted=True)
     self.assertEqual('deleted', doc.doc_id)
     self.assertEqual('doc-rev-gone', doc.rev)
     self.assertIs(None, doc.content)
     self.assertEqual(('GET', ['doc', 'deleted'], {
         'include_deleted': True
     }, None, None), self.got)
Exemple #4
0
 def _response(self):
     resp = self._conn.getresponse()
     body = resp.read()
     headers = dict(resp.getheaders())
     if resp.status in (200, 201):
         return body, headers
     elif resp.status in http_errors.ERROR_STATUSES:
         try:
             respdic = json.loads(body)
         except ValueError:
             pass
         else:
             self._error(respdic)
     # special case
     if resp.status == 503:
         raise errors.Unavailable(body, headers)
     raise errors.HTTPError(resp.status, body, headers)
Exemple #5
0
 def test_get_doc_pass_through_errors(self):
     self.response_val = errors.HTTPError(500, 'Crash.')
     self.assertRaises(errors.HTTPError, self.db.get_doc,
                       'something-something')
Exemple #6
0
    def test_HTTPError_str(self):
        err = errors.HTTPError(500)
        self.assertEqual("HTTPError(500)", str(err))

        err = errors.HTTPError(500, "ERROR")
        self.assertEqual("HTTPError(500, 'ERROR')", str(err))