def testCompressDecompressStream(self): # Test that compressing and uncompressing streams produces the same # data fd, tempf = tempfile.mkstemp() os.unlink(tempf) sio = os.fdopen(fd, "w+") # Some data we will compress for fn in ['distcache-1.4.5-2.src.rpm', 'distcc-2.9.tar.bz2', 'initscripts-10-11.src.rpm', 'jcd.iso']: util.copyStream(file(os.path.join(resources.get_archive(), fn)), sio) sio.seek(0) cstr = util.compressStream(sio) cstr.seek(0) dstr = util.decompressStream(cstr) dstr.seek(0) sio.seek(0) self.assertEqual(sio.read(), dstr.read())
def handleXml(self, authToken): contentLength = int(self.headers['Content-Length']) sio = util.BoundedStringIO() actual = util.copyStream(self.rfile, sio, contentLength) if contentLength != actual: raise Exception(contentLength, actual) sio.seek(0) encoding = self.headers.get('Content-Encoding', None) if encoding == 'deflate': sio = util.decompressStream(sio) sio.seek(0) (params, method) = util.xmlrpcLoad(sio) logMe( 3, "decoded xml-rpc call %s from %d bytes request" % (method, contentLength)) if self.netProxy: repos = self.netProxy else: repos = self.netRepos localHost, localPort = self.request.getsockname()[:2] if ':' in localHost: localHost = '[%s]' % localHost localAddr = '%s:%s' % (localHost, localPort) request = xmlshims.RequestArgs.fromWire(params) if repos is not None: try: response, extraInfo = repos.callWrapper( protocol='http', port=None, methodname=method, authToken=authToken, request=request, remoteIp=self.connection.getpeername()[0], rawUrl=self.path, localAddr=localAddr, protocolString=self.request_version, headers=self.headers, isSecure=self.server.isSecure, ) except errors.InsufficientPermission: self.send_error(403) return None except: # exceptions are handled (logged) in callWrapper - send # 500 code back to the client to indicate an error happened self.send_error(500) from conary.lib import formattrace excType, excValue, excTb = sys.exc_info() formattrace.formatTrace(excType, excValue, excTb, withLocals=False) return None logMe(3, "returned from", method) rawResponse, headers = response.toWire(request.version) sio = util.BoundedStringIO() util.xmlrpcDump((rawResponse, ), stream=sio, methodresponse=1) respLen = sio.tell() logMe(3, "encoded xml-rpc response to %d bytes" % respLen) self.send_response(200) encoding = self.headers.get('Accept-encoding', '') if respLen > 200 and 'deflate' in encoding: sio.seek(0) sio = util.compressStream(sio, level=5) respLen = sio.tell() self.send_header('Content-encoding', 'deflate') self.send_header("Content-type", "text/xml") self.send_header("Content-length", str(respLen)) for key, value in sorted(headers.items()): self.send_header(key, value) if extraInfo: # If available, send to the client the via headers all the way up # to us self.send_header( 'Via', proxy.formatViaHeader(localAddr, 'HTTP/1.0', prefix=extraInfo.getVia())) self.end_headers() sio.seek(0) util.copyStream(sio, self.wfile) logMe(3, "sent response to client", respLen, "bytes") return respLen
rawResponse, headers = response.toWire(request.version) sio = util.BoundedStringIO() util.xmlrpcDump((rawResponse, ), stream=sio, methodresponse=1) respLen = sio.tell() repos.log(1, method, "time=%.3f size=%d" % (time.time() - startTime, respLen)) req.content_type = "text/xml" # check to see if the client will accept a compressed response encoding = req.headers_in.get('Accept-encoding', '') if respLen > 200 and 'deflate' in encoding: req.headers_out['Content-encoding'] = 'deflate' sio.seek(0) sio = util.compressStream(sio, 5) respLen = sio.tell() req.headers_out['Content-length'] = '%d' % respLen for key, value in sorted(headers.items()): req.headers_out[key] = value if extraInfo: # If available, send to the client the via headers all the way up # to us req.headers_out['Via'] = proxy.formatViaHeader( localAddr, 'HTTP/1.0', prefix=extraInfo.getVia()) sio.seek(0) util.copyStream(sio, req) return apache.OK else: # Handle HTTP (web browser) requests
def handleXml(self, authToken): contentLength = int(self.headers['Content-Length']) sio = util.BoundedStringIO() actual = util.copyStream(self.rfile, sio, contentLength) if contentLength != actual: raise Exception(contentLength, actual) sio.seek(0) encoding = self.headers.get('Content-Encoding', None) if encoding == 'deflate': sio = util.decompressStream(sio) sio.seek(0) (params, method) = util.xmlrpcLoad(sio) logMe(3, "decoded xml-rpc call %s from %d bytes request" %(method, contentLength)) if self.netProxy: repos = self.netProxy else: repos = self.netRepos localHost, localPort = self.request.getsockname()[:2] if ':' in localHost: localHost = '[%s]' % localHost localAddr = '%s:%s' % (localHost, localPort) request = xmlshims.RequestArgs.fromWire(params) if repos is not None: try: response, extraInfo = repos.callWrapper( protocol='http', port=None, methodname=method, authToken=authToken, request=request, remoteIp=self.connection.getpeername()[0], rawUrl=self.path, localAddr=localAddr, protocolString=self.request_version, headers=self.headers, isSecure=self.server.isSecure, ) except errors.InsufficientPermission: self.send_error(403) return None except: # exceptions are handled (logged) in callWrapper - send # 500 code back to the client to indicate an error happened self.send_error(500) from conary.lib import formattrace excType, excValue, excTb = sys.exc_info() formattrace.formatTrace(excType, excValue, excTb, withLocals = False) return None logMe(3, "returned from", method) rawResponse, headers = response.toWire(request.version) sio = util.BoundedStringIO() util.xmlrpcDump((rawResponse,), stream = sio, methodresponse=1) respLen = sio.tell() logMe(3, "encoded xml-rpc response to %d bytes" % respLen) self.send_response(200) encoding = self.headers.get('Accept-encoding', '') if respLen > 200 and 'deflate' in encoding: sio.seek(0) sio = util.compressStream(sio, level = 5) respLen = sio.tell() self.send_header('Content-encoding', 'deflate') self.send_header("Content-type", "text/xml") self.send_header("Content-length", str(respLen)) for key, value in sorted(headers.items()): self.send_header(key, value) if extraInfo: # If available, send to the client the via headers all the way up # to us self.send_header('Via', proxy.formatViaHeader(localAddr, 'HTTP/1.0', prefix=extraInfo.getVia())) self.end_headers() sio.seek(0) util.copyStream(sio, self.wfile) logMe(3, "sent response to client", respLen, "bytes") return respLen
rawResponse, headers = response.toWire(request.version) sio = util.BoundedStringIO() util.xmlrpcDump((rawResponse,), stream=sio, methodresponse=1) respLen = sio.tell() repos.log(1, method, "time=%.3f size=%d" % (time.time()-startTime, respLen)) req.content_type = "text/xml" # check to see if the client will accept a compressed response encoding = req.headers_in.get('Accept-encoding', '') if respLen > 200 and 'deflate' in encoding: req.headers_out['Content-encoding'] = 'deflate' sio.seek(0) sio = util.compressStream(sio, 5) respLen = sio.tell() req.headers_out['Content-length'] = '%d' % respLen for key, value in sorted(headers.items()): req.headers_out[key] = value if extraInfo: # If available, send to the client the via headers all the way up # to us req.headers_out['Via'] = proxy.formatViaHeader(localAddr, 'HTTP/1.0', prefix=extraInfo.getVia()) sio.seek(0) util.copyStream(sio, req) return apache.OK else: # Handle HTTP (web browser) requests