やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

GitHubアップローダのHTTP応答処理を共通部とGitHub固有部にわけた

ちょっとすっきり。

成果物

GitHubGitHub.Upload.Http.Response.201703301533

開発環境

前回まで

http://ytyaru.hatenablog.com/entry/2017/10/19/000000

修正箇所

ファイル 修正概要
./web/http/Response.py HTTP共通部分。
web/service/github/api/v3/Response.py GitHub API v3固有部分。

Acceptごとに返すデータを変えるところをGitHubで実装した。

GitHub固有部

class Response(web.http.Response.Response):
    def __init__(self):
        super().__init__()
        self.re_content_type_raw = re.compile('application/vnd.github.*.raw')
    def Get(self, r, sleep_time=2, is_show=True):
        res = super().Get(r, sleep_time, is_show)
        if 'json' == self.Headers.ContentType.suffix:
            return r.json()
        elif self.re_content_type_raw.match(self.Headers.ContentType.mime_type):
            return r.content
        else:
            return res

たったこれだけ。HTTP部のクラスを継承しているところがポイント。

HTTP共通部

class Response(object):
    def __init__(self):
        self.Headers = Response.Headers()
    def Get(self, r, sleep_time=2, is_show=True):
        if is_show:
            print('Response.start---------------------')
            print("HTTP Status Code: {0} {1}".format(r.status_code, r.reason))
            print(r.text)
            print('Response.end---------------------')
        time.sleep(sleep_time)
        r.raise_for_status()
        
        self.Headers.ContentType.Split(r)
        if None is self.Headers.ContentType.mime_type:
            return None
        elif 'application/json' == self.Headers.ContentType.mime_type:
            return r.json()
        elif ('image/gif' == self.Headers.ContentType.mime_type or
            'image/jpeg' == self.Headers.ContentType.mime_type or
            'image/png' == self.Headers.ContentType.mime_type
        ):
            return Image.open(BytesIO(r.content))
        else:
            return r.text

HTTPのヘッダであるContent-TypeLinkを解析するクラスを別途つくった。詳しくはソースコード参照。

Content-TypeにあるMimeTypeによって返却値を変える処理をしている。もっと沢山あるが、きりがないので。application/jsonGitHubで頻繁に使う。

所感

クラスの継承を使ってみた。