@@ -94,27 +94,10 @@ def get_user_info(self, request):
9494
9595 return user_info
9696
97- def get_data_from_request (self , request ):
98- if request .method != 'GET' :
99- try :
100- if hasattr (request , 'body' ):
101- # Django 1.4+
102- raw_data = request .body
103- else :
104- raw_data = request .raw_post_data
105- data = raw_data if raw_data else request .POST
106- except Exception :
107- # assume we had a partial read:
108- data = '<unavailable>'
109- else :
110- data = None
111-
112- environ = request .META
113-
97+ def get_data_from_request (self , request , capture_body = False ):
11498 result = {
115- 'body' : data ,
116- 'env' : dict (get_environ (environ )),
117- 'headers' : dict (get_headers (environ )),
99+ 'env' : dict (get_environ (request .META )),
100+ 'headers' : dict (get_headers (request .META )),
118101 'method' : request .method ,
119102 'socket' : {
120103 'remote_address' : request .META .get ('REMOTE_ADDR' ),
@@ -123,6 +106,22 @@ def get_data_from_request(self, request):
123106 'cookies' : dict (request .COOKIES ),
124107 }
125108
109+ if request .method not in ('GET' , 'HEAD' ):
110+ content_type = request .META .get ('CONTENT_TYPE' )
111+ if content_type == 'application/x-www-form-urlencoded' :
112+ data = compat .multidict_to_dict (request .POST )
113+ elif content_type .startswith ('multipart/form-data' ):
114+ data = compat .multidict_to_dict (request .POST )
115+ if request .FILES :
116+ data ['_files' ] = {field : file .name for field , file in compat .iteritems (request .FILES )}
117+ else :
118+ try :
119+ data = request .body
120+ except Exception :
121+ data = '<unavailable>'
122+
123+ result ['body' ] = data if (capture_body or not data ) else '[REDACTED]'
124+
126125 if hasattr (request , 'get_raw_uri' ):
127126 # added in Django 1.9
128127 url = request .get_raw_uri ()
@@ -158,7 +157,8 @@ def capture(self, event_type, request=None, **kwargs):
158157
159158 is_http_request = isinstance (request , HttpRequest )
160159 if is_http_request :
161- context ['request' ] = self .get_data_from_request (request )
160+ context ['request' ] = self .get_data_from_request (request ,
161+ capture_body = self .config .capture_body in ('all' , 'errors' ))
162162 context ['user' ] = self .get_user_info (request )
163163
164164 result = super (DjangoClient , self ).capture (event_type , ** kwargs )
0 commit comments