def _start_upstream(self): self._buffer.seek(0) firstline = self._buffer.readline() match = re.match("(?:CONNECT) ([^:]+)(?:[:](\d+))? \w+", firstline) if match is None: return host = match.group(1) port = int(match.group(2) or 443) cachebrowsed = False try: Host.get(Host.hostname == host) cachebrowsed = True except Host.DoesNotExist: pass if cachebrowsed: #logger.info("[HTTPS] %s:%s <REJECTED>" % (host, port)) #self.connection.close_local() logger.info("[HTTPS] %s:%s <CACHEBROWSED>" % (host, port)) return self._connect_upstream(host, port) else: logger.info("[HTTPS] %s:%s <PROXYING>" % (host, port)) return self._connect_upstream(host, port)
def _send_upstream_request(self): def on_response(response): raw_response = response.get_raw() raw_response = re.sub('((?:src|href|ng-src|ng-href)\s*=\s*)[\'"]((?:(?:http|https):/)?.*/.*)[\'"]', r'\1"http://127.0.0.1:9000/?v=\2"', raw_response) self.send(raw_response) self._socket.close() logger.info("%s %s" % (self.method, self.url)) request(self.url, method=self.method, headers=self.headers, callback=on_response)
def run_cachebrowser(): logger.info("Cachebrowser running...") logger.debug("Waiting for connections...") monkey.patch_all() rack.create_server('cli', port=5100, handler=cli.CLIHandler) rack.add_server('api', HttpServer(port=5200, handler=api.APIHandler)) rack.create_server('proxy', port=8080, handler=proxy.ProxyConnection) rack.create_server('http', port=9005, handler=http.HttpConnection) common.context['server_rack'] = rack load_extensions() rack.start_all() gevent.wait()
def bootstrap(self, hostname): hostname = self._validate_host_name(hostname) host_source = None # Lookup Host from sources try: host_data, host_source = self._lookup_host(hostname) host, host_created = self._get_or_create_host(hostname, create=True) host.uses_ssl = host_data['ssl'] cdn, cdn_created = self._get_or_create_cdn(host_data['cdn'], create=True) host.cdn = cdn except HostNotAvailableError: host, host_created = self._get_or_create_host(hostname, create=False) if not host: raise cdn, cdn_created = host.cdn, False # Bootstrap CDN from sources if cdn_created or cdn.edge_server is None: try: cdn_data, cdn_source = self._lookup_cdn(cdn.id) cdn.name = cdn_data['name'] cdn.edge_server = cdn_data['edge_server'] cdn.save() logger.info("CDN '%s' bootstrapped from '%s'" % (cdn, str(cdn_source))) except CDNNotAvailableError: host.is_active = False host.save() raise host.is_active = True host.save() if host_source is not None: logger.info("Host '%s' bootstrapped from '%s'" % (host, str(host_source))) return host
def _start_remote(self): http_request = self.request_builder.http_request url = http_request.path parsed_url = urlparse.urlparse(url) try: host = Host.get(Host.hostname==parsed_url.hostname) if host.uses_ssl: url = url.replace('http', 'https') self.cachebrowsed = True except Host.DoesNotExist: pass logger.info("[%s] %s %s" % (http_request.method, url, '<CACHEBROWSED>' if self.cachebrowsed else '')) request = http_request.get_raw() # request = re.sub(r'^(GET|POST|PUT|DELETE|HEAD) http[s]?://[^/]+/(.+) (\w+)', r'\1 /\2 \3', request) response = http.request(url, raw_request=request) self._connection.start_remote(response)
def _start_remote(self): http_request = self.request_builder.http_request url = http_request.path parsed_url = urlparse.urlparse(url) try: host = Host.get(Host.hostname == parsed_url.hostname) if host.uses_ssl: url = url.replace('http', 'https') self.cachebrowsed = True except Host.DoesNotExist: pass logger.info("[%s] %s %s" % (http_request.method, url, '<CACHEBROWSED>' if self.cachebrowsed else '')) request = http_request.get_raw() # request = re.sub(r'^(GET|POST|PUT|DELETE|HEAD) http[s]?://[^/]+/(.+) (\w+)', r'\1 /\2 \3', request) response = http.request(url, raw_request=request) self._connection.start_remote(response)