def validate_request_form(mode, request): if request.first_line_format == "absolute" and request.scheme != "http": raise exceptions.HttpException("Invalid request scheme: %s" % request.scheme) allowed_request_forms = MODE_REQUEST_FORMS[mode] if request.first_line_format not in allowed_request_forms: err_message = "Invalid HTTP request form (expected: %s, got: %s)" % ( " or ".join(allowed_request_forms), request.first_line_format) raise exceptions.HttpException(err_message)
def send_response(self, response): if response.data.content is None: raise exceptions.HttpException( "Cannot assemble flow with missing content") self.send_response_headers(response) self.send_response_body(response, [response.data.content]) self.send_response_trailers(response)
def validate_request_form(mode, request): if request.first_line_format == "absolute" and request.scheme != "http": raise exceptions.HttpException("Invalid request scheme: %s" % request.scheme) allowed_request_forms = MODE_REQUEST_FORMS[mode] if request.first_line_format not in allowed_request_forms: if mode == HTTPMode.transparent: err_message = ( "Mitmproxy received an {} request even though it is not running in regular mode. " "This usually indicates a misconfiguration, please see " "http://docs.mitmproxy.org/en/stable/modes.html for details." ).format("HTTP CONNECT" if request.first_line_format == "authority" else "absolute-form") else: err_message = "Invalid HTTP request form (expected: %s, got: %s)" % ( " or ".join(allowed_request_forms), request.first_line_format) raise exceptions.HttpException(err_message)
def validate_request(self, request): if request.first_line_format == "absolute" and request.scheme != "http": raise exceptions.HttpException("Invalid request scheme: %s" % request.scheme) expected_request_forms = { "regular": ("authority", "absolute",), "upstream": ("authority", "absolute"), "transparent": ("relative",) } allowed_request_forms = expected_request_forms[self.mode] if request.first_line_format not in allowed_request_forms: err_message = "Invalid HTTP request form (expected: %s, got: %s)" % ( " or ".join(allowed_request_forms), request.first_line_format ) raise exceptions.HttpException(err_message) if self.mode == "regular" and request.first_line_format == "absolute": request.first_line_format = "relative"
def validate_request_form(mode, request): if request.first_line_format == "absolute" and request.scheme not in ( "http", "https"): raise exceptions.HttpException("Invalid request scheme: %s" % request.scheme) allowed_request_forms = MODE_REQUEST_FORMS[mode] if request.first_line_format not in allowed_request_forms: if request.is_http2 and mode is HTTPMode.transparent and request.first_line_format == "absolute": return # dirty hack: h2 may have authority info. will be fixed properly with sans-io. if mode == HTTPMode.transparent: err_message = textwrap.dedent(""" Mitmproxy received an {} request even though it is not running in regular mode. This usually indicates a misconfiguration, please see the mitmproxy mode documentation for details. """).strip().format("HTTP CONNECT" if request.first_line_format == "authority" else "absolute-form") else: err_message = "Invalid HTTP request form (expected: {}, got: {})".format( " or ".join(allowed_request_forms), request.first_line_format) raise exceptions.HttpException(err_message)