File: HttpRequestScope.py

package info (click to toggle)
uranium 5.0.0-7
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 5,304 kB
  • sloc: python: 31,765; sh: 132; makefile: 12
file content (58 lines) | stat: -rw-r--r-- 1,974 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
import platform
from typing import Dict

from PyQt6.QtNetwork import QNetworkRequest

from UM.Application import Application


class HttpRequestScope:
    """Modifies a request in some way. This concept is sometimes called a request interceptor.

    Could be used to add authorization headers or set user agents, for example
    """

    def requestHook(self, request: QNetworkRequest) -> None:
        """Invoked after request-specific headers are set and before HttpRequestData is created"""

        pass

    @staticmethod
    def addHeaders(request: QNetworkRequest, header_dict: Dict) -> None:
        for key, value in header_dict.items():
            request.setRawHeader(key.encode("utf-8"), value.encode("utf-8"))


class DefaultUserAgentScope(HttpRequestScope):
    """Adds a User-Agent header"""

    def __init__(self, application: Application) -> None:
        self.header_dict = {
            "User-Agent": "%s/%s (%s %s)" % (application.getApplicationName(),
                                             application.getVersion(),
                                             platform.system(),
                                             platform.machine())
        }

    def requestHook(self, request: QNetworkRequest) -> None:
        super().requestHook(request)
        self.addHeaders(request, self.header_dict)


class JsonDecoratorScope(HttpRequestScope):
    """Extends a scope by adding Content-Type and Accept for application/json

    Should be used for Json requests which only accept a Json response
    """

    def __init__(self, base: HttpRequestScope) -> None:
        self.base = base
        self.header_dict = {
            "Content-Type": "application/json",
            "Accept": "application/json"
        }

    def requestHook(self, request: QNetworkRequest) -> None:
        # not calling super().request_hook() because base will do that.
        self.base.requestHook(request)
        self.addHeaders(request, self.header_dict)