60f0a49a3d29682ee1e4b1568ffe0c0ed5fd3749
[osm/osmclient.git] / osmclient / sol005 / http.py
1 # Copyright 2018 Telefonica
2 #
3 # All Rights Reserved.
4 #
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
8 #
9 # http://www.apache.org/licenses/LICENSE-2.0
10 #
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
15 # under the License.
16
17 from io import BytesIO
18 import pycurl
19 import json
20 import yaml
21 from osmclient.common import http
22 from osmclient.common.exceptions import ClientException
23
24 class Http(http.Http):
25
26 def __init__(self, url, user='admin', password='admin'):
27 self._url = url
28 self._user = user
29 self._password = password
30 self._http_header = None
31
32 def _get_curl_cmd(self, endpoint):
33 curl_cmd = pycurl.Curl()
34 #print self._url + endpoint
35 curl_cmd.setopt(pycurl.URL, self._url + endpoint)
36 curl_cmd.setopt(pycurl.SSL_VERIFYPEER, 0)
37 curl_cmd.setopt(pycurl.SSL_VERIFYHOST, 0)
38 if self._http_header:
39 curl_cmd.setopt(pycurl.HTTPHEADER, self._http_header)
40 return curl_cmd
41
42 def delete_cmd(self, endpoint):
43 data = BytesIO()
44 curl_cmd = self._get_curl_cmd(endpoint)
45 curl_cmd.setopt(pycurl.CUSTOMREQUEST, "DELETE")
46 curl_cmd.setopt(pycurl.WRITEFUNCTION, data.write)
47 curl_cmd.perform()
48 http_code = curl_cmd.getinfo(pycurl.HTTP_CODE)
49 #print 'HTTP_CODE: {}'.format(http_code)
50 curl_cmd.close()
51 # TODO 202 accepted should be returned somehow
52 if data.getvalue():
53 return http_code, json.loads(data.getvalue().decode())
54 else:
55 return http_code, None
56
57 def send_cmd(self, endpoint='', postfields_dict=None,
58 formfile=None, filename=None,
59 put_method=False, patch_method=False):
60 data = BytesIO()
61 curl_cmd = self._get_curl_cmd(endpoint)
62 if put_method:
63 curl_cmd.setopt(pycurl.PUT, 1)
64 elif patch_method:
65 curl_cmd.setopt(pycurl.CUSTOMREQUEST, "PATCH")
66 else:
67 curl_cmd.setopt(pycurl.POST, 1)
68 curl_cmd.setopt(pycurl.WRITEFUNCTION, data.write)
69
70 if postfields_dict is not None:
71 jsondata = json.dumps(postfields_dict)
72 curl_cmd.setopt(pycurl.POSTFIELDS, jsondata)
73 elif formfile is not None:
74 curl_cmd.setopt(
75 pycurl.HTTPPOST,
76 [((formfile[0],
77 (pycurl.FORM_FILE,
78 formfile[1])))])
79 elif filename is not None:
80 with open(filename, 'r') as stream:
81 postdata=stream.read()
82 curl_cmd.setopt(pycurl.POSTFIELDS, postdata)
83
84 curl_cmd.perform()
85 http_code = curl_cmd.getinfo(pycurl.HTTP_CODE)
86 curl_cmd.close()
87 if http_code not in (200, 201, 202, 204):
88 raise ClientException(data.getvalue().decode())
89 if postfields_dict is not None:
90 if data.getvalue():
91 return json.loads(data.getvalue().decode())
92 return None
93 elif formfile is not None:
94 if data.getvalue():
95 return yaml.safe_load(data.getvalue().decode())
96 return None
97 elif filename is not None:
98 if data.getvalue():
99 return yaml.safe_load(data.getvalue().decode())
100 return None
101 return None
102
103 def post_cmd(self, endpoint='', postfields_dict=None,
104 formfile=None, filename=None):
105 return self.send_cmd(endpoint=endpoint,
106 postfields_dict=postfields_dict,
107 formfile=formfile,
108 filename=filename,
109 put_method=False, patch_method=False)
110
111 def put_cmd(self, endpoint='', postfields_dict=None,
112 formfile=None, filename=None):
113 return self.send_cmd(endpoint=endpoint,
114 postfields_dict=postfields_dict,
115 formfile=formfile,
116 filename=filename,
117 put_method=True, patch_method=False)
118
119 def patch_cmd(self, endpoint='', postfields_dict=None,
120 formfile=None, filename=None):
121 return self.send_cmd(endpoint=endpoint,
122 postfields_dict=postfields_dict,
123 formfile=formfile,
124 filename=filename,
125 put_method=False, patch_method=True)
126
127 def get2_cmd(self, endpoint):
128 data = BytesIO()
129 curl_cmd = self._get_curl_cmd(endpoint)
130 curl_cmd.setopt(pycurl.HTTPGET, 1)
131 curl_cmd.setopt(pycurl.WRITEFUNCTION, data.write)
132 curl_cmd.perform()
133 http_code = curl_cmd.getinfo(pycurl.HTTP_CODE)
134 curl_cmd.close()
135 if data.getvalue():
136 return http_code, data.getvalue()
137 return http_code, None
138