示例#1
0
 def handle_exception(self, exc_info, environ):
     event_id = self.client.capture(
         "Exception",
         exc_info=exc_info,
         context={
             "request": {
                 "method": environ.get("REQUEST_METHOD"),
                 "url": get_url_dict(get_current_url(environ)),
                 "headers": dict(get_headers(environ)),
                 "env": dict(get_environ(environ)),
             }
         },
         handled=False,
     )
     return event_id
def get_data_from_request(request, config, event_type):
    result = {
        "env": dict(get_environ(request.environ)),
        "method": request.method,
        "socket": {
            "remote_address": request.environ.get("REMOTE_ADDR"),
            "encrypted": request.is_secure
        },
        "cookies": request.cookies,
    }
    if config.capture_headers:
        result["headers"] = dict(get_headers(request.environ))
    if request.method in constants.HTTP_WITH_BODY:
        if config.capture_body not in ("all", event_type):
            result["body"] = "[REDACTED]"
        else:
            body = None
            if request.content_type == "application/x-www-form-urlencoded":
                body = compat.multidict_to_dict(request.form)
            elif request.content_type and request.content_type.startswith(
                    "multipart/form-data"):
                body = compat.multidict_to_dict(request.form)
                if request.files:
                    body["_files"] = {
                        field: val[0].filename
                        if len(val) == 1 else [f.filename for f in val]
                        for field, val in compat.iterlists(request.files)
                    }
            else:
                try:
                    body = request.get_data(as_text=True)
                except ClientDisconnected:
                    pass

            if body is not None:
                result["body"] = body

    result["url"] = get_url_dict(request.url)
    return result
    def get_data_from_request(self, request, event_type):
        result = {
            "env": dict(get_environ(request.META)),
            "method": request.method,
            "socket": {
                "remote_address": request.META.get("REMOTE_ADDR"),
                "encrypted": request.is_secure()
            },
            "cookies": dict(request.COOKIES),
        }
        if self.config.capture_headers:
            request_headers = dict(get_headers(request.META))

            for key, value in request_headers.items():
                if isinstance(value, (int, float)):
                    request_headers[key] = str(value)

            result["headers"] = request_headers

        if request.method in constants.HTTP_WITH_BODY:
            capture_body = self.config.capture_body in ("all", event_type)
            if not capture_body:
                result["body"] = "[REDACTED]"
            else:
                content_type = request.META.get("CONTENT_TYPE")
                if content_type == "application/x-www-form-urlencoded":
                    data = compat.multidict_to_dict(request.POST)
                elif content_type and content_type.startswith(
                        "multipart/form-data"):
                    data = compat.multidict_to_dict(request.POST)
                    if request.FILES:
                        data["_files"] = {
                            field: file.name
                            for field, file in compat.iteritems(request.FILES)
                        }
                else:
                    try:
                        data = request.body
                    except Exception as e:
                        self.logger.debug("Can't capture request body: %s",
                                          compat.text_type(e))
                        data = "<unavailable>"
                if data is not None:
                    result["body"] = data

        if hasattr(request, "get_raw_uri"):
            # added in Django 1.9
            url = request.get_raw_uri()
        else:
            try:
                # Requires host to be in ALLOWED_HOSTS, might throw a
                # DisallowedHost exception
                url = request.build_absolute_uri()
            except DisallowedHost:
                # We can't figure out the real URL, so we have to set it to
                # DisallowedHost
                result["url"] = {"full": "DisallowedHost"}
                url = None
        if url:
            result["url"] = get_url_dict(url)
        return result
示例#4
0
def test_get_headers_coerces_content_length():
    result = dict(get_headers({"CONTENT_LENGTH": "134"}))
    assert "content-length" in result
    assert result["content-length"] == "134"
示例#5
0
def test_get_headers_coerces_content_type():
    result = dict(get_headers({"CONTENT_TYPE": "text/plain"}))
    assert "content-type" in result
    assert result["content-type"] == "text/plain"
示例#6
0
def test_get_headers_coerces_http_name():
    result = dict(get_headers({"HTTP_ACCEPT": "text/plain"}))
    assert "accept" in result
    assert result["accept"] == "text/plain"
示例#7
0
def test_get_headers_tuple_as_key():
    result = dict(get_headers({("a", "tuple"): "foo"}))
    assert result == {}