Rev 30 | Blame | Compare with Previous | Last modification | View Log | RSS feed
## Licensed to the Apache Software Foundation (ASF) under one# or more contributor license agreements. See the NOTICE file# distributed with this work for additional information# regarding copyright ownership. The ASF licenses this file# to you under the Apache License, Version 2.0 (the# "License"); you may not use this file except in compliance# with the License. You may obtain a copy of the License at## http://www.apache.org/licenses/LICENSE-2.0## Unless required by applicable law or agreed to in writing,# software distributed under the License is distributed on an# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY# KIND, either express or implied. See the License for the# specific language governing permissions and limitations# under the License.#from TTransport import *from cStringIO import StringIOimport urlparseimport httplibimport warningsclass THttpClient(TTransportBase):"""Http implementation of TTransport base."""def __init__(self, uri_or_host, port=None, path=None):"""THttpClient supports two different types constructor parameters.THttpClient(host, port, path) - deprecatedTHttpClient(uri)Only the second supports https."""if port is not None:warnings.warn("Please use the THttpClient('http://host:port/path') syntax", DeprecationWarning, stacklevel=2)self.host = uri_or_hostself.port = portassert pathself.path = pathself.scheme = 'http'else:parsed = urlparse.urlparse(uri_or_host)self.scheme = parsed.schemeassert self.scheme in ('http', 'https')if self.scheme == 'http':self.port = parsed.port or httplib.HTTP_PORTelif self.scheme == 'https':self.port = parsed.port or httplib.HTTPS_PORTself.host = parsed.hostnameself.path = parsed.pathself.__wbuf = StringIO()self.__http = Nonedef open(self):if self.scheme == 'http':self.__http = httplib.HTTP(self.host, self.port)else:self.__http = httplib.HTTPS(self.host, self.port)def close(self):self.__http.close()self.__http = Nonedef isOpen(self):return self.__http != Nonedef read(self, sz):return self.__http.file.read(sz)def write(self, buf):self.__wbuf.write(buf)def flush(self):if self.isOpen():self.close()self.open();# Pull data out of bufferdata = self.__wbuf.getvalue()self.__wbuf = StringIO()# HTTP requestself.__http.putrequest('POST', self.path)# Write headersself.__http.putheader('Host', self.host)self.__http.putheader('Content-Type', 'application/x-thrift')self.__http.putheader('Content-Length', str(len(data)))self.__http.endheaders()# Write payloadself.__http.send(data)# Get reply to flush the requestself.code, self.message, self.headers = self.__http.getreply()