123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135 |
- # Licensed to the Apache Software Foundation (ASF) under one
- # or more contributor license agreements. See the NOTICE file
- # distributed with this work for additional information
- # regarding copyright ownership. The ASF licenses this file
- # to you under the Apache License, Version 2.0 (the
- # "License"); you may not use this file except in compliance
- # with the License. You may obtain a copy of the License at
- #
- # http://www.apache.org/licenses/LICENSE-2.0
- #
- # Unless required by applicable law or agreed to in writing,
- # software distributed under the License is distributed on an
- # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- # KIND, either express or implied. See the License for the
- # specific language governing permissions and limitations
- # under the License.
- # coding=utf-8
- import os
- import logging
- from aliyunsdkcore.vendored.requests import Request, Session
- from aliyunsdkcore.vendored.requests.packages import urllib3
- from aliyunsdkcore.http.http_request import HttpRequest
- from aliyunsdkcore.http import protocol_type as PT
- from aliyunsdkcore.vendored.requests import status_codes
- logger = logging.getLogger(__name__)
- logger.setLevel(logging.DEBUG)
- ch = logging.StreamHandler()
- logger.addHandler(ch)
- DEFAULT_CONNECT_TIMEOUT = 5
- class HttpResponse(HttpRequest):
- def __init__(
- self,
- host="",
- url="/",
- method="GET",
- headers={},
- protocol=PT.HTTP,
- content=None,
- port=None,
- key_file=None,
- cert_file=None,
- read_timeout=None,
- connect_timeout=None,
- verify=None):
- HttpRequest.__init__(
- self,
- host=host,
- url=url,
- method=method,
- headers=headers)
- self.__ssl_enable = False
- if protocol is PT.HTTPS:
- self.__ssl_enable = True
- self.__key_file = key_file
- self.__cert_file = cert_file
- self.__port = port
- self.__connection = None
- self.__read_timeout = read_timeout
- self.__connect_timeout = connect_timeout
- self.__verify = verify
- self.set_body(content)
- def set_ssl_enable(self, enable):
- self.__ssl_enable = enable
- def get_ssl_enabled(self):
- return self.__ssl_enable
- @staticmethod
- def prepare_http_debug(request, symbol):
- base = ''
- for key, value in request.headers.items():
- base += '\n%s %s : %s' % (symbol, key, value)
- return base
- def do_http_debug(self, request, response):
- # logger the request
- request_base = '\n> %s %s HTTP/1.1' % (self.get_method().upper(), self.get_url())
- request_base += '\n> Host : %s' % self.get_host()
- logger.debug(request_base + self.prepare_http_debug(request, '>'))
- # logger the response
- response_base = '\n< HTTP/1.1 %s %s' % (
- response.status_code, status_codes._codes.get(response.status_code)[0].upper())
- logger.debug(response_base + self.prepare_http_debug(response, '<'))
- def get_verify_value(self):
- if self.__verify is not None:
- return self.__verify
- return os.environ.get('ALIBABA_CLOUD_CA_BUNDLE', True)
- def get_response_object(self):
- with Session() as s:
- current_protocol = 'https://' if self.get_ssl_enabled() else 'http://'
- url = current_protocol + self.get_host() + self.get_url()
- if self.__port != 80:
- url = current_protocol + self.get_host() + ":" + str(self.__port) + self.get_url()
- req = Request(method=self.get_method(), url=url,
- data=self.get_body(),
- headers=self.get_headers(),
- )
- prepped = s.prepare_request(req)
- proxy_https = os.environ.get('HTTPS_PROXY') or os.environ.get(
- 'https_proxy')
- proxy_http = os.environ.get(
- 'HTTP_PROXY') or os.environ.get('http_proxy')
- proxies = {
- "http": proxy_http,
- "https": proxy_https,
- }
- response = s.send(prepped, proxies=proxies,
- timeout=(self.__connect_timeout, self.__read_timeout),
- allow_redirects=False, verify=self.get_verify_value(), cert=None)
- http_debug = os.environ.get('DEBUG')
- if http_debug is not None and http_debug.lower() == 'sdk':
- # http debug information
- self.do_http_debug(prepped, response)
- return response.status_code, response.headers, response.content
|