def SendChunked(self, data, compress=True, zhistory=None, just_buffer=False): rst = '' if self.zreset: self.zreset = False rst = 'R' # Stop compressing streams that just get bigger. if zhistory and (zhistory[0] < zhistory[1]): compress = False try: try: if self.lock: self.lock.acquire() sdata = ''.join(data) if self.zw and compress and len(sdata) > 64: try: zdata = self.zw.compress(sdata) + self.zw.flush(zlib.Z_SYNC_FLUSH) if zhistory: zhistory[0] = len(sdata) zhistory[1] = len(zdata) return self.Send(['%xZ%x%s\r\n' % (len(sdata), len(zdata), rst), zdata], activity=False, try_flush=(not just_buffer), just_buffer=just_buffer) except zlib.error: logging.LogError('Error compressing, resetting ZChunks.') self.ResetZChunks() return self.Send(['%x%s\r\n' % (len(sdata), rst), sdata], activity=False, try_flush=(not just_buffer), just_buffer=just_buffer) except UnicodeDecodeError: logging.LogError('UnicodeDecodeError in SendChunked, wtf?') return False finally: if self.lock: self.lock.release()
def SendChunked(self, data, compress=True, zhistory=None, just_buffer=False): if self.use_websocket: with self.lock: return self.Send([ ABNF.create_frame(''.join(data), ABNF.OPCODE_BINARY, 1, self.ws_zero_mask).format() ], activity=False, try_flush=(not just_buffer), just_buffer=just_buffer) rst = '' if self.zreset: self.zreset = False rst = 'R' # Stop compressing streams that just get bigger. if zhistory and (zhistory[0] < zhistory[1]): compress = False with self.lock: try: sdata = ''.join(data) if self.zw and compress and len(sdata) > 64: try: zdata = s( self.zw.compress(b(sdata)) + self.zw.flush(zlib.Z_SYNC_FLUSH)) if zhistory: zhistory[0] = len(sdata) zhistory[1] = len(zdata) return self.Send([ '%xZ%x%s\r\n' % (len(sdata), len(zdata), rst), zdata ], activity=False, try_flush=(not just_buffer), just_buffer=just_buffer) except zlib.error: logging.LogError( 'Error compressing, resetting ZChunks.') self.ResetZChunks() return self.Send(['%x%s\r\n' % (len(sdata), rst), sdata], activity=False, try_flush=(not just_buffer), just_buffer=just_buffer) except UnicodeDecodeError: logging.LogError('UnicodeDecodeError in SendChunked, wtf?') return False
def Tell(self, lines, error=False, back=None): if error: logging.LogError(' '.join(lines)) raise ConfigError(' '.join(lines)) else: logging.Log([('message', ' '.join(lines))]) return True
def Cleanup(self, close=True): self.peeked = self.zw = '' self.Die(discard_buffer=True) if close: if self.fd: if logging.DEBUG_IO: self.LogDebug('Closing FD: %s' % self) self.fd.close() # Update DNS if necessary if hasattr(self, "backends"): if common.pko.dnsclient: try: for b in self.backends: domain = b.split(':')[1] logging.LogDebug("Deleting dynamic DNS name: %s" % domain) common.pko.dnsclient.delete_async(domain) except Exception as e: logging.LogError( "Could not delete dynamic DNS name: %s" % e) self.fd = None if not self.dead: self.dead = True self.CountAs('selectables_dead') if close: self.LogTraffic(final=True)
def filter_connected(self, tunnel, sid, data): info = self.sid.get(sid) if info: if not info.get(self.ENABLE, False): pass elif info[self.ENABLE] in ("1", True): remote_ip = info['remote_ip'] if '.' in remote_ip: remote_ip = remote_ip.rsplit(':', 1)[1] data = 'PROXY TCP%s %s 0.0.0.0 %s %s\r\n%s' % ( '4' if ('.' in remote_ip) else '6', remote_ip, info['remote_port'], info['port'], data or '') else: logging.LogError('FIXME: Unimplemented PROXY protocol v%s\n' % info[self.ENABLE]) return TunnelFilter.filter_connected(self, tunnel, sid, data)
def LogError(self, error, params=None): values = params or [] if self.log_id: values.append(('id', self.log_id)) logging.LogError(error, values)
def LogError(self, error, params=None): values = params or [] if self.log_id: values.extend([('id', self.log_id), ('s', self.sstate)]) logging.LogError(error, values)