示例#1
0
def thrift_headers_matcher(l, r):
    serializer = ThriftSerializer(None)
    try:
        left = serializer.deserialize_header(l)
        right = serializer.deserialize_header(r)

        return filter_headers(left) == filter_headers(right)
    except Exception:
        return l == r
示例#2
0
def thrift_headers_matcher(l, r):
    serializer = ThriftSerializer(None)
    try:
        left = serializer.deserialize_header(l)
        right = serializer.deserialize_header(r)

        return filter_headers(left) == filter_headers(right)
    except Exception:
        return l == r
示例#3
0
def test_deprecated_build_handler():

    def call(treq, tres):
        assert treq.transport.headers == {
            'as': 'thrift', 'cn': 'test_caller'
        }

        tres.write_header('foo', 'baar')
        return "world"

    response_header = InMemStream()
    response_body = InMemStream()

    req = Request(
        argstreams=[
            InMemStream('hello'),
            InMemStream('\00\00'),  # no headers
            InMemStream('\00'),  # empty struct
        ],
        serializer=ThriftSerializer(FakeResult),
        headers={'cn': 'test_caller', 'as': 'thrift'},
    )
    req.close_argstreams()

    res = Response(
        argstreams=[
            InMemStream(),
            response_header,
            response_body,
        ],
        serializer=ThriftSerializer(FakeResult),
    )

    handler = deprecated_build_handler(FakeResult, call)
    yield handler(req, res)

    serialized_headers = yield response_header.read()
    assert serialized_headers == bytearray(
        [
            0x00, 0x01,  # num headers = 1
            0x00, 0x03,  # strlen('foo') = 3
        ] + list('foo') + [
            0x00, 0x04,  # strlen('baar') = 4
        ] + list('baar')
    )

    serialized_body = yield response_body.read()
    assert serialized_body == bytearray([
        0x0b,                    # field type = TType.STRING
        0x00, 0x00,              # field ID = 0
        0x00, 0x00, 0x00, 0x05,  # string length = 5
    ] + list("world") + [
        0x00,                    # end struct
    ])

    assert 0 == res.status_code
示例#4
0
def test_deprecated_build_handler_exception():
    def call(treq, tres):
        raise FakeException('fail')

    response_body = mock.Mock(spec=InMemStream)

    req = Request(
        argstreams=[
            InMemStream('hello'),
            InMemStream('\00\00'),  # no headers
            InMemStream('\00'),  # empty struct
        ],
        serializer=ThriftSerializer(FakeResult),
    )
    req.close_argstreams()

    res = Response(
        argstreams=[
            InMemStream(),
            InMemStream(),
            response_body,
        ],
        serializer=ThriftSerializer(FakeResult),
    )

    handler = deprecated_build_handler(FakeResult, call)
    yield handler(req, res)

    response_body.write.assert_called_once_with(
        bytearray([
            0x0c,  # field type = TType.STRUCT
            0x00,
            0x01,  # field ID = 1
            0x0b,  # field type = TType.STRING
            0x00,
            0x01,  # field ID = 1
            0x00,
            0x00,
            0x00,
            0x04,  # string length = 5
        ] + list(b"fail") + [
            0x00,  # end exception struct
            0x00,  # end response struct
        ]))
    assert 1 == res.status_code
示例#5
0
    def __init__(self, service, endpoint, result_type,
                 call_args, hostport=None, serializer=None):

        self.service = service
        self.endpoint = endpoint
        self.result_type = result_type
        self.call_args = call_args
        self.hostport = hostport

        if not serializer:
            serializer = ThriftSerializer(self.result_type)
        self._serializer = serializer
示例#6
0
    def __call__(self,
                 request,
                 headers=None,
                 timeout=None,
                 retry_on=None,
                 retry_limit=None):

        if not headers:
            headers = {}

        serializer = ThriftSerializer(request.result_type)
        # serialize
        try:
            headers = serializer.serialize_header(headers=headers)
        except (AttributeError, TypeError):
            raise ValueError(
                'headers must be a map[string]string (a shallow dict'
                ' where keys and values are strings)')

        body = serializer.serialize_body(call_args=request.call_args)
        response = yield self._tchannel.call(scheme=self.NAME,
                                             service=request.service,
                                             arg1=request.endpoint,
                                             arg2=headers,
                                             arg3=body,
                                             timeout=timeout,
                                             retry_on=retry_on,
                                             retry_limit=retry_limit,
                                             hostport=request.hostport)

        # deserialize...
        response.headers = serializer.deserialize_header(
            headers=response.headers)
        body = serializer.deserialize_body(body=response.body)
        result_spec = request.result_type.thrift_spec

        # raise application exception, if present
        for exc_spec in result_spec[1:]:
            exc = getattr(body, exc_spec[2])
            if exc is not None:
                raise exc

        # success - non-void
        if len(result_spec) >= 1 and result_spec[0] is not None:

            # value expected, but got none
            # TODO - server side should use this same logic
            if body.success is None:
                raise ValueExpectedError(
                    'Expected a value to be returned for %s, '
                    'but recieved None - only void procedures can'
                    'return None.' % request.endpoint)

            response.body = body.success
            raise gen.Return(response)

        # success - void
        else:
            response.body = None
            raise gen.Return(response)
示例#7
0
def test_build_handler_application_exception():
    def call(req):
        raise FakeException('fail')

    req = Request(
        argstreams=[
            InMemStream('hello'),
            InMemStream('\00\00'),  # no headers
            InMemStream('\00'),  # empty struct
        ],
        serializer=ThriftSerializer(FakeResult),
    )
    req.close_argstreams()

    handler = build_handler(FakeResult, call)
    res = yield handler(req)

    assert res.status == 1
示例#8
0
def test_body():
    result = testStruct_result(Xtruct("s", 0, 1, 2))
    serializer = ThriftSerializer(testStruct_result)
    assert result == serializer.deserialize_body(
        serializer.serialize_body(result))
示例#9
0
def test_header(v1):
    serializer = ThriftSerializer(None)
    assert v1 == serializer.deserialize_header(serializer.serialize_header(v1))
示例#10
0
    def __call__(self, request, headers=None, timeout=None,
                 retry_on=None, retry_limit=None):

        if not headers:
            headers = {}

        serializer = ThriftSerializer(request.result_type)
        # serialize
        try:
            headers = serializer.serialize_header(headers=headers)
        except (AttributeError, TypeError):
            raise ValueError(
                'headers must be a map[string]string (a shallow dict'
                ' where keys and values are strings)'
            )

        body = serializer.serialize_body(call_args=request.call_args)
        response = yield self._tchannel.call(
            scheme=self.NAME,
            service=request.service,
            arg1=request.endpoint,
            arg2=headers,
            arg3=body,
            timeout=timeout,
            retry_on=retry_on,
            retry_limit=retry_limit,
            hostport=request.hostport
        )

        # deserialize...
        response.headers = serializer.deserialize_header(
            headers=response.headers
        )
        body = serializer.deserialize_body(body=response.body)
        result_spec = request.result_type.thrift_spec

        # raise application exception, if present
        for exc_spec in result_spec[1:]:
            exc = getattr(body, exc_spec[2])
            if exc is not None:
                raise exc

        # success - non-void
        if len(result_spec) >= 1 and result_spec[0] is not None:

            # value expected, but got none
            # TODO - server side should use this same logic
            if body.success is None:
                raise ValueExpectedError(
                    'Expected a value to be returned for %s, '
                    'but recieved None - only void procedures can'
                    'return None.' % request.endpoint
                )

            response.body = body.success
            raise gen.Return(response)

        # success - void
        else:
            response.body = None
            raise gen.Return(response)
def test_body():
    result = testStruct_result(Xtruct("s", 0, 1, 2))
    serializer = ThriftSerializer(testStruct_result)
    assert result == serializer.deserialize_body(
        serializer.serialize_body(result)
    )
def test_header(v1):
    serializer = ThriftSerializer(None)
    assert v1 == serializer.deserialize_header(
        serializer.serialize_header(v1)
    )