You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
80 lines
1.9 KiB
80 lines
1.9 KiB
#!/usr/bin/env python
|
|
# -*- coding: utf-8 -*-
|
|
# @Time : 2022/8/29 23:14
|
|
# @Author : old tom
|
|
# @File : http_response.py
|
|
# @Project : Futool
|
|
# @Desc : 响应解析
|
|
|
|
from http.client import HTTPResponse
|
|
from http.cookiejar import CookieJar
|
|
import json
|
|
|
|
DEFAULT_ENCODING = 'UTF-8'
|
|
|
|
# 响应类型编码
|
|
RESPONSE_CONTENT_ENCODING = "Content-Encoding"
|
|
|
|
# 压缩类型
|
|
COMPRESS_TYPE = ('gzip', 'deflate', 'br')
|
|
|
|
|
|
class ResponseWrapper(object):
|
|
|
|
def __init__(self, response: HTTPResponse, cookie: CookieJar = None):
|
|
self.resp = response
|
|
if cookie and len(cookie) > 0:
|
|
self.cookie = cookie
|
|
|
|
def body(self, encoding=DEFAULT_ENCODING):
|
|
return self.resp.read().decode(encoding)
|
|
|
|
def json_body(self, encoding=DEFAULT_ENCODING):
|
|
return json.loads(self.body(encoding))
|
|
|
|
def status(self):
|
|
return self.resp.status
|
|
|
|
def is_ok(self):
|
|
st_code = self.resp.status
|
|
return 200 <= st_code <= 300
|
|
|
|
def header(self, name=None):
|
|
return self.resp.getheader(name) if name else self._parse_header_dict()
|
|
|
|
def _parse_header_dict(self):
|
|
headers = self.resp.getheaders()
|
|
header_dict = {}
|
|
if headers:
|
|
for h in headers:
|
|
header_dict[h[0]] = h[1]
|
|
return header_dict
|
|
|
|
def is_compress(self):
|
|
"""
|
|
是否压缩
|
|
:return:
|
|
"""
|
|
return self.compress_type() in COMPRESS_TYPE
|
|
|
|
def compress_type(self):
|
|
"""
|
|
压缩格式
|
|
:return:
|
|
"""
|
|
header = self.header()
|
|
if RESPONSE_CONTENT_ENCODING in header.keys():
|
|
res_content_encoding = header[RESPONSE_CONTENT_ENCODING]
|
|
return res_content_encoding
|
|
|
|
def cookies(self):
|
|
"""
|
|
获取cookie
|
|
:return:
|
|
"""
|
|
ck = {}
|
|
if self.cookie:
|
|
for item in self.cookie:
|
|
ck[item.name] = item.value
|
|
return ck
|