Coverage for src/lanraragi_api/util/http.py: 82%

34 statements  

« prev     ^ index     » next       coverage.py v7.16.0, created at 2026-09-22 23:20 +0000

1from typing import Any 

2 

3HeaderType = dict[str, Any] 

4ParamType = dict[str, Any] 

5 

6 

7def merge_headers( 

8 old_headers: HeaderType | None = None, new_headers: HeaderType | None = None 

9) -> HeaderType: 

10 """Merge the new headers into the old headers. 

11 

12 New headers wine over old headers of the same name. 

13 

14 Args: 

15 old_headers: default headers. Defaults to None, which will be an empty dict. 

16 new_headers: new headers. Defaults to None, which will be an empty dict. 

17 

18 Returns: 

19 dict: Headers merged, defaults included. 

20 """ 

21 if old_headers is None: 

22 old_headers = {} 

23 if new_headers is None: 

24 new_headers = {} 

25 merged: HeaderType = dict(new_headers) 

26 for k in old_headers: 

27 if k in merged: 

28 continue 

29 merged[k] = old_headers[k] 

30 return merged 

31 

32 

33def merge_params( 

34 old_params: ParamType | None = None, new_params: ParamType | None = None 

35) -> ParamType: 

36 """Merge the new query parameters into the old query parameters. 

37 

38 New query parameters wine over old query parameters of the same name. 

39 

40 Args: 

41 old_params: default query parameters. Defaults to None, which will be an empty dict. 

42 new_params: new query parameters. Defaults to None, which will be an empty dict. 

43 

44 Returns: 

45 dict: query parameters merged, defaults included. 

46 """ 

47 if old_params is None: 

48 old_params = {} 

49 if new_params is None: 

50 new_params = {} 

51 merged: ParamType = dict(new_params) 

52 for k in old_params: 

53 if k in merged: 

54 continue 

55 merged[k] = old_params[k] 

56 return merged 

57 

58 

59def normalize_params(params: ParamType) -> ParamType: 

60 """Normalize query parameters by overriding the default marshalling of some 

61 types to fit the HTTP standard. 

62 """ 

63 new_params: ParamType = {} 

64 for k, v in params.items(): 

65 if v is None: 

66 continue 

67 if isinstance(v, bool): 

68 # requests won't encoding bool value to lowercase string 

69 v = "true" if v else "false" 

70 new_params[k] = v 

71 

72 return new_params