5 # Licensed under the Apache License, Version 2.0 (the "License"); you may
6 # not use this file except in compliance with the License. You may obtain
7 # a copy of the License at
9 # http://www.apache.org/licenses/LICENSE-2.0
11 # Unless required by applicable law or agreed to in writing, software
12 # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
13 # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
14 # License for the specific language governing permissions and limitations
17 from io
import BytesIO
22 class HttpException(Exception):
25 class NotFound(HttpException
):
30 def __init__(self
, logger
):
32 self
._response
_headers
= None
35 def _check_http_response(self
, http_code
, data
):
39 data_text
= data
.getvalue().decode()
40 self
._logger
.info("Response {} DATA: {}".format(http_code
, data_text
))
41 resp
= ": " + data_text
43 self
._logger
.info("Response {}".format(http_code
))
45 raise NotFound("Error {}{}".format(http_code
, resp
))
46 raise HttpException("Error {}{}".format(http_code
, resp
))
49 def _get_curl_cmd(self
, url
, headers
):
50 self
._logger
.debug("")
51 curl_cmd
= pycurl
.Curl()
52 curl_cmd
.setopt(pycurl
.URL
, url
)
53 curl_cmd
.setopt(pycurl
.SSL_VERIFYPEER
, 0)
54 curl_cmd
.setopt(pycurl
.SSL_VERIFYHOST
, 0)
56 curl_cmd
.setopt(pycurl
.HTTPHEADER
, headers
)
60 def get_cmd(self
, url
, headers
):
61 self
._logger
.debug("")
63 curl_cmd
= self
._get
_curl
_cmd
(url
, headers
)
64 curl_cmd
.setopt(pycurl
.HTTPGET
, 1)
65 curl_cmd
.setopt(pycurl
.WRITEFUNCTION
, data
.write
)
66 self
._logger
.info("Request METHOD: {} URL: {}".format("GET", url
))
68 http_code
= curl_cmd
.getinfo(pycurl
.HTTP_CODE
)
69 self
._logger
.info("Response HTTPCODE: {}".format(http_code
))
72 data_text
= data
.getvalue().decode()
73 self
._logger
.debug("Response DATA: {}".format(data_text
))
74 return http_code
, data_text
75 return http_code
, None
78 def delete_cmd(self
, url
, headers
):
79 self
._logger
.debug("")
81 curl_cmd
= self
._get
_curl
_cmd
(url
, headers
)
82 curl_cmd
.setopt(pycurl
.CUSTOMREQUEST
, "DELETE")
83 curl_cmd
.setopt(pycurl
.WRITEFUNCTION
, data
.write
)
84 self
._logger
.info("Request METHOD: {} URL: {}".format("DELETE", url
))
86 http_code
= curl_cmd
.getinfo(pycurl
.HTTP_CODE
)
87 self
._logger
.info("Response HTTPCODE: {}".format(http_code
))
89 self
._check
_http
_response
(http_code
, data
)
90 # TODO 202 accepted should be returned somehow
92 data_text
= data
.getvalue().decode()
93 self
._logger
.debug("Response DATA: {}".format(data_text
))
94 return http_code
, data_text
96 self
._logger
.debug("Response DATA: NONE")
97 return http_code
, None
100 def header_function(self
, header_line
):
101 header_line
= header_line
.decode('iso-8859-1')
102 if ':' not in header_line
:
104 name
, value
= header_line
.split(':', 1)
106 value
= value
.strip()
108 self
._response
_headers
[name
] = value
111 def post_cmd(self
, url
, headers
, postfields_dict
=None, return_header
=None):
112 self
._logger
.debug('url: {}, headers: {}, postfields_dict: {}, return_header: {}'.format(url
, headers
, postfields_dict
, return_header
))
114 curl_cmd
= self
._get
_curl
_cmd
(url
, headers
)
115 curl_cmd
.setopt(pycurl
.POST
, 1)
116 curl_cmd
.setopt(pycurl
.WRITEFUNCTION
, data
.write
)
118 self
._response
_headers
= {}
119 curl_cmd
.setopt(pycurl
.HEADERFUNCTION
, self
.header_function
)
121 jsondata
= json
.dumps(postfields_dict
)
122 if postfields_dict
.get('auth',{}).get('identity',{}).get('password',{}).get('user',{}).get('password'):
123 postfields_dict_copy
= copy
.deepcopy(postfields_dict
)
124 postfields_dict_copy
['auth']['identity']['password']['user']['password'] = '******'
125 jsondata_log
= json
.dumps(postfields_dict_copy
)
127 jsondata_log
= jsondata
128 self
._logger
.debug("Request POSTFIELDS: {}".format(jsondata_log
))
129 curl_cmd
.setopt(pycurl
.POSTFIELDS
, jsondata
)
131 self
._logger
.info("Request METHOD: {} URL: {}".format("POST", url
))
133 http_code
= curl_cmd
.getinfo(pycurl
.HTTP_CODE
)
134 self
._logger
.info("Response HTTPCODE: {}".format(http_code
))
137 data_text
= self
._response
_headers
.get(return_header
)
138 self
._logger
.debug("Response HEADER: {}".format(data_text
))
139 return http_code
, data_text
141 data_text
= data
.getvalue().decode()
142 self
._logger
.debug("Response DATA: {}".format(data_text
))
143 return http_code
, data_text
145 return http_code
, None