Experimental Thrift support
No thread safety no connection pooling for thrift very limited error handling
This commit is contained in:
@@ -42,6 +42,7 @@ class Connection(object):
|
|||||||
|
|
||||||
def log_request_success(self, method, full_url, path, body, status_code, response, duration):
|
def log_request_success(self, method, full_url, path, body, status_code, response, duration):
|
||||||
""" Log a successful API call. """
|
""" Log a successful API call. """
|
||||||
|
# TODO: optionally pass in params instead of full_url and do urlencode only when needed
|
||||||
def _pretty_json(data):
|
def _pretty_json(data):
|
||||||
# pretty JSON in tracer curl logs
|
# pretty JSON in tracer curl logs
|
||||||
try:
|
try:
|
||||||
@@ -210,3 +211,51 @@ class MemcachedConnection(Connection):
|
|||||||
response, duration)
|
response, duration)
|
||||||
|
|
||||||
return status, response
|
return status, response
|
||||||
|
|
||||||
|
from .esthrift.ttypes import Method, RestRequest
|
||||||
|
from .esthrift import Rest
|
||||||
|
from thrift.Thrift import TException
|
||||||
|
from thrift.transport import TTransport, TSocket
|
||||||
|
from thrift.protocol import TBinaryProtocol
|
||||||
|
|
||||||
|
|
||||||
|
class ThriftConnection(Connection):
|
||||||
|
transport_schema = 'thrift'
|
||||||
|
|
||||||
|
def __init__(self, host='localhost', port=9500, framed_transport=False, **kwargs):
|
||||||
|
super(ThriftConnection, self).__init__(host=host, port=port, **kwargs)
|
||||||
|
socket = TSocket.TSocket(host, port)
|
||||||
|
socket.setTimeout(self.timeout * 1000.0)
|
||||||
|
if framed_transport:
|
||||||
|
transport = TTransport.TFramedTransport(socket)
|
||||||
|
else:
|
||||||
|
transport = TTransport.TBufferedTransport(socket)
|
||||||
|
|
||||||
|
protocol = TBinaryProtocol.TBinaryProtocolAccelerated(transport)
|
||||||
|
client = Rest.Client(protocol)
|
||||||
|
transport.open()
|
||||||
|
self.tclient = client
|
||||||
|
self.ttransport = transport
|
||||||
|
|
||||||
|
def perform_request(self, method, url, params=None, body=None, timeout=None):
|
||||||
|
request = RestRequest(method=Method._NAMES_TO_VALUES[method.upper()], uri=url,
|
||||||
|
parameters=params, body=body)
|
||||||
|
|
||||||
|
start = time.time()
|
||||||
|
try:
|
||||||
|
response = self.tclient.execute(request)
|
||||||
|
duration = time.time() - start
|
||||||
|
except TException as e:
|
||||||
|
self.log_request_fail(method, url, time.time() - start, exception=e)
|
||||||
|
raise ConnectionError('N/A', str(e), e)
|
||||||
|
|
||||||
|
if not (200 <= response.status < 300):
|
||||||
|
self.log_request_fail(method, url, duration, response.status)
|
||||||
|
self._raise_error(response.status, response.body)
|
||||||
|
|
||||||
|
self.log_request_success(method, url, url, body, response.status,
|
||||||
|
response.body, duration)
|
||||||
|
|
||||||
|
return response.status, response.body
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Executable
+88
@@ -0,0 +1,88 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
#
|
||||||
|
# Autogenerated by Thrift Compiler (0.9.0)
|
||||||
|
#
|
||||||
|
# DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
|
||||||
|
#
|
||||||
|
# options string: py:new_style=true,utf8strings=true
|
||||||
|
#
|
||||||
|
|
||||||
|
import sys
|
||||||
|
import pprint
|
||||||
|
from urlparse import urlparse
|
||||||
|
from thrift.transport import TTransport
|
||||||
|
from thrift.transport import TSocket
|
||||||
|
from thrift.transport import THttpClient
|
||||||
|
from thrift.protocol import TBinaryProtocol
|
||||||
|
|
||||||
|
import Rest
|
||||||
|
from ttypes import *
|
||||||
|
|
||||||
|
if len(sys.argv) <= 1 or sys.argv[1] == '--help':
|
||||||
|
print ''
|
||||||
|
print 'Usage: ' + sys.argv[0] + ' [-h host[:port]] [-u url] [-f[ramed]] function [arg1 [arg2...]]'
|
||||||
|
print ''
|
||||||
|
print 'Functions:'
|
||||||
|
print ' RestResponse execute(RestRequest request)'
|
||||||
|
print ''
|
||||||
|
sys.exit(0)
|
||||||
|
|
||||||
|
pp = pprint.PrettyPrinter(indent = 2)
|
||||||
|
host = 'localhost'
|
||||||
|
port = 9090
|
||||||
|
uri = ''
|
||||||
|
framed = False
|
||||||
|
http = False
|
||||||
|
argi = 1
|
||||||
|
|
||||||
|
if sys.argv[argi] == '-h':
|
||||||
|
parts = sys.argv[argi+1].split(':')
|
||||||
|
host = parts[0]
|
||||||
|
if len(parts) > 1:
|
||||||
|
port = int(parts[1])
|
||||||
|
argi += 2
|
||||||
|
|
||||||
|
if sys.argv[argi] == '-u':
|
||||||
|
url = urlparse(sys.argv[argi+1])
|
||||||
|
parts = url[1].split(':')
|
||||||
|
host = parts[0]
|
||||||
|
if len(parts) > 1:
|
||||||
|
port = int(parts[1])
|
||||||
|
else:
|
||||||
|
port = 80
|
||||||
|
uri = url[2]
|
||||||
|
if url[4]:
|
||||||
|
uri += '?%s' % url[4]
|
||||||
|
http = True
|
||||||
|
argi += 2
|
||||||
|
|
||||||
|
if sys.argv[argi] == '-f' or sys.argv[argi] == '-framed':
|
||||||
|
framed = True
|
||||||
|
argi += 1
|
||||||
|
|
||||||
|
cmd = sys.argv[argi]
|
||||||
|
args = sys.argv[argi+1:]
|
||||||
|
|
||||||
|
if http:
|
||||||
|
transport = THttpClient.THttpClient(host, port, uri)
|
||||||
|
else:
|
||||||
|
socket = TSocket.TSocket(host, port)
|
||||||
|
if framed:
|
||||||
|
transport = TTransport.TFramedTransport(socket)
|
||||||
|
else:
|
||||||
|
transport = TTransport.TBufferedTransport(socket)
|
||||||
|
protocol = TBinaryProtocol.TBinaryProtocol(transport)
|
||||||
|
client = Rest.Client(protocol)
|
||||||
|
transport.open()
|
||||||
|
|
||||||
|
if cmd == 'execute':
|
||||||
|
if len(args) != 1:
|
||||||
|
print 'execute requires 1 args'
|
||||||
|
sys.exit(1)
|
||||||
|
pp.pprint(client.execute(eval(args[0]),))
|
||||||
|
|
||||||
|
else:
|
||||||
|
print 'Unrecognized method %s' % cmd
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
transport.close()
|
||||||
@@ -0,0 +1,223 @@
|
|||||||
|
#
|
||||||
|
# Autogenerated by Thrift Compiler (0.9.0)
|
||||||
|
#
|
||||||
|
# DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
|
||||||
|
#
|
||||||
|
# options string: py:new_style=true,utf8strings=true
|
||||||
|
#
|
||||||
|
|
||||||
|
from thrift.Thrift import TType, TMessageType, TException, TApplicationException
|
||||||
|
from ttypes import *
|
||||||
|
from thrift.Thrift import TProcessor
|
||||||
|
from thrift.transport import TTransport
|
||||||
|
from thrift.protocol import TBinaryProtocol, TProtocol
|
||||||
|
try:
|
||||||
|
from thrift.protocol import fastbinary
|
||||||
|
except:
|
||||||
|
fastbinary = None
|
||||||
|
|
||||||
|
|
||||||
|
class Iface(object):
|
||||||
|
def execute(self, request):
|
||||||
|
"""
|
||||||
|
Parameters:
|
||||||
|
- request
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class Client(Iface):
|
||||||
|
def __init__(self, iprot, oprot=None):
|
||||||
|
self._iprot = self._oprot = iprot
|
||||||
|
if oprot is not None:
|
||||||
|
self._oprot = oprot
|
||||||
|
self._seqid = 0
|
||||||
|
|
||||||
|
def execute(self, request):
|
||||||
|
"""
|
||||||
|
Parameters:
|
||||||
|
- request
|
||||||
|
"""
|
||||||
|
self.send_execute(request)
|
||||||
|
return self.recv_execute()
|
||||||
|
|
||||||
|
def send_execute(self, request):
|
||||||
|
self._oprot.writeMessageBegin('execute', TMessageType.CALL, self._seqid)
|
||||||
|
args = execute_args()
|
||||||
|
args.request = request
|
||||||
|
args.write(self._oprot)
|
||||||
|
self._oprot.writeMessageEnd()
|
||||||
|
self._oprot.trans.flush()
|
||||||
|
|
||||||
|
def recv_execute(self, ):
|
||||||
|
(fname, mtype, rseqid) = self._iprot.readMessageBegin()
|
||||||
|
if mtype == TMessageType.EXCEPTION:
|
||||||
|
x = TApplicationException()
|
||||||
|
x.read(self._iprot)
|
||||||
|
self._iprot.readMessageEnd()
|
||||||
|
raise x
|
||||||
|
result = execute_result()
|
||||||
|
result.read(self._iprot)
|
||||||
|
self._iprot.readMessageEnd()
|
||||||
|
if result.success is not None:
|
||||||
|
return result.success
|
||||||
|
raise TApplicationException(TApplicationException.MISSING_RESULT, "execute failed: unknown result");
|
||||||
|
|
||||||
|
|
||||||
|
class Processor(Iface, TProcessor):
|
||||||
|
def __init__(self, handler):
|
||||||
|
self._handler = handler
|
||||||
|
self._processMap = {}
|
||||||
|
self._processMap["execute"] = Processor.process_execute
|
||||||
|
|
||||||
|
def process(self, iprot, oprot):
|
||||||
|
(name, type, seqid) = iprot.readMessageBegin()
|
||||||
|
if name not in self._processMap:
|
||||||
|
iprot.skip(TType.STRUCT)
|
||||||
|
iprot.readMessageEnd()
|
||||||
|
x = TApplicationException(TApplicationException.UNKNOWN_METHOD, 'Unknown function %s' % (name))
|
||||||
|
oprot.writeMessageBegin(name, TMessageType.EXCEPTION, seqid)
|
||||||
|
x.write(oprot)
|
||||||
|
oprot.writeMessageEnd()
|
||||||
|
oprot.trans.flush()
|
||||||
|
return
|
||||||
|
else:
|
||||||
|
self._processMap[name](self, seqid, iprot, oprot)
|
||||||
|
return True
|
||||||
|
|
||||||
|
def process_execute(self, seqid, iprot, oprot):
|
||||||
|
args = execute_args()
|
||||||
|
args.read(iprot)
|
||||||
|
iprot.readMessageEnd()
|
||||||
|
result = execute_result()
|
||||||
|
result.success = self._handler.execute(args.request)
|
||||||
|
oprot.writeMessageBegin("execute", TMessageType.REPLY, seqid)
|
||||||
|
result.write(oprot)
|
||||||
|
oprot.writeMessageEnd()
|
||||||
|
oprot.trans.flush()
|
||||||
|
|
||||||
|
|
||||||
|
# HELPER FUNCTIONS AND STRUCTURES
|
||||||
|
|
||||||
|
class execute_args(object):
|
||||||
|
"""
|
||||||
|
Attributes:
|
||||||
|
- request
|
||||||
|
"""
|
||||||
|
|
||||||
|
thrift_spec = (
|
||||||
|
None, # 0
|
||||||
|
(1, TType.STRUCT, 'request', (RestRequest, RestRequest.thrift_spec), None, ), # 1
|
||||||
|
)
|
||||||
|
|
||||||
|
def __init__(self, request=None,):
|
||||||
|
self.request = request
|
||||||
|
|
||||||
|
def read(self, iprot):
|
||||||
|
if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
|
||||||
|
fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
|
||||||
|
return
|
||||||
|
iprot.readStructBegin()
|
||||||
|
while True:
|
||||||
|
(fname, ftype, fid) = iprot.readFieldBegin()
|
||||||
|
if ftype == TType.STOP:
|
||||||
|
break
|
||||||
|
if fid == 1:
|
||||||
|
if ftype == TType.STRUCT:
|
||||||
|
self.request = RestRequest()
|
||||||
|
self.request.read(iprot)
|
||||||
|
else:
|
||||||
|
iprot.skip(ftype)
|
||||||
|
else:
|
||||||
|
iprot.skip(ftype)
|
||||||
|
iprot.readFieldEnd()
|
||||||
|
iprot.readStructEnd()
|
||||||
|
|
||||||
|
def write(self, oprot):
|
||||||
|
if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
|
||||||
|
oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
|
||||||
|
return
|
||||||
|
oprot.writeStructBegin('execute_args')
|
||||||
|
if self.request is not None:
|
||||||
|
oprot.writeFieldBegin('request', TType.STRUCT, 1)
|
||||||
|
self.request.write(oprot)
|
||||||
|
oprot.writeFieldEnd()
|
||||||
|
oprot.writeFieldStop()
|
||||||
|
oprot.writeStructEnd()
|
||||||
|
|
||||||
|
def validate(self):
|
||||||
|
if self.request is None:
|
||||||
|
raise TProtocol.TProtocolException(message='Required field request is unset!')
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
L = ['%s=%r' % (key, value)
|
||||||
|
for key, value in self.__dict__.iteritems()]
|
||||||
|
return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
|
||||||
|
|
||||||
|
def __eq__(self, other):
|
||||||
|
return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
|
||||||
|
|
||||||
|
def __ne__(self, other):
|
||||||
|
return not (self == other)
|
||||||
|
|
||||||
|
class execute_result(object):
|
||||||
|
"""
|
||||||
|
Attributes:
|
||||||
|
- success
|
||||||
|
"""
|
||||||
|
|
||||||
|
thrift_spec = (
|
||||||
|
(0, TType.STRUCT, 'success', (RestResponse, RestResponse.thrift_spec), None, ), # 0
|
||||||
|
)
|
||||||
|
|
||||||
|
def __init__(self, success=None,):
|
||||||
|
self.success = success
|
||||||
|
|
||||||
|
def read(self, iprot):
|
||||||
|
if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
|
||||||
|
fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
|
||||||
|
return
|
||||||
|
iprot.readStructBegin()
|
||||||
|
while True:
|
||||||
|
(fname, ftype, fid) = iprot.readFieldBegin()
|
||||||
|
if ftype == TType.STOP:
|
||||||
|
break
|
||||||
|
if fid == 0:
|
||||||
|
if ftype == TType.STRUCT:
|
||||||
|
self.success = RestResponse()
|
||||||
|
self.success.read(iprot)
|
||||||
|
else:
|
||||||
|
iprot.skip(ftype)
|
||||||
|
else:
|
||||||
|
iprot.skip(ftype)
|
||||||
|
iprot.readFieldEnd()
|
||||||
|
iprot.readStructEnd()
|
||||||
|
|
||||||
|
def write(self, oprot):
|
||||||
|
if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
|
||||||
|
oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
|
||||||
|
return
|
||||||
|
oprot.writeStructBegin('execute_result')
|
||||||
|
if self.success is not None:
|
||||||
|
oprot.writeFieldBegin('success', TType.STRUCT, 0)
|
||||||
|
self.success.write(oprot)
|
||||||
|
oprot.writeFieldEnd()
|
||||||
|
oprot.writeFieldStop()
|
||||||
|
oprot.writeStructEnd()
|
||||||
|
|
||||||
|
def validate(self):
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
L = ['%s=%r' % (key, value)
|
||||||
|
for key, value in self.__dict__.iteritems()]
|
||||||
|
return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
|
||||||
|
|
||||||
|
def __eq__(self, other):
|
||||||
|
return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
|
||||||
|
|
||||||
|
def __ne__(self, other):
|
||||||
|
return not (self == other)
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
__all__ = ['ttypes', 'constants', 'Rest']
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
#
|
||||||
|
# Autogenerated by Thrift Compiler (0.9.0)
|
||||||
|
#
|
||||||
|
# DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
|
||||||
|
#
|
||||||
|
# options string: py:new_style=true,utf8strings=true
|
||||||
|
#
|
||||||
|
|
||||||
|
from thrift.Thrift import TType, TMessageType, TException, TApplicationException
|
||||||
|
from ttypes import *
|
||||||
|
|
||||||
@@ -0,0 +1,412 @@
|
|||||||
|
#
|
||||||
|
# Autogenerated by Thrift Compiler (0.9.0)
|
||||||
|
#
|
||||||
|
# DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
|
||||||
|
#
|
||||||
|
# options string: py:new_style=true,utf8strings=true
|
||||||
|
#
|
||||||
|
|
||||||
|
from thrift.Thrift import TType, TMessageType, TException, TApplicationException
|
||||||
|
|
||||||
|
from thrift.transport import TTransport
|
||||||
|
from thrift.protocol import TBinaryProtocol, TProtocol
|
||||||
|
try:
|
||||||
|
from thrift.protocol import fastbinary
|
||||||
|
except:
|
||||||
|
fastbinary = None
|
||||||
|
|
||||||
|
|
||||||
|
class Method(object):
|
||||||
|
GET = 0
|
||||||
|
PUT = 1
|
||||||
|
POST = 2
|
||||||
|
DELETE = 3
|
||||||
|
HEAD = 4
|
||||||
|
OPTIONS = 5
|
||||||
|
|
||||||
|
_VALUES_TO_NAMES = {
|
||||||
|
0: "GET",
|
||||||
|
1: "PUT",
|
||||||
|
2: "POST",
|
||||||
|
3: "DELETE",
|
||||||
|
4: "HEAD",
|
||||||
|
5: "OPTIONS",
|
||||||
|
}
|
||||||
|
|
||||||
|
_NAMES_TO_VALUES = {
|
||||||
|
"GET": 0,
|
||||||
|
"PUT": 1,
|
||||||
|
"POST": 2,
|
||||||
|
"DELETE": 3,
|
||||||
|
"HEAD": 4,
|
||||||
|
"OPTIONS": 5,
|
||||||
|
}
|
||||||
|
|
||||||
|
class Status(object):
|
||||||
|
CONT = 100
|
||||||
|
SWITCHING_PROTOCOLS = 101
|
||||||
|
OK = 200
|
||||||
|
CREATED = 201
|
||||||
|
ACCEPTED = 202
|
||||||
|
NON_AUTHORITATIVE_INFORMATION = 203
|
||||||
|
NO_CONTENT = 204
|
||||||
|
RESET_CONTENT = 205
|
||||||
|
PARTIAL_CONTENT = 206
|
||||||
|
MULTI_STATUS = 207
|
||||||
|
MULTIPLE_CHOICES = 300
|
||||||
|
MOVED_PERMANENTLY = 301
|
||||||
|
FOUND = 302
|
||||||
|
SEE_OTHER = 303
|
||||||
|
NOT_MODIFIED = 304
|
||||||
|
USE_PROXY = 305
|
||||||
|
TEMPORARY_REDIRECT = 307
|
||||||
|
BAD_REQUEST = 400
|
||||||
|
UNAUTHORIZED = 401
|
||||||
|
PAYMENT_REQUIRED = 402
|
||||||
|
FORBIDDEN = 403
|
||||||
|
NOT_FOUND = 404
|
||||||
|
METHOD_NOT_ALLOWED = 405
|
||||||
|
NOT_ACCEPTABLE = 406
|
||||||
|
PROXY_AUTHENTICATION = 407
|
||||||
|
REQUEST_TIMEOUT = 408
|
||||||
|
CONFLICT = 409
|
||||||
|
GONE = 410
|
||||||
|
LENGTH_REQUIRED = 411
|
||||||
|
PRECONDITION_FAILED = 412
|
||||||
|
REQUEST_ENTITY_TOO_LARGE = 413
|
||||||
|
REQUEST_URI_TOO_LONG = 414
|
||||||
|
UNSUPPORTED_MEDIA_TYPE = 415
|
||||||
|
REQUESTED_RANGE_NOT_SATISFIED = 416
|
||||||
|
EXPECTATION_FAILED = 417
|
||||||
|
UNPROCESSABLE_ENTITY = 422
|
||||||
|
LOCKED = 423
|
||||||
|
FAILED_DEPENDENCY = 424
|
||||||
|
INTERNAL_SERVER_ERROR = 500
|
||||||
|
NOT_IMPLEMENTED = 501
|
||||||
|
BAD_GATEWAY = 502
|
||||||
|
SERVICE_UNAVAILABLE = 503
|
||||||
|
GATEWAY_TIMEOUT = 504
|
||||||
|
INSUFFICIENT_STORAGE = 506
|
||||||
|
|
||||||
|
_VALUES_TO_NAMES = {
|
||||||
|
100: "CONT",
|
||||||
|
101: "SWITCHING_PROTOCOLS",
|
||||||
|
200: "OK",
|
||||||
|
201: "CREATED",
|
||||||
|
202: "ACCEPTED",
|
||||||
|
203: "NON_AUTHORITATIVE_INFORMATION",
|
||||||
|
204: "NO_CONTENT",
|
||||||
|
205: "RESET_CONTENT",
|
||||||
|
206: "PARTIAL_CONTENT",
|
||||||
|
207: "MULTI_STATUS",
|
||||||
|
300: "MULTIPLE_CHOICES",
|
||||||
|
301: "MOVED_PERMANENTLY",
|
||||||
|
302: "FOUND",
|
||||||
|
303: "SEE_OTHER",
|
||||||
|
304: "NOT_MODIFIED",
|
||||||
|
305: "USE_PROXY",
|
||||||
|
307: "TEMPORARY_REDIRECT",
|
||||||
|
400: "BAD_REQUEST",
|
||||||
|
401: "UNAUTHORIZED",
|
||||||
|
402: "PAYMENT_REQUIRED",
|
||||||
|
403: "FORBIDDEN",
|
||||||
|
404: "NOT_FOUND",
|
||||||
|
405: "METHOD_NOT_ALLOWED",
|
||||||
|
406: "NOT_ACCEPTABLE",
|
||||||
|
407: "PROXY_AUTHENTICATION",
|
||||||
|
408: "REQUEST_TIMEOUT",
|
||||||
|
409: "CONFLICT",
|
||||||
|
410: "GONE",
|
||||||
|
411: "LENGTH_REQUIRED",
|
||||||
|
412: "PRECONDITION_FAILED",
|
||||||
|
413: "REQUEST_ENTITY_TOO_LARGE",
|
||||||
|
414: "REQUEST_URI_TOO_LONG",
|
||||||
|
415: "UNSUPPORTED_MEDIA_TYPE",
|
||||||
|
416: "REQUESTED_RANGE_NOT_SATISFIED",
|
||||||
|
417: "EXPECTATION_FAILED",
|
||||||
|
422: "UNPROCESSABLE_ENTITY",
|
||||||
|
423: "LOCKED",
|
||||||
|
424: "FAILED_DEPENDENCY",
|
||||||
|
500: "INTERNAL_SERVER_ERROR",
|
||||||
|
501: "NOT_IMPLEMENTED",
|
||||||
|
502: "BAD_GATEWAY",
|
||||||
|
503: "SERVICE_UNAVAILABLE",
|
||||||
|
504: "GATEWAY_TIMEOUT",
|
||||||
|
506: "INSUFFICIENT_STORAGE",
|
||||||
|
}
|
||||||
|
|
||||||
|
_NAMES_TO_VALUES = {
|
||||||
|
"CONT": 100,
|
||||||
|
"SWITCHING_PROTOCOLS": 101,
|
||||||
|
"OK": 200,
|
||||||
|
"CREATED": 201,
|
||||||
|
"ACCEPTED": 202,
|
||||||
|
"NON_AUTHORITATIVE_INFORMATION": 203,
|
||||||
|
"NO_CONTENT": 204,
|
||||||
|
"RESET_CONTENT": 205,
|
||||||
|
"PARTIAL_CONTENT": 206,
|
||||||
|
"MULTI_STATUS": 207,
|
||||||
|
"MULTIPLE_CHOICES": 300,
|
||||||
|
"MOVED_PERMANENTLY": 301,
|
||||||
|
"FOUND": 302,
|
||||||
|
"SEE_OTHER": 303,
|
||||||
|
"NOT_MODIFIED": 304,
|
||||||
|
"USE_PROXY": 305,
|
||||||
|
"TEMPORARY_REDIRECT": 307,
|
||||||
|
"BAD_REQUEST": 400,
|
||||||
|
"UNAUTHORIZED": 401,
|
||||||
|
"PAYMENT_REQUIRED": 402,
|
||||||
|
"FORBIDDEN": 403,
|
||||||
|
"NOT_FOUND": 404,
|
||||||
|
"METHOD_NOT_ALLOWED": 405,
|
||||||
|
"NOT_ACCEPTABLE": 406,
|
||||||
|
"PROXY_AUTHENTICATION": 407,
|
||||||
|
"REQUEST_TIMEOUT": 408,
|
||||||
|
"CONFLICT": 409,
|
||||||
|
"GONE": 410,
|
||||||
|
"LENGTH_REQUIRED": 411,
|
||||||
|
"PRECONDITION_FAILED": 412,
|
||||||
|
"REQUEST_ENTITY_TOO_LARGE": 413,
|
||||||
|
"REQUEST_URI_TOO_LONG": 414,
|
||||||
|
"UNSUPPORTED_MEDIA_TYPE": 415,
|
||||||
|
"REQUESTED_RANGE_NOT_SATISFIED": 416,
|
||||||
|
"EXPECTATION_FAILED": 417,
|
||||||
|
"UNPROCESSABLE_ENTITY": 422,
|
||||||
|
"LOCKED": 423,
|
||||||
|
"FAILED_DEPENDENCY": 424,
|
||||||
|
"INTERNAL_SERVER_ERROR": 500,
|
||||||
|
"NOT_IMPLEMENTED": 501,
|
||||||
|
"BAD_GATEWAY": 502,
|
||||||
|
"SERVICE_UNAVAILABLE": 503,
|
||||||
|
"GATEWAY_TIMEOUT": 504,
|
||||||
|
"INSUFFICIENT_STORAGE": 506,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class RestRequest(object):
|
||||||
|
"""
|
||||||
|
Attributes:
|
||||||
|
- method
|
||||||
|
- uri
|
||||||
|
- parameters
|
||||||
|
- headers
|
||||||
|
- body
|
||||||
|
"""
|
||||||
|
|
||||||
|
thrift_spec = (
|
||||||
|
None, # 0
|
||||||
|
(1, TType.I32, 'method', None, None, ), # 1
|
||||||
|
(2, TType.STRING, 'uri', None, None, ), # 2
|
||||||
|
(3, TType.MAP, 'parameters', (TType.STRING,None,TType.STRING,None), None, ), # 3
|
||||||
|
(4, TType.MAP, 'headers', (TType.STRING,None,TType.STRING,None), None, ), # 4
|
||||||
|
(5, TType.STRING, 'body', None, None, ), # 5
|
||||||
|
)
|
||||||
|
|
||||||
|
def __init__(self, method=None, uri=None, parameters=None, headers=None, body=None,):
|
||||||
|
self.method = method
|
||||||
|
self.uri = uri
|
||||||
|
self.parameters = parameters
|
||||||
|
self.headers = headers
|
||||||
|
self.body = body
|
||||||
|
|
||||||
|
def read(self, iprot):
|
||||||
|
if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
|
||||||
|
fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
|
||||||
|
return
|
||||||
|
iprot.readStructBegin()
|
||||||
|
while True:
|
||||||
|
(fname, ftype, fid) = iprot.readFieldBegin()
|
||||||
|
if ftype == TType.STOP:
|
||||||
|
break
|
||||||
|
if fid == 1:
|
||||||
|
if ftype == TType.I32:
|
||||||
|
self.method = iprot.readI32();
|
||||||
|
else:
|
||||||
|
iprot.skip(ftype)
|
||||||
|
elif fid == 2:
|
||||||
|
if ftype == TType.STRING:
|
||||||
|
self.uri = iprot.readString().decode('utf-8')
|
||||||
|
else:
|
||||||
|
iprot.skip(ftype)
|
||||||
|
elif fid == 3:
|
||||||
|
if ftype == TType.MAP:
|
||||||
|
self.parameters = {}
|
||||||
|
(_ktype1, _vtype2, _size0 ) = iprot.readMapBegin()
|
||||||
|
for _i4 in xrange(_size0):
|
||||||
|
_key5 = iprot.readString().decode('utf-8')
|
||||||
|
_val6 = iprot.readString().decode('utf-8')
|
||||||
|
self.parameters[_key5] = _val6
|
||||||
|
iprot.readMapEnd()
|
||||||
|
else:
|
||||||
|
iprot.skip(ftype)
|
||||||
|
elif fid == 4:
|
||||||
|
if ftype == TType.MAP:
|
||||||
|
self.headers = {}
|
||||||
|
(_ktype8, _vtype9, _size7 ) = iprot.readMapBegin()
|
||||||
|
for _i11 in xrange(_size7):
|
||||||
|
_key12 = iprot.readString().decode('utf-8')
|
||||||
|
_val13 = iprot.readString().decode('utf-8')
|
||||||
|
self.headers[_key12] = _val13
|
||||||
|
iprot.readMapEnd()
|
||||||
|
else:
|
||||||
|
iprot.skip(ftype)
|
||||||
|
elif fid == 5:
|
||||||
|
if ftype == TType.STRING:
|
||||||
|
self.body = iprot.readString();
|
||||||
|
else:
|
||||||
|
iprot.skip(ftype)
|
||||||
|
else:
|
||||||
|
iprot.skip(ftype)
|
||||||
|
iprot.readFieldEnd()
|
||||||
|
iprot.readStructEnd()
|
||||||
|
|
||||||
|
def write(self, oprot):
|
||||||
|
if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
|
||||||
|
oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
|
||||||
|
return
|
||||||
|
oprot.writeStructBegin('RestRequest')
|
||||||
|
if self.method is not None:
|
||||||
|
oprot.writeFieldBegin('method', TType.I32, 1)
|
||||||
|
oprot.writeI32(self.method)
|
||||||
|
oprot.writeFieldEnd()
|
||||||
|
if self.uri is not None:
|
||||||
|
oprot.writeFieldBegin('uri', TType.STRING, 2)
|
||||||
|
oprot.writeString(self.uri.encode('utf-8'))
|
||||||
|
oprot.writeFieldEnd()
|
||||||
|
if self.parameters is not None:
|
||||||
|
oprot.writeFieldBegin('parameters', TType.MAP, 3)
|
||||||
|
oprot.writeMapBegin(TType.STRING, TType.STRING, len(self.parameters))
|
||||||
|
for kiter14,viter15 in self.parameters.items():
|
||||||
|
oprot.writeString(kiter14.encode('utf-8'))
|
||||||
|
oprot.writeString(viter15.encode('utf-8'))
|
||||||
|
oprot.writeMapEnd()
|
||||||
|
oprot.writeFieldEnd()
|
||||||
|
if self.headers is not None:
|
||||||
|
oprot.writeFieldBegin('headers', TType.MAP, 4)
|
||||||
|
oprot.writeMapBegin(TType.STRING, TType.STRING, len(self.headers))
|
||||||
|
for kiter16,viter17 in self.headers.items():
|
||||||
|
oprot.writeString(kiter16.encode('utf-8'))
|
||||||
|
oprot.writeString(viter17.encode('utf-8'))
|
||||||
|
oprot.writeMapEnd()
|
||||||
|
oprot.writeFieldEnd()
|
||||||
|
if self.body is not None:
|
||||||
|
oprot.writeFieldBegin('body', TType.STRING, 5)
|
||||||
|
oprot.writeString(self.body)
|
||||||
|
oprot.writeFieldEnd()
|
||||||
|
oprot.writeFieldStop()
|
||||||
|
oprot.writeStructEnd()
|
||||||
|
|
||||||
|
def validate(self):
|
||||||
|
if self.method is None:
|
||||||
|
raise TProtocol.TProtocolException(message='Required field method is unset!')
|
||||||
|
if self.uri is None:
|
||||||
|
raise TProtocol.TProtocolException(message='Required field uri is unset!')
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
L = ['%s=%r' % (key, value)
|
||||||
|
for key, value in self.__dict__.iteritems()]
|
||||||
|
return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
|
||||||
|
|
||||||
|
def __eq__(self, other):
|
||||||
|
return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
|
||||||
|
|
||||||
|
def __ne__(self, other):
|
||||||
|
return not (self == other)
|
||||||
|
|
||||||
|
class RestResponse(object):
|
||||||
|
"""
|
||||||
|
Attributes:
|
||||||
|
- status
|
||||||
|
- headers
|
||||||
|
- body
|
||||||
|
"""
|
||||||
|
|
||||||
|
thrift_spec = (
|
||||||
|
None, # 0
|
||||||
|
(1, TType.I32, 'status', None, None, ), # 1
|
||||||
|
(2, TType.MAP, 'headers', (TType.STRING,None,TType.STRING,None), None, ), # 2
|
||||||
|
(3, TType.STRING, 'body', None, None, ), # 3
|
||||||
|
)
|
||||||
|
|
||||||
|
def __init__(self, status=None, headers=None, body=None,):
|
||||||
|
self.status = status
|
||||||
|
self.headers = headers
|
||||||
|
self.body = body
|
||||||
|
|
||||||
|
def read(self, iprot):
|
||||||
|
if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
|
||||||
|
fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
|
||||||
|
return
|
||||||
|
iprot.readStructBegin()
|
||||||
|
while True:
|
||||||
|
(fname, ftype, fid) = iprot.readFieldBegin()
|
||||||
|
if ftype == TType.STOP:
|
||||||
|
break
|
||||||
|
if fid == 1:
|
||||||
|
if ftype == TType.I32:
|
||||||
|
self.status = iprot.readI32();
|
||||||
|
else:
|
||||||
|
iprot.skip(ftype)
|
||||||
|
elif fid == 2:
|
||||||
|
if ftype == TType.MAP:
|
||||||
|
self.headers = {}
|
||||||
|
(_ktype19, _vtype20, _size18 ) = iprot.readMapBegin()
|
||||||
|
for _i22 in xrange(_size18):
|
||||||
|
_key23 = iprot.readString().decode('utf-8')
|
||||||
|
_val24 = iprot.readString().decode('utf-8')
|
||||||
|
self.headers[_key23] = _val24
|
||||||
|
iprot.readMapEnd()
|
||||||
|
else:
|
||||||
|
iprot.skip(ftype)
|
||||||
|
elif fid == 3:
|
||||||
|
if ftype == TType.STRING:
|
||||||
|
self.body = iprot.readString();
|
||||||
|
else:
|
||||||
|
iprot.skip(ftype)
|
||||||
|
else:
|
||||||
|
iprot.skip(ftype)
|
||||||
|
iprot.readFieldEnd()
|
||||||
|
iprot.readStructEnd()
|
||||||
|
|
||||||
|
def write(self, oprot):
|
||||||
|
if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
|
||||||
|
oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
|
||||||
|
return
|
||||||
|
oprot.writeStructBegin('RestResponse')
|
||||||
|
if self.status is not None:
|
||||||
|
oprot.writeFieldBegin('status', TType.I32, 1)
|
||||||
|
oprot.writeI32(self.status)
|
||||||
|
oprot.writeFieldEnd()
|
||||||
|
if self.headers is not None:
|
||||||
|
oprot.writeFieldBegin('headers', TType.MAP, 2)
|
||||||
|
oprot.writeMapBegin(TType.STRING, TType.STRING, len(self.headers))
|
||||||
|
for kiter25,viter26 in self.headers.items():
|
||||||
|
oprot.writeString(kiter25.encode('utf-8'))
|
||||||
|
oprot.writeString(viter26.encode('utf-8'))
|
||||||
|
oprot.writeMapEnd()
|
||||||
|
oprot.writeFieldEnd()
|
||||||
|
if self.body is not None:
|
||||||
|
oprot.writeFieldBegin('body', TType.STRING, 3)
|
||||||
|
oprot.writeString(self.body)
|
||||||
|
oprot.writeFieldEnd()
|
||||||
|
oprot.writeFieldStop()
|
||||||
|
oprot.writeStructEnd()
|
||||||
|
|
||||||
|
def validate(self):
|
||||||
|
if self.status is None:
|
||||||
|
raise TProtocol.TProtocolException(message='Required field status is unset!')
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
L = ['%s=%r' % (key, value)
|
||||||
|
for key, value in self.__dict__.iteritems()]
|
||||||
|
return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
|
||||||
|
|
||||||
|
def __eq__(self, other):
|
||||||
|
return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
|
||||||
|
|
||||||
|
def __ne__(self, other):
|
||||||
|
return not (self == other)
|
||||||
Reference in New Issue
Block a user