Skip to content

Commit 92985d0

Browse files
authored
Merge branch 'MarketSquare:master' into get_response
2 parents 629bc19 + 1e34855 commit 92985d0

File tree

8 files changed

+121
-107
lines changed

8 files changed

+121
-107
lines changed

.github/release-drafter.yml

Lines changed: 0 additions & 22 deletions
This file was deleted.

.github/workflows/pythonpublish.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,11 @@ jobs:
88
deploy:
99
runs-on: ubuntu-latest
1010
steps:
11-
- uses: actions/checkout@v2
11+
- uses: actions/checkout@v4
1212
- name: Set up Python
13-
uses: actions/setup-python@v1
13+
uses: actions/setup-python@v5
1414
with:
15-
python-version: '3.x'
15+
python-version: '3.8'
1616
- name: Install dependencies
1717
run: |
1818
python -m pip install --upgrade pip

.github/workflows/release-drafter.yml

Lines changed: 0 additions & 14 deletions
This file was deleted.

doc/RequestsLibrary.html

Lines changed: 38 additions & 66 deletions
Large diffs are not rendered by default.

src/RequestsLibrary/__init__.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,14 @@ class RequestsLibrary(RequestsOnSessionKeywords):
116116
- https://2.python-requests.org/en/master/user/quickstart/#post-a-multipart-encoded-file
117117
- https://2.python-requests.org/en/master/user/advanced/#post-multiple-multipart-encoded-files
118118
119+
= Logging and authentication =
120+
121+
All request data are logged by default headers included, which means that, sensitive information like passwords
122+
or tokens may be present in the Robot Framework output files.
123+
For this reason, the ``Authorization`` header is masked in standard logs to protect sensitive data.
124+
125+
The full value of ``Authorization`` will only be visible if the logging level is set to ``TRACE`` or ``DEBUG``.
126+
119127
"""
120128

121129
__version__ = VERSION

src/RequestsLibrary/log.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from RequestsLibrary.utils import is_file_descriptor
66

77
LOG_CHAR_LIMIT = 10000
8+
AUTHORIZATION = 'Authorization'
89

910

1011
def log_response(response):
@@ -24,11 +25,14 @@ def log_request(response):
2425
else:
2526
original_request = request
2627
redirected = ""
28+
safe_headers = dict(original_request.headers)
29+
if logger.LOGLEVEL not in ['TRACE', 'DEBUG'] and AUTHORIZATION in safe_headers:
30+
safe_headers[AUTHORIZATION] = '*****'
2731
logger.info(
2832
"%s Request : " % original_request.method.upper()
2933
+ "url=%s %s\n " % (original_request.url, redirected)
3034
+ "path_url=%s \n " % original_request.path_url
31-
+ "headers=%s \n " % original_request.headers
35+
+ "headers=%s \n " % safe_headers
3236
+ "body=%s \n " % format_data_to_log_string(original_request.body)
3337
)
3438

src/RequestsLibrary/version.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
VERSION = "1.0a11"
1+
VERSION = "1.0a12"

utests/test_log.py

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import json
22
import os
3+
import pytest
34

45
from requests import Request
56

@@ -60,6 +61,71 @@ def test_log_request(mocked_logger):
6061
"body=%s \n " % request.body)
6162

6263

64+
@mock.patch('RequestsLibrary.log.logger')
65+
def test_log_request_with_headers(mocked_logger):
66+
headers = {'User-Agent': 'python-requests/2.31.0',
67+
'Accept-Encoding': 'gzip, deflate',
68+
'Accept': '*/*',
69+
'Connection': 'keep-alive'}
70+
request = Request(method='get', url='http://mock.rulezz', headers=headers)
71+
request = request.prepare()
72+
response = mock.MagicMock()
73+
response.history = []
74+
response.request = request
75+
log_request(response)
76+
assert mocked_logger.info.call_args[0][0] == ("%s Request : " % request.method +
77+
"url=%s \n " % request.url +
78+
"path_url=%s \n " % request.path_url +
79+
"headers=%s \n " % request.headers +
80+
"body=%s \n " % request.body)
81+
82+
83+
@pytest.mark.parametrize('log_level', ['INFO', 'CONSOLE', 'HTML', 'WARN', 'ERROR'])
84+
@mock.patch('RequestsLibrary.log.logger')
85+
def test_log_request_with_headers_auth_with_no_debug_trace_logger(mocked_logger, log_level):
86+
mocked_logger.LOGLEVEL = log_level
87+
headers = {'User-Agent': 'python-requests/2.31.0',
88+
'Accept-Encoding': 'gzip, deflate',
89+
'Accept': '*/*',
90+
'Connection': 'keep-alive',
91+
'Authorization': 'some_token'}
92+
safe_headers = dict(headers)
93+
safe_headers['Authorization'] = '*****'
94+
request = Request(method='get', url='http://mock.rulezz', headers=headers)
95+
request = request.prepare()
96+
response = mock.MagicMock()
97+
response.history = []
98+
response.request = request
99+
log_request(response)
100+
assert mocked_logger.info.call_args[0][0] == ("%s Request : " % request.method +
101+
"url=%s \n " % request.url +
102+
"path_url=%s \n " % request.path_url +
103+
"headers=%s \n " % safe_headers +
104+
"body=%s \n " % request.body)
105+
106+
107+
@pytest.mark.parametrize('log_level', ['DEBUG', 'TRACE'])
108+
@mock.patch('RequestsLibrary.log.logger')
109+
def test_log_request_with_headers_auth_with_debug_trace_logger(mocked_logger, log_level):
110+
headers = {'User-Agent': 'python-requests/2.31.0',
111+
'Accept-Encoding': 'gzip, deflate',
112+
'Accept': '*/*',
113+
'Connection': 'keep-alive',
114+
'Authorization': 'some_token'}
115+
mocked_logger.LOGLEVEL = log_level
116+
request = Request(method='get', url='http://mock.rulezz', headers=headers)
117+
request = request.prepare()
118+
response = mock.MagicMock()
119+
response.history = []
120+
response.request = request
121+
log_request(response)
122+
assert mocked_logger.info.call_args[0][0] == ("%s Request : " % request.method +
123+
"url=%s \n " % request.url +
124+
"path_url=%s \n " % request.path_url +
125+
"headers=%s \n " % request.headers +
126+
"body=%s \n " % request.body)
127+
128+
63129
@mock.patch('RequestsLibrary.log.logger')
64130
def test_log_request_with_redirect(mocked_logger):
65131
request = Request(method='get', url='http://mock.rulezz/redirected')

0 commit comments

Comments
 (0)