Skip to content

Commit 0b7b167

Browse files
authored
Merge pull request #2 from chilispa/fix-header-case
Fix header case
2 parents 53d2570 + d86f924 commit 0b7b167

File tree

3 files changed

+70
-16
lines changed

3 files changed

+70
-16
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
*.pyc
44
*.swp
55
*.swo
6+
.idea
67

78
# ignore robotframework files
89
log.html

src/RequestsLibrary/RequestsKeywords.py

Lines changed: 27 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import requests
66
from requests.sessions import merge_setting
77
from requests.cookies import merge_cookies
8+
from requests.structures import CaseInsensitiveDict
89
import logging
910
from requests.packages.urllib3.util import Retry
1011
import robot
@@ -96,7 +97,7 @@ def _create_session(
9697
``disable_warnings`` Disable requests warning useful when you have large number of testcases
9798
"""
9899

99-
self.builtin.log('Creating session: %s' % alias, 'DEBUG')
100+
logger.debug('Creating session: %s' % alias)
100101
s = session = requests.Session()
101102
s.headers.update(headers)
102103
s.auth = auth if auth else s.auth
@@ -595,9 +596,9 @@ def post_request(
595596
headers=headers,
596597
allow_redirects=redir,
597598
timeout=timeout)
598-
dataStr = self._format_data_to_log_string_according_to_header(data, headers)
599+
data_str = self._format_data_to_log_string_according_to_header(session, data, headers)
599600
logger.info('Post Request using : alias=%s, uri=%s, data=%s, headers=%s, files=%s, allow_redirects=%s '
600-
% (alias, uri, dataStr, headers, files, redir))
601+
% (alias, uri, data_str, headers, files, redir))
601602

602603
return response
603604

@@ -764,7 +765,6 @@ def delete_request(
764765

765766
return response
766767

767-
768768
def head_request(
769769
self,
770770
alias,
@@ -851,7 +851,8 @@ def _common_request(
851851
self._print_debug()
852852
session.last_resp = resp
853853

854-
self.builtin.log(method+ ' response: ' + resp.text, 'DEBUG')
854+
# TODO centralize also requests log
855+
logger.debug('%s response: %s' % (method, resp.text))
855856

856857
return resp
857858

@@ -894,7 +895,7 @@ def _print_debug(self):
894895
# Remove empty lines
895896
debug_info = "\n".join(
896897
[ll.rstrip() for ll in debug_info.splitlines() if ll.strip()])
897-
self.builtin.log(debug_info, 'DEBUG')
898+
logger.debug(debug_info)
898899

899900
def _json_pretty_print(self, content):
900901
"""
@@ -912,7 +913,6 @@ def _json_pretty_print(self, content):
912913
': '))
913914

914915
def _utf8_urlencode(self, data):
915-
916916
if self._is_string_type(data):
917917
return data.encode('utf-8')
918918

@@ -927,6 +927,7 @@ def _utf8_urlencode(self, data):
927927
return urlencode(utf8_data)
928928

929929
def _format_data_according_to_header(self, session, data, headers):
930+
# Merged headers are already case insensitive
930931
headers = self._merge_headers(session, headers)
931932

932933
if data is not None and headers is not None and 'Content-Type' in headers and not self._is_json(data):
@@ -940,30 +941,40 @@ def _format_data_according_to_header(self, session, data, headers):
940941

941942
return data
942943

943-
def _format_data_to_log_string_according_to_header(self, data, headers):
944-
dataStr = "<empty>"
944+
def _format_data_to_log_string_according_to_header(self, session, data, headers):
945+
data_str = "<empty>"
946+
# Merged headers are already case insensitive
947+
headers = self._merge_headers(session, headers)
948+
945949
if data is not None and headers is not None and 'Content-Type' in headers:
946950
if (headers['Content-Type'].find("application/json") != -1) or \
947951
(headers['Content-Type'].find("application/x-www-form-urlencoded") != -1):
948952
if isinstance(data, bytes):
949-
dataStr = data.decode('utf-8')
953+
data_str = data.decode('utf-8')
950954
else:
951-
dataStr = data
955+
data_str = data
952956
else:
953-
dataStr = "<" + headers['Content-Type'] + ">"
957+
data_str = "<" + headers['Content-Type'] + ">"
954958

955-
return dataStr
959+
return data_str
956960

957961
@staticmethod
958962
def _merge_headers(session, headers):
959963
if headers is None:
960964
headers = {}
965+
if session.headers is None:
966+
merged_headers = {}
961967
else:
962-
headers = headers.copy()
968+
# Session headers are the default but local headers
969+
# have priority and can override values
970+
merged_headers = session.headers.copy()
963971

964-
headers.update(session.headers)
972+
# Make sure merged_headers are CaseIsensitiveDict
973+
if not isinstance(merged_headers, CaseInsensitiveDict):
974+
merged_headers = CaseInsensitiveDict(merged_headers)
965975

966-
return headers
976+
merged_headers.update(headers)
977+
return merged_headers
967978

968979
@staticmethod
969980
def _is_json(data):

tests/test_headers.robot

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
*** Settings ***
2+
Library String
3+
Library Collections
4+
Library ../src/RequestsLibrary/RequestsKeywords.py
5+
6+
Suite Teardown Delete All Sessions
7+
8+
*** Test Cases ***
9+
Get Request With Session Headers
10+
[Tags] get headers
11+
${sess_headers}= Create Dictionary session-header=true
12+
Create Session httpbin http://httpbin.org ${sess_headers}
13+
${resp}= Get Request httpbin /headers
14+
Dictionary Should Contain Item ${resp.json()['headers']} Session-Header true
15+
16+
Get Request Overriding Session Headers
17+
[Tags] get headers
18+
${sess_headers}= Create Dictionary session-header=true
19+
${get_headers}= Create Dictionary session-header=false
20+
Create Session httpbin http://httpbin.org ${sess_headers}
21+
${resp}= Get Request httpbin /headers ${get_headers}
22+
Dictionary Should Contain Item ${resp.json()['headers']} Session-Header false
23+
24+
Get Request Headers Are Local
25+
[Tags] get headers
26+
${sess_headers}= Create Dictionary session-header=true
27+
${get_headers}= Create Dictionary session-header=false
28+
Create Session httpbin http://httpbin.org ${sess_headers}
29+
${resp1}= Get Request httpbin /headers ${get_headers}
30+
Dictionary Should Contain Item ${resp1.json()['headers']} Session-Header false
31+
${resp2}= Get Request httpbin /headers
32+
Dictionary Should Contain Item ${resp2.json()['headers']} Session-Header true
33+
34+
Post Request Formatting Json According To Header And Case Insensitive For Keys
35+
[Tags] post headers
36+
${sess_headers}= Create Dictionary content-type=false
37+
${post_headers}= Create Dictionary Content-Type=application/json
38+
${data}= Create Dictionary key=value
39+
Create Session httpbin http://httpbin.org ${sess_headers}
40+
${resp}= Post Request httpbin /anything data=${data} headers=${post_headers}
41+
Dictionary Should Contain Item ${resp.json()['headers']} Content-Type application/json
42+
Dictionary Should Contain Item ${resp.json()['json']} key value

0 commit comments

Comments
 (0)