|
| 1 | +import builtins |
| 2 | +from ipaddress import IPv4Address, IPv4Network, IPv6Address, IPv6Network |
| 3 | +from typing import Any, Dict, Sequence, Union, cast |
| 4 | + |
| 5 | +from aiohttp import web |
| 6 | + |
1 | 7 | from .log import logger |
2 | 8 |
|
| 9 | +IPAddress = Union[IPv4Address, IPv6Address] |
| 10 | +IPNetwork = Union[IPv4Network, IPv6Network] |
| 11 | +IPRule = Union[IPAddress, IPNetwork] |
| 12 | +Trusted = Sequence[Union["builtins.ellipsis", Sequence[IPRule]]] |
| 13 | + |
3 | 14 |
|
4 | 15 | class RemoteError(Exception): |
5 | | - def log(self, request): |
| 16 | + def log(self, request: web.Request) -> None: |
6 | 17 | raise NotImplementedError # pragma: no cover |
7 | 18 |
|
8 | 19 |
|
9 | 20 | class TooManyHeaders(RemoteError): |
10 | 21 | @property |
11 | | - def header(self): |
12 | | - return self.args[0] |
| 22 | + def header(self) -> str: |
| 23 | + return cast(str, self.args[0]) |
13 | 24 |
|
14 | | - def log(self, request): |
| 25 | + def log(self, request: web.Request) -> None: |
15 | 26 | msg = "Too many headers for %(header)s" |
16 | | - context = {"header": self.header} |
| 27 | + context: Dict[str, Any] = {"header": self.header} |
17 | 28 | extra = context.copy() |
18 | 29 | extra["request"] = request |
19 | 30 | logger.error(msg, context, extra=extra) |
20 | 31 |
|
21 | 32 |
|
22 | 33 | class IncorrectIPCount(RemoteError): |
23 | 34 | @property |
24 | | - def expected(self): |
25 | | - return self.args[0] |
| 35 | + def expected(self) -> int: |
| 36 | + return cast(int, self.args[0]) |
26 | 37 |
|
27 | 38 | @property |
28 | | - def actual(self): |
29 | | - return self.args[1] |
| 39 | + def actual(self) -> Sequence[IPAddress]: |
| 40 | + return cast(Sequence[IPAddress], self.args[1]) |
30 | 41 |
|
31 | | - def log(self, request): |
| 42 | + def log(self, request: web.Request) -> None: |
32 | 43 | msg = "Too many X-Forwarded-For values: %(actual)s, " "expected %(expected)s" |
33 | | - context = {"actual": self.actual, "expected": self.expected} |
| 44 | + context: Dict[str, Any] = {"actual": self.actual, "expected": self.expected} |
34 | 45 | extra = context.copy() |
35 | 46 | extra["request"] = request |
36 | 47 | logger.error(msg, context, extra=extra) |
37 | 48 |
|
38 | 49 |
|
39 | 50 | class IncorrectForwardedCount(RemoteError): |
40 | 51 | @property |
41 | | - def expected(self): |
42 | | - return self.args[0] |
| 52 | + def expected(self) -> int: |
| 53 | + return cast(int, self.args[0]) |
43 | 54 |
|
44 | 55 | @property |
45 | | - def actual(self): |
46 | | - return self.args[1] |
| 56 | + def actual(self) -> int: |
| 57 | + return cast(int, self.args[1]) |
47 | 58 |
|
48 | | - def log(self, request): |
| 59 | + def log(self, request: web.Request) -> None: |
49 | 60 | msg = "Too many Forwarded values: %(actual)s, " "expected %(expected)s" |
50 | | - context = {"actual": self.actual, "expected": self.expected} |
| 61 | + context: Dict[str, Any] = {"actual": self.actual, "expected": self.expected} |
51 | 62 | extra = context.copy() |
52 | 63 | extra["request"] = request |
53 | 64 | logger.error(msg, context, extra=extra) |
54 | 65 |
|
55 | 66 |
|
56 | 67 | class IncorrectProtoCount(RemoteError): |
57 | 68 | @property |
58 | | - def expected(self): |
59 | | - return self.args[0] |
| 69 | + def expected(self) -> int: |
| 70 | + return cast(int, self.args[0]) |
60 | 71 |
|
61 | 72 | @property |
62 | | - def actual(self): |
63 | | - return self.args[1] |
| 73 | + def actual(self) -> Sequence[str]: |
| 74 | + return cast(Sequence[str], self.args[1]) |
64 | 75 |
|
65 | | - def log(self, request): |
| 76 | + def log(self, request: web.Request) -> None: |
66 | 77 | msg = "Too many X-Forwarded-Proto values: %(actual)s, " "expected %(expected)s" |
67 | | - context = {"actual": self.actual, "expected": self.expected} |
| 78 | + context: Dict[str, Any] = {"actual": self.actual, "expected": self.expected} |
68 | 79 | extra = context.copy() |
69 | 80 | extra["request"] = request |
70 | 81 | logger.error(msg, context, extra=extra) |
71 | 82 |
|
72 | 83 |
|
73 | 84 | class UntrustedIP(RemoteError): |
74 | 85 | @property |
75 | | - def ip(self): |
76 | | - return self.args[0] |
| 86 | + def ip(self) -> IPAddress: |
| 87 | + return cast(IPAddress, self.args[0]) |
77 | 88 |
|
78 | 89 | @property |
79 | | - def trusted(self): |
80 | | - return self.args[1] |
| 90 | + def trusted(self) -> Sequence[IPAddress]: |
| 91 | + return cast(Sequence[IPAddress], self.args[1]) |
81 | 92 |
|
82 | | - def log(self, request): |
| 93 | + def log(self, request: web.Request) -> None: |
83 | 94 | msg = "Untrusted IP: %(ip)s, trusted: %(trusted)s" |
84 | | - context = {"ip": self.ip, "trusted": self.trusted} |
| 95 | + context: Dict[str, Any] = {"ip": self.ip, "trusted": self.trusted} |
85 | 96 | extra = context.copy() |
86 | 97 | extra["request"] = request |
87 | 98 | logger.error(msg, context, extra=extra) |
|
0 commit comments