11import json
22import copy
3- import types
43import sys
54
65import requests
76from requests .models import Response
87from requests .sessions import merge_setting
98from requests .cookies import merge_cookies
10- from requests .structures import CaseInsensitiveDict
119from requests .packages .urllib3 .util import Retry
1210import logging
1311
1614from robot .libraries .BuiltIn import BuiltIn
1715from robot .utils .asserts import assert_equal
1816
19- from RequestsLibrary import utils
20- from RequestsLibrary .compat import httplib , urlencode , PY3
17+ from RequestsLibrary import utils , log
18+ from RequestsLibrary .compat import httplib , PY3
19+ from RequestsLibrary .exceptions import InvalidResponse
20+
2121
2222try :
2323 from requests_ntlm import HttpNtlmAuth
@@ -574,7 +574,7 @@ def to_json(self, content, pretty_print=False):
574574 if isinstance (content , bytes ):
575575 content = content .decode (encoding = 'utf-8' )
576576 if pretty_print :
577- json_ = self . _json_pretty_print (content )
577+ json_ = utils . json_pretty_print (content )
578578 else :
579579 json_ = json .loads (content )
580580 logger .info ('To JSON using : content=%s ' % (content ))
@@ -669,7 +669,7 @@ def post_request(
669669 """
670670 session = self ._cache .switch (alias )
671671 if not files :
672- data = self . _format_data_according_to_header (session , data , headers )
672+ data = utils . format_data_according_to_header (session , data , headers )
673673 redir = True if allow_redirects is None else allow_redirects
674674
675675 response = self ._common_request (
@@ -721,7 +721,7 @@ def patch_request(
721721 ``timeout`` connection timeout
722722 """
723723 session = self ._cache .switch (alias )
724- data = self . _format_data_according_to_header (session , data , headers )
724+ data = utils . format_data_according_to_header (session , data , headers )
725725 redir = True if allow_redirects is None else allow_redirects
726726
727727 response = self ._common_request (
@@ -772,7 +772,7 @@ def put_request(
772772 ``timeout`` connection timeout
773773 """
774774 session = self ._cache .switch (alias )
775- data = self . _format_data_according_to_header (session , data , headers )
775+ data = utils . format_data_according_to_header (session , data , headers )
776776 redir = True if allow_redirects is None else allow_redirects
777777
778778 response = self ._common_request (
@@ -816,7 +816,7 @@ def delete_request(
816816 ``timeout`` connection timeout
817817 """
818818 session = self ._cache .switch (alias )
819- data = self . _format_data_according_to_header (session , data , headers )
819+ data = utils . format_data_according_to_header (session , data , headers )
820820 redir = True if allow_redirects is None else allow_redirects
821821
822822 response = self ._common_request (
@@ -920,29 +920,28 @@ def request_should_be_successful(self, response):
920920 """
921921 self ._check_status (None , response , msg = None )
922922
923-
924923 def _common_request (
925924 self ,
926925 method ,
927926 session ,
928927 uri ,
929928 ** kwargs ):
930929
931- self . _log_request (method , session , uri , ** kwargs )
930+ log . log_request (method , session , uri , ** kwargs )
932931 method_function = getattr (session , method )
933932
934933 self ._capture_output ()
935934 resp = method_function (
936935 self ._get_url (session , uri ),
937- params = self . _utf8_urlencode (kwargs .pop ('params' , None )),
936+ params = utils . utf8_urlencode (kwargs .pop ('params' , None )),
938937 timeout = self ._get_timeout (kwargs .pop ('timeout' , None )),
939938 cookies = self .cookies ,
940939 verify = self .verify ,
941940 ** kwargs )
942941 self ._print_debug ()
943942
944943 session .last_resp = resp
945- self . _log_response (method , resp )
944+ log . log_response (method , resp )
946945
947946 return resp
948947
@@ -952,7 +951,7 @@ def _check_status(expected_status, resp, msg=None):
952951 Helper method to check HTTP status
953952 """
954953 if not isinstance (resp , Response ):
955- raise utils . InvalidResponse (resp )
954+ raise InvalidResponse (resp )
956955 if expected_status is None :
957956 resp .raise_for_status ()
958957 else :
@@ -965,7 +964,8 @@ def _check_status(expected_status, resp, msg=None):
965964 msg = "{}Url: {} Expected status" .format (msg , resp .url )
966965 assert_equal (resp .status_code , expected_status , msg )
967966
968- def _get_url (self , session , uri ):
967+ @staticmethod
968+ def _get_url (session , uri ):
969969 """
970970 Helper method to get the full url
971971 """
@@ -1005,139 +1005,3 @@ def _print_debug(self):
10051005 debug_info = "\n " .join (
10061006 [ll .rstrip () for ll in debug_info .splitlines () if ll .strip ()])
10071007 logger .debug (debug_info )
1008-
1009- def _json_pretty_print (self , content ):
1010- """
1011- Pretty print a JSON object
1012-
1013- ``content`` JSON object to pretty print
1014- """
1015- temp = json .loads (content )
1016- return json .dumps (
1017- temp ,
1018- sort_keys = True ,
1019- indent = 4 ,
1020- separators = (
1021- ',' ,
1022- ': ' ))
1023-
1024- def _utf8_urlencode (self , data ):
1025- if self ._is_string_type (data ):
1026- return data .encode ('utf-8' )
1027-
1028- if not isinstance (data , dict ):
1029- return data
1030-
1031- utf8_data = {}
1032- for k , v in data .items ():
1033- if self ._is_string_type (v ):
1034- v = v .encode ('utf-8' )
1035- utf8_data [k ] = v
1036- return urlencode (utf8_data )
1037-
1038- def _format_data_according_to_header (self , session , data , headers ):
1039- # Merged headers are already case insensitive
1040- headers = self ._merge_headers (session , headers )
1041-
1042- if data is not None and headers is not None and 'Content-Type' in headers and not self ._is_json (data ):
1043- if headers ['Content-Type' ].find ("application/json" ) != - 1 :
1044- if not isinstance (data , types .GeneratorType ):
1045- if str (data ).strip ():
1046- data = json .dumps (data )
1047- elif headers ['Content-Type' ].find ("application/x-www-form-urlencoded" ) != - 1 :
1048- data = self ._utf8_urlencode (data )
1049- else :
1050- data = self ._utf8_urlencode (data )
1051-
1052- return data
1053-
1054- def _format_data_to_log_string_according_to_headers (self , session , data , headers ):
1055- data_str = None
1056- # Merged headers are already case insensitive
1057- headers = self ._merge_headers (session , headers )
1058-
1059- if data is not None and headers is not None and 'Content-Type' in headers :
1060- if (headers ['Content-Type' ].find ("application/json" ) != - 1 ) or \
1061- (headers ['Content-Type' ].find ("application/x-www-form-urlencoded" ) != - 1 ):
1062- if isinstance (data , bytes ):
1063- data_str = data .decode ('utf-8' )
1064- else :
1065- data_str = data
1066- else :
1067- data_str = "<" + headers ['Content-Type' ] + ">"
1068-
1069- return data_str
1070-
1071- def _log_request (
1072- self ,
1073- method ,
1074- session ,
1075- uri ,
1076- ** kwargs ):
1077-
1078- # TODO would be nice to add also the alias
1079- # TODO would be nice to pretty format the headers / json / data
1080- # TODO move in common the data formatting to have this as @staticmethod
1081- # TODO big requests should be truncated to avoid huge logs
1082-
1083- # kwargs might include: method, session, uri, params, files, headers,
1084- # data, json, allow_redirects, timeout
1085- args = kwargs .copy ()
1086- args .pop ('session' , None )
1087- # This will log specific headers merged with session defined headers
1088- merged_headers = self ._merge_headers (session , args .pop ('headers' , None ))
1089- formatted_data = self ._format_data_to_log_string_according_to_headers (session ,
1090- args .pop ('data' , None ),
1091- merged_headers )
1092- formatted_json = args .pop ('json' , None )
1093- method_log = '%s Request using : ' % method .upper ()
1094- uri_log = 'uri=%s' % uri
1095- composed_log = method_log + uri_log
1096- for arg in args :
1097- composed_log += ', %s=%s' % (arg , kwargs .get (arg , None ))
1098- logger .info (composed_log + '\n ' +
1099- 'headers=%s \n ' % merged_headers +
1100- 'data=%s \n ' % formatted_data +
1101- 'json=%s' % formatted_json )
1102-
1103- @staticmethod
1104- def _log_response (method , response ):
1105- # TODO big responses should be truncated to avoid huge logs
1106- logger .debug ('%s Response : status=%s, reason=%s\n ' % (method .upper (),
1107- response .status_code ,
1108- response .reason ) +
1109- response .text )
1110-
1111- @staticmethod
1112- def _merge_headers (session , headers ):
1113- if headers is None :
1114- headers = {}
1115- if session .headers is None :
1116- merged_headers = {}
1117- else :
1118- # Session headers are the default but local headers
1119- # have priority and can override values
1120- merged_headers = session .headers .copy ()
1121-
1122- # Make sure merged_headers are CaseIsensitiveDict
1123- if not isinstance (merged_headers , CaseInsensitiveDict ):
1124- merged_headers = CaseInsensitiveDict (merged_headers )
1125-
1126- merged_headers .update (headers )
1127- return merged_headers
1128-
1129- @staticmethod
1130- def _is_json (data ):
1131- try :
1132- json .loads (data )
1133- except (TypeError , ValueError ):
1134- return False
1135- return True
1136-
1137- @staticmethod
1138- def _is_string_type (data ):
1139- if PY3 and isinstance (data , str ):
1140- return True
1141- elif not PY3 and isinstance (data , unicode ):
1142- return True
1143- return False
0 commit comments