def proxy_dispatcher(self, proxy_web_socket, path): self.logger.log("Connection established with CLIENT") connection = WebSocketConnection() if not self.is_forced_url_no_password_server(): connection.credentials = yield from self.get_credentials(proxy_web_socket) if self.authenticate(connection): authenticated_message = "Authenticated " + self.get_post_authentication_directions() yield from proxy_web_socket.send(get_json_status_response("ok", authenticated_message + "'}")) if self.is_open_url_server(): proxied_url_value = yield from self.get_proxy_url_from_client(proxy_web_socket) if proxied_url_value is None: return else: proxied_url_value = self.proxied_url proxied_web_socket = yield from self.connect_to_proxy_server(proxied_url_value, proxy_web_socket) yield from self.process_arbitrary_requests(proxy_web_socket, proxied_web_socket, connection) else: auth_failed_message = "Authentication failed. Password invalid [" + connection.credentials + "]" yield from proxy_web_socket.send(get_json_status_response("error", auth_failed_message + "'}")) self.logger.log("CLIENT authentication credentials [" + connection.credentials + "] rejected.") else: proxied_url_value = self.proxied_url proxied_web_socket = yield from self.connect_to_proxy_server(proxied_url_value, proxy_web_socket) yield from self.process_arbitrary_requests(proxy_web_socket, proxied_web_socket, connection)
def proxy_dispatcher(self, proxy_web_socket, path): self.logger.log("Connection established with CLIENT") connection = WebSocketConnection() if not self.is_forced_url_no_password_server(): connection.credentials = yield from self.get_credentials(proxy_web_socket) if self.authenticate(connection): authenticated_message = "Authenticated " + self.get_post_authentication_directions() yield from proxy_web_socket.send(get_json_status_response("ok", authenticated_message + "'}")) if self.is_open_url_server(): proxied_url_value = yield from self.get_proxy_url_from_client(proxy_web_socket) if proxied_url_value is None: return else: proxied_url_value = self.proxied_url proxied_web_socket = yield from self.connect_to_proxy_server(proxied_url_value, proxy_web_socket) yield from self.process_arbitrary_requests(proxy_web_socket, proxied_web_socket, connection) else: auth_failed_message = "Authentication failed. Password invalid [" + connection.credentials + "]" yield from proxy_web_socket.send(get_json_status_response("error", auth_failed_message + "'}")) self.logger.log("CLIENT authentication credentials [" + connection.credentials + "] rejected.") else: proxied_url_value = self.proxied_url proxied_web_socket = yield from self.connect_to_proxy_server(proxied_url_value, proxy_web_socket) yield from self.process_arbitrary_requests(proxy_web_socket, proxied_web_socket, connection)
def process_arbitrary_requests(self, proxy_web_socket, proxied_web_socket, connection): while True: request_for_proxy = yield from proxy_web_socket.recv() self.logger.log("Received request from CLIENT [" + request_for_proxy + "]") if self.is_close(request_for_proxy): self.logger.log("Received CLOSE from CLIENT [" + request_for_proxy + "]") return if self.send_prefix is not None and self.send_suffix is not None: request_for_proxy = self.send_prefix + request_for_proxy + self.send_suffix yield from self.send_to_web_socket_connection_aware(proxy_web_socket, proxied_web_socket, request_for_proxy) connection.request_count += 1 if connection.request_count > self.requests_per_connection: connection_limit_error = "Unable to proxy request, connection exceeds config limit of [" + str( self.requests_per_connection) + "] requests per connection." self.logger.log(connection_limit_error) yield from proxy_web_socket.send(get_json_status_response("error", connection_limit_error)) return self.logger.log( "Sending request [" + str(connection.request_count) + "] to PROXIED SERVER [" + request_for_proxy + "]") response_from_proxy = yield from proxied_web_socket.recv() self.logger.log("Received response from PROXIED SERVER [" + response_from_proxy + "]") yield from proxy_web_socket.send(response_from_proxy) self.logger.log("Sending response to CLIENT [" + response_from_proxy + "]")
def process_arbitrary_requests(self, proxy_web_socket, proxied_web_socket, connection): while True: request_for_proxy = yield from proxy_web_socket.recv() self.logger.log("Received request from CLIENT [" + request_for_proxy + "]") if self.is_close(request_for_proxy): self.logger.log("Received CLOSE from CLIENT [" + request_for_proxy + "]") return if self.send_prefix is not None and self.send_suffix is not None: request_for_proxy = self.send_prefix + request_for_proxy + self.send_suffix yield from self.send_to_web_socket_connection_aware(proxy_web_socket, proxied_web_socket, request_for_proxy) connection.request_count += 1 if connection.request_count > self.requests_per_connection: connection_limit_error = "Unable to proxy request, connection exceeds config limit of [" + str( self.requests_per_connection) + "] requests per connection." self.logger.log(connection_limit_error) yield from proxy_web_socket.send(get_json_status_response("error", connection_limit_error)) return self.logger.log( "Sending request [" + str(connection.request_count) + "] to PROXIED SERVER [" + request_for_proxy + "]") response_from_proxy = yield from proxied_web_socket.recv() self.logger.log("Received response from PROXIED SERVER [" + response_from_proxy + "]") yield from proxy_web_socket.send(response_from_proxy) self.logger.log("Sending response to CLIENT [" + response_from_proxy + "]")
def send_to_web_socket_connection_aware(self, proxy_web_socket, proxied_web_socket, request_for_proxy): try: yield from proxied_web_socket.send(request_for_proxy) except websockets.exceptions.InvalidState: proxy_web_socket.send( get_json_status_response("ok", "Proxied connection closed."))
def get_proxy_url_from_client(self, proxy_web_socket, ): proxied_url_json = yield from proxy_web_socket.recv() proxied_url_value = self.parse_destination_url(proxied_url_json) self.logger.log("PROXIED SERVER url received [" + proxied_url_value + "]") if proxied_url_value is None: url_missing_message = "Couldn't establish proxy. Url not provided in [" + proxied_url_json + "]" yield from proxy_web_socket.send(get_json_status_response("error", url_missing_message + "'}")) return proxied_url_value
def connect_to_proxy_server(self, proxied_url_value, proxy_web_socket): try: proxied_web_socket = yield from websockets.connect(proxied_url_value) except ConnectionRefusedError: yield from self.respond_with_proxy_connect_error(proxied_url_value, proxy_web_socket) return self.logger.log("Established proxied connection with PROXIED SERVER [" + proxied_url_value + "]") connection_open_message = "Proxied connection [" + proxied_url_value + "] open for arbitrary requests.'" yield from proxy_web_socket.send(get_json_status_response("ok", connection_open_message)) return proxied_web_socket
def get_proxy_url_from_client( self, proxy_web_socket, ): proxied_url_json = yield from proxy_web_socket.recv() proxied_url_value = self.parse_destination_url(proxied_url_json) self.logger.log("PROXIED SERVER url received [" + proxied_url_value + "]") if proxied_url_value is None: url_missing_message = "Couldn't establish proxy. Url not provided in [" + proxied_url_json + "]" yield from proxy_web_socket.send( get_json_status_response("error", url_missing_message + "'}")) return proxied_url_value
def connect_to_proxy_server(self, proxied_url_value, proxy_web_socket): try: proxied_web_socket = yield from websockets.connect( proxied_url_value) except ConnectionRefusedError: yield from self.respond_with_proxy_connect_error( proxied_url_value, proxy_web_socket) return self.logger.log( "Established proxied connection with PROXIED SERVER [" + proxied_url_value + "]") connection_open_message = "Proxied connection [" + proxied_url_value + "] open for arbitrary requests.'" yield from proxy_web_socket.send( get_json_status_response("ok", connection_open_message)) return proxied_web_socket
def respond_with_proxy_connect_error(self, proxied_url_value, proxy_web_socket): error_message = "Unable to connect with proxied url [" + proxied_url_value + "]. Connection closed." yield from proxy_web_socket.send( get_json_status_response("error", error_message + "'}")) self.logger.log(error_message)
def send_to_web_socket_connection_aware(self, proxy_web_socket, proxied_web_socket, request_for_proxy): try: yield from proxied_web_socket.send(request_for_proxy) except websockets.exceptions.InvalidState: proxy_web_socket.send(get_json_status_response("ok", "Proxied connection closed."))
def respond_with_proxy_connect_error(self, proxied_url_value, proxy_web_socket): error_message = "Unable to connect with proxied url [" + proxied_url_value + "]. Connection closed." yield from proxy_web_socket.send(get_json_status_response("error", error_message + "'}")) self.logger.log(error_message)