5
5
6
6
import copy
7
7
import datetime
8
+ import json
8
9
import logging
9
10
from pathlib import Path
10
- from typing import List , Optional
11
+ from typing import Any , Dict , List , Optional , Union
11
12
12
13
import dateutil
13
14
import dateutil .tz
14
15
import requests
16
+ from requests .structures import CaseInsensitiveDict
15
17
16
18
from annofabapi .models import TaskHistory , TaskPhase
17
19
@@ -36,7 +38,7 @@ def raise_for_status(response: requests.Response):
36
38
raise e
37
39
38
40
39
- def log_error_response (arg_logger : logging .Logger , response : requests .Response ):
41
+ def log_error_response (arg_logger : logging .Logger , response : requests .Response ) -> None :
40
42
"""
41
43
HTTP Statusが400以上ならば、loggerにresponse/request情報を出力する
42
44
@@ -45,17 +47,36 @@ def log_error_response(arg_logger: logging.Logger, response: requests.Response):
45
47
response: Response
46
48
47
49
"""
50
+ RequestBodyHeader = Union [Dict [str , Any ], CaseInsensitiveDict ]
51
+
52
+ def mask_key (d : RequestBodyHeader , key : str ) -> RequestBodyHeader :
53
+ if key in d :
54
+ d [key ] = "***"
55
+ return d
56
+
57
+ def mask_password (d : RequestBodyHeader ) -> RequestBodyHeader :
58
+ d = mask_key (d , "password" )
59
+ d = mask_key (d , "old_password" )
60
+ d = mask_key (d , "new_password" )
61
+ return d
48
62
49
63
if 400 <= response .status_code < 600 :
50
64
headers = copy .deepcopy (response .request .headers )
51
- if "Authorization" in headers :
52
- # logにAuthorizationを出力しないようにマスクする
53
- headers ["Authorization" ] = "***"
54
65
55
66
arg_logger .debug (f"status_code = %s, response.text = %s" , response .status_code , response .text )
56
67
arg_logger .debug (f"request.url = %s %s" , response .request .method , response .request .url )
68
+
69
+ # logにAuthorizationを出力しないようにマスクする
70
+ mask_key (headers , "Authorization" )
57
71
arg_logger .debug ("request.headers = %s" , headers )
58
- arg_logger .debug ("request.body = %s" , response .request .body )
72
+
73
+ # request_bodyのpassword関係をマスクして、logに出力する
74
+ if response .request .body is None or response .request .body == "" :
75
+ dict_request_body = {}
76
+ else :
77
+ dict_request_body = json .loads (response .request .body )
78
+
79
+ arg_logger .debug ("request.body = %s" , mask_password (dict_request_body ))
59
80
60
81
61
82
def download (url : str , dest_path : str ):
0 commit comments