예제 #1
0
    def _handle_response(self, mres, resp):
        result = self
        headers = result.headers

        if resp.headers:
            ix = 0
            while True:
                pp = resp.headers[ix]
                if pp == ffi.NULL:
                    break
                key = from_cstring(resp.headers[ix])
                value = from_cstring(resp.headers[ix+1])
                headers[key] = value
                ix += 2

        result.rc = resp.rc
        result.htcode = resp.htstatus

        if resp.rc:
            mres._add_bad_rc(resp.rc)
        elif not self.success and not mres._quiet:
            try:
                raise PyCBC.exc_http(self.value, response=self)
            except PyCBC.default_exception:
                mres._add_err(sys.exc_info())

        if resp.nbody:
            buf = bytes(ffi.buffer(ffi.cast('const char*', resp.body), resp.nbody))
            tc = self._parent._tc
            try:
                result.http_data = tc.decode_value(buf, self._format)
            except:
                if not self._quiet:
                    mres._add_err(sys.exc_info())
                result.http_data = buf
예제 #2
0
    def _handle_done(self, resp, mres):
        self.done = True
        self._c_handle = None
        if resp.rc:
            if resp.rc == C.LCB_HTTP_ERROR:
                try:
                    raise PyCBC.exc_http(self.value)
                except:
                    mres._add_err(sys.exc_info())
            else:
                mres._add_bad_rc(resp.rc, self)

        if resp.nvalue:
            self.value = buf2str(resp.value, resp.nvalue)
            try:
                self.value = PyCBC.json_decode(self.value)
            except:
                pass

        if resp.htresp:
            if not self.value and resp.htresp.nbody:
                self.value = buf2str(resp.htresp.body, resp.htresp.nbody)
            self.http_status = resp.htresp.htstatus

        if self._parent._is_async:
            try:
                mres._maybe_throw()
                self._invoke_async(mres, is_final=True)
            except:
                mres.errback(mres, *sys.exc_info())
            finally:
                del self._parent
예제 #3
0
    def _handle_done(self, resp, mres):
        self.done = True
        self._c_handle = None
        if resp.rc:
            if resp.rc == C.LCB_HTTP_ERROR:
                try:
                    raise PyCBC.exc_http(self.value)
                except:
                    mres._add_err(sys.exc_info())
            else:
                mres._add_bad_rc(resp.rc, self)

        if resp.nvalue:
            self.value = buf2str(resp.value, resp.nvalue)
            try:
                self.value = PyCBC.json_decode(self.value)
            except:
                pass

        if resp.htresp:
            if not self.value and resp.htresp.nbody:
                self.value = buf2str(resp.htresp.body, resp.htresp.nbody)
            self.http_status = resp.htresp.htstatus

        if self._parent._is_async:
            try:
                mres._maybe_throw()
                self._invoke_async(mres, is_final=True)
            except:
                mres.errback(mres, *sys.exc_info())
            finally:
                del self._parent
예제 #4
0
    def _handle_response(self, mres, resp):
        result = self
        headers = result.headers

        if resp.headers:
            ix = 0
            while True:
                pp = resp.headers[ix]
                if pp == ffi.NULL:
                    break
                key = from_cstring(resp.headers[ix])
                value = from_cstring(resp.headers[ix + 1])
                headers[key] = value
                ix += 2

        result.rc = resp.rc
        result.htcode = resp.htstatus

        if resp.rc:
            mres._add_bad_rc(resp.rc)
        elif not self.success and not mres._quiet:
            try:
                raise PyCBC.exc_http(self.value, response=self)
            except PyCBC.default_exception:
                mres._add_err(sys.exc_info())

        if resp.nbody:
            buf = bytes(
                ffi.buffer(ffi.cast('const char*', resp.body), resp.nbody))
            tc = self._parent._tc
            try:
                result.http_data = tc.decode_value(buf, self._format)
            except:
                if not self._quiet:
                    mres._add_err(sys.exc_info())
                result.http_data = buf