capo-lambda-web 0.2.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (154) hide show
  1. capo_lambda_web/__init__.py +71 -0
  2. capo_lambda_web/_async.py +25 -0
  3. capo_lambda_web/_auth/_identity.py +16 -0
  4. capo_lambda_web/_auth/_providers.py +886 -0
  5. capo_lambda_web/_auth/_signers.py +121 -0
  6. capo_lambda_web/_auth/_sigv4.py +579 -0
  7. capo_lambda_web/_auth/_zapros_handler.py +80 -0
  8. capo_lambda_web/_body.py +221 -0
  9. capo_lambda_web/_iter.py +113 -0
  10. capo_lambda_web/_operations/lambda_web/create_web_function.py +184 -0
  11. capo_lambda_web/_operations/lambda_web/create_web_function_endpoint.py +194 -0
  12. capo_lambda_web/_operations/lambda_web/create_web_function_revision.py +188 -0
  13. capo_lambda_web/_operations/lambda_web/delete_resource_policy.py +147 -0
  14. capo_lambda_web/_operations/lambda_web/delete_web_function.py +145 -0
  15. capo_lambda_web/_operations/lambda_web/delete_web_function_endpoint.py +149 -0
  16. capo_lambda_web/_operations/lambda_web/delete_web_function_revision.py +149 -0
  17. capo_lambda_web/_operations/lambda_web/get_resource_policy.py +165 -0
  18. capo_lambda_web/_operations/lambda_web/get_web_account_settings.py +155 -0
  19. capo_lambda_web/_operations/lambda_web/get_web_function.py +171 -0
  20. capo_lambda_web/_operations/lambda_web/get_web_function_endpoint.py +180 -0
  21. capo_lambda_web/_operations/lambda_web/get_web_function_revision.py +174 -0
  22. capo_lambda_web/_operations/lambda_web/list_tags.py +164 -0
  23. capo_lambda_web/_operations/lambda_web/list_web_function_endpoints.py +176 -0
  24. capo_lambda_web/_operations/lambda_web/list_web_function_revisions.py +176 -0
  25. capo_lambda_web/_operations/lambda_web/list_web_functions.py +168 -0
  26. capo_lambda_web/_operations/lambda_web/put_resource_policy.py +179 -0
  27. capo_lambda_web/_operations/lambda_web/tag_resource.py +155 -0
  28. capo_lambda_web/_operations/lambda_web/untag_resource.py +148 -0
  29. capo_lambda_web/_operations/lambda_web/update_web_function_endpoint.py +196 -0
  30. capo_lambda_web/_pagination.py +21 -0
  31. capo_lambda_web/_protocol/__init__.py +1 -0
  32. capo_lambda_web/_protocol/errors.py +93 -0
  33. capo_lambda_web/_protocol/eventstream.py +240 -0
  34. capo_lambda_web/_protocol/serialize.py +47 -0
  35. capo_lambda_web/_protocol/xml.py +33 -0
  36. capo_lambda_web/_resources/lambda_web/web_function.py +477 -0
  37. capo_lambda_web/_rule_engine/__init__.py +0 -0
  38. capo_lambda_web/_rule_engine/_aws_partition.py +160 -0
  39. capo_lambda_web/_rule_engine/_endpoint_rule_set.py +135 -0
  40. capo_lambda_web/_rule_engine/_endpoint_runtime.py +389 -0
  41. capo_lambda_web/_services/_aws_config.py +160 -0
  42. capo_lambda_web/_services/_pipeline.py +264 -0
  43. capo_lambda_web/_services/async_lambda_web.py +1394 -0
  44. capo_lambda_web/_services/lambda_web.py +1374 -0
  45. capo_lambda_web/errors/__init__.py +36 -0
  46. capo_lambda_web/errors/_base.py +94 -0
  47. capo_lambda_web/errors/access_denied_exception.py +48 -0
  48. capo_lambda_web/errors/conflict_exception.py +58 -0
  49. capo_lambda_web/errors/internal_server_exception.py +47 -0
  50. capo_lambda_web/errors/resource_not_found_exception.py +60 -0
  51. capo_lambda_web/errors/service_quota_exceeded_exception.py +74 -0
  52. capo_lambda_web/errors/throttling_exception.py +60 -0
  53. capo_lambda_web/errors/validation_exception.py +46 -0
  54. capo_lambda_web/py.typed +0 -0
  55. capo_lambda_web/types/_prelude/blob.py +12 -0
  56. capo_lambda_web/types/_prelude/timestamp.py +17 -0
  57. capo_lambda_web/types/account_quotas.py +47 -0
  58. capo_lambda_web/types/account_usage.py +26 -0
  59. capo_lambda_web/types/application_log_level.py +22 -0
  60. capo_lambda_web/types/auth_type.py +18 -0
  61. capo_lambda_web/types/auto_deployment_mode.py +18 -0
  62. capo_lambda_web/types/build_config.py +55 -0
  63. capo_lambda_web/types/code_config.py +37 -0
  64. capo_lambda_web/types/create_web_function_endpoint_request.py +164 -0
  65. capo_lambda_web/types/create_web_function_endpoint_response.py +291 -0
  66. capo_lambda_web/types/create_web_function_request.py +72 -0
  67. capo_lambda_web/types/create_web_function_response.py +144 -0
  68. capo_lambda_web/types/create_web_function_revision_request.py +76 -0
  69. capo_lambda_web/types/create_web_function_revision_response.py +157 -0
  70. capo_lambda_web/types/date_time.py +20 -0
  71. capo_lambda_web/types/delete_resource_policy_request.py +29 -0
  72. capo_lambda_web/types/delete_web_function_endpoint_request.py +27 -0
  73. capo_lambda_web/types/delete_web_function_request.py +24 -0
  74. capo_lambda_web/types/delete_web_function_revision_request.py +27 -0
  75. capo_lambda_web/types/description.py +5 -0
  76. capo_lambda_web/types/domain_name.py +5 -0
  77. capo_lambda_web/types/endpoint_arn.py +5 -0
  78. capo_lambda_web/types/endpoint_config.py +134 -0
  79. capo_lambda_web/types/endpoint_name.py +5 -0
  80. capo_lambda_web/types/endpoint_state.py +20 -0
  81. capo_lambda_web/types/endpoint_type.py +19 -0
  82. capo_lambda_web/types/endpoint_update_status.py +19 -0
  83. capo_lambda_web/types/environment_variables.py +22 -0
  84. capo_lambda_web/types/filter.py +46 -0
  85. capo_lambda_web/types/filter_list.py +29 -0
  86. capo_lambda_web/types/filter_value_list.py +14 -0
  87. capo_lambda_web/types/function_arn.py +5 -0
  88. capo_lambda_web/types/function_endpoint_summary.py +249 -0
  89. capo_lambda_web/types/function_endpoint_summary_list.py +33 -0
  90. capo_lambda_web/types/function_name.py +5 -0
  91. capo_lambda_web/types/function_revision_summary.py +83 -0
  92. capo_lambda_web/types/function_revision_summary_list.py +33 -0
  93. capo_lambda_web/types/function_state.py +20 -0
  94. capo_lambda_web/types/function_summary.py +91 -0
  95. capo_lambda_web/types/function_summary_list.py +31 -0
  96. capo_lambda_web/types/get_resource_policy_request.py +24 -0
  97. capo_lambda_web/types/get_resource_policy_response.py +39 -0
  98. capo_lambda_web/types/get_web_account_settings_request.py +18 -0
  99. capo_lambda_web/types/get_web_account_settings_response.py +59 -0
  100. capo_lambda_web/types/get_web_function_endpoint_request.py +27 -0
  101. capo_lambda_web/types/get_web_function_endpoint_response.py +285 -0
  102. capo_lambda_web/types/get_web_function_request.py +24 -0
  103. capo_lambda_web/types/get_web_function_response.py +91 -0
  104. capo_lambda_web/types/get_web_function_revision_request.py +27 -0
  105. capo_lambda_web/types/get_web_function_revision_response.py +155 -0
  106. capo_lambda_web/types/kms_key_arn.py +5 -0
  107. capo_lambda_web/types/list_tags_request.py +24 -0
  108. capo_lambda_web/types/list_tags_response.py +32 -0
  109. capo_lambda_web/types/list_web_function_endpoints_request.py +54 -0
  110. capo_lambda_web/types/list_web_function_endpoints_response.py +52 -0
  111. capo_lambda_web/types/list_web_function_revisions_request.py +54 -0
  112. capo_lambda_web/types/list_web_function_revisions_response.py +52 -0
  113. capo_lambda_web/types/list_web_functions_request.py +51 -0
  114. capo_lambda_web/types/list_web_functions_response.py +46 -0
  115. capo_lambda_web/types/logging_config.py +67 -0
  116. capo_lambda_web/types/max_results.py +5 -0
  117. capo_lambda_web/types/next_token.py +5 -0
  118. capo_lambda_web/types/policy_revision_id.py +5 -0
  119. capo_lambda_web/types/put_resource_policy_request.py +43 -0
  120. capo_lambda_web/types/put_resource_policy_response.py +39 -0
  121. capo_lambda_web/types/region.py +5 -0
  122. capo_lambda_web/types/region_list.py +17 -0
  123. capo_lambda_web/types/regional_endpoint.py +140 -0
  124. capo_lambda_web/types/regional_endpoints.py +33 -0
  125. capo_lambda_web/types/resource_arn.py +5 -0
  126. capo_lambda_web/types/resource_policy.py +5 -0
  127. capo_lambda_web/types/revision_arn.py +5 -0
  128. capo_lambda_web/types/revision_config.py +69 -0
  129. capo_lambda_web/types/revision_error.py +40 -0
  130. capo_lambda_web/types/revision_errors.py +29 -0
  131. capo_lambda_web/types/revision_id.py +5 -0
  132. capo_lambda_web/types/revision_state.py +19 -0
  133. capo_lambda_web/types/revision_weight.py +38 -0
  134. capo_lambda_web/types/revision_weight_list.py +31 -0
  135. capo_lambda_web/types/role_arn.py +5 -0
  136. capo_lambda_web/types/runtime_config.py +26 -0
  137. capo_lambda_web/types/s3_object.py +39 -0
  138. capo_lambda_web/types/scaling_config.py +23 -0
  139. capo_lambda_web/types/service_config.py +87 -0
  140. capo_lambda_web/types/system_log_level.py +19 -0
  141. capo_lambda_web/types/tag_key.py +5 -0
  142. capo_lambda_web/types/tag_key_list.py +17 -0
  143. capo_lambda_web/types/tag_resource_request.py +38 -0
  144. capo_lambda_web/types/tags.py +25 -0
  145. capo_lambda_web/types/telemetry_config.py +36 -0
  146. capo_lambda_web/types/throttle_config.py +23 -0
  147. capo_lambda_web/types/untag_resource_request.py +27 -0
  148. capo_lambda_web/types/update_web_function_endpoint_request.py +121 -0
  149. capo_lambda_web/types/update_web_function_endpoint_response.py +291 -0
  150. capo_lambda_web-0.2.0.dist-info/METADATA +104 -0
  151. capo_lambda_web-0.2.0.dist-info/RECORD +154 -0
  152. capo_lambda_web-0.2.0.dist-info/WHEEL +5 -0
  153. capo_lambda_web-0.2.0.dist-info/licenses/LICENSE +21 -0
  154. capo_lambda_web-0.2.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,155 @@
1
+ """Generated from Smithy shape ``com.amazonaws.lambdaweb#TagResource``."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import json
6
+ from typing import Any
7
+ from urllib.parse import quote
8
+
9
+ import zapros
10
+ from typing_extensions import Never
11
+
12
+ import capo_lambda_web._auth._signers
13
+ import capo_lambda_web._auth._sigv4
14
+ import capo_lambda_web._protocol.eventstream
15
+ import capo_lambda_web.errors.access_denied_exception
16
+ import capo_lambda_web.errors.conflict_exception
17
+ import capo_lambda_web.errors.internal_server_exception
18
+ import capo_lambda_web.errors.resource_not_found_exception
19
+ import capo_lambda_web.errors.service_quota_exceeded_exception
20
+ import capo_lambda_web.errors.throttling_exception
21
+ import capo_lambda_web.errors.validation_exception
22
+ import capo_lambda_web.types.tag_resource_request
23
+ import capo_lambda_web.types.tags
24
+ from capo_lambda_web._protocol.errors import parse_error_metadata_json
25
+ from capo_lambda_web._rule_engine._endpoint_rule_set import EndpointParams, resolve
26
+ from capo_lambda_web._services._pipeline import (
27
+ AsyncOperationOptions,
28
+ OperationOptions,
29
+ raise_error,
30
+ )
31
+ from capo_lambda_web.errors import UnknownServiceError
32
+
33
+
34
+ def handle_error(response: zapros.Response) -> Never:
35
+ data = json.loads(response.read())
36
+ code, message = parse_error_metadata_json(response, data)
37
+ match code:
38
+ case "AccessDeniedException":
39
+ raise capo_lambda_web.errors.access_denied_exception.AccessDeniedException.from_json(
40
+ data, message
41
+ )
42
+ case "ConflictException":
43
+ raise capo_lambda_web.errors.conflict_exception.ConflictException.from_json(
44
+ data, message
45
+ )
46
+ case "InternalServerException":
47
+ raise capo_lambda_web.errors.internal_server_exception.InternalServerException.from_json(
48
+ data, message
49
+ )
50
+ case "ResourceNotFoundException":
51
+ raise capo_lambda_web.errors.resource_not_found_exception.ResourceNotFoundException.from_json(
52
+ data, message
53
+ )
54
+ case "ServiceQuotaExceededException":
55
+ raise capo_lambda_web.errors.service_quota_exceeded_exception.ServiceQuotaExceededException.from_json(
56
+ data, message
57
+ )
58
+ case "ThrottlingException":
59
+ raise capo_lambda_web.errors.throttling_exception.ThrottlingException.from_json(
60
+ data, message
61
+ )
62
+ case "ValidationException":
63
+ raise capo_lambda_web.errors.validation_exception.ValidationException.from_json(
64
+ data, message
65
+ )
66
+ case _:
67
+ raise UnknownServiceError(code=code, message=message, response=response)
68
+
69
+
70
+ def get_signer(
71
+ options: AsyncOperationOptions | OperationOptions,
72
+ auth_schemes: list[dict[str, Any]] | None = None,
73
+ ) -> capo_lambda_web._auth._signers.Signer | None:
74
+ name_to_schema = {s["name"]: s for s in (auth_schemes or [])} # noqa: F841
75
+ if (
76
+ options.credentials_provider is not None
77
+ and name_to_schema
78
+ and not name_to_schema.keys() & {"sigv4", "sigv4-s3express"}
79
+ ):
80
+ raise RuntimeError(
81
+ "Endpoint requires an unsupported auth scheme: " + ", ".join(name_to_schema)
82
+ )
83
+ if options.credentials_provider is not None:
84
+ endpoint_scheme = name_to_schema.get("sigv4") or name_to_schema.get(
85
+ "sigv4-s3express"
86
+ )
87
+ if endpoint_scheme is not None or not name_to_schema:
88
+ sigv4_config = capo_lambda_web._auth._sigv4.build_sigv4_auth_scheme(
89
+ "lambda", options.region, endpoint_scheme
90
+ )
91
+ if sigv4_config is not None:
92
+ return capo_lambda_web._auth._signers.SigV4Signer(
93
+ options.credentials_provider, auth_scheme=sigv4_config
94
+ )
95
+ raise RuntimeError("Auth was not resolved")
96
+
97
+
98
+ def build_request(
99
+ options: OperationOptions | AsyncOperationOptions,
100
+ input_: capo_lambda_web.types.tag_resource_request.TagResourceRequest,
101
+ ) -> zapros.Request:
102
+ endpoint = resolve(
103
+ EndpointParams(
104
+ Region=options.region,
105
+ UseDualStack=options.use_dual_stack,
106
+ UseFIPS=options.use_fips,
107
+ Endpoint=options.endpoint,
108
+ )
109
+ ) # noqa: F841
110
+ url = endpoint.url.rstrip("/") + "/2025-03-07/tags/{resource}"
111
+ url = url.replace("{resource}", quote(input_["resource"], safe=""))
112
+ params: list[tuple[str, str]] = []
113
+ headers: dict[str, str] = {k: ", ".join(v) for k, v in endpoint.headers.items()}
114
+ body: bytes | None = json.dumps(
115
+ capo_lambda_web.types.tag_resource_request.serialize_json(input_),
116
+ allow_nan=False,
117
+ ).encode()
118
+ headers["content-type"] = "application/json"
119
+ signer = get_signer(options, auth_schemes=endpoint.properties.get("authSchemes"))
120
+ normalized_url = zapros.URL(url)
121
+ for k, v in params:
122
+ normalized_url.search_params.append(k, v)
123
+ return zapros.Request(
124
+ normalized_url, "POST", headers=headers, body=body, context={"signer": signer}
125
+ )
126
+
127
+
128
+ def tag_resource(
129
+ options: OperationOptions,
130
+ input_: capo_lambda_web.types.tag_resource_request.TagResourceRequest,
131
+ ) -> tuple[None, zapros.Response]:
132
+ response = options.client.handler.handle(build_request(options, input_))
133
+ try:
134
+ if response.status >= 300:
135
+ response.read()
136
+ raise_error(response, handle_error)
137
+ return None, response
138
+ except BaseException:
139
+ response.close()
140
+ raise
141
+
142
+
143
+ async def async_tag_resource(
144
+ options: AsyncOperationOptions,
145
+ input_: capo_lambda_web.types.tag_resource_request.TagResourceRequest,
146
+ ) -> tuple[None, zapros.Response]:
147
+ response = await options.client.handler.ahandle(build_request(options, input_))
148
+ try:
149
+ if response.status >= 300:
150
+ await response.aread()
151
+ raise_error(response, handle_error)
152
+ return None, response
153
+ except BaseException:
154
+ await response.aclose()
155
+ raise
@@ -0,0 +1,148 @@
1
+ """Generated from Smithy shape ``com.amazonaws.lambdaweb#UntagResource``."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import json
6
+ from typing import Any
7
+ from urllib.parse import quote
8
+
9
+ import zapros
10
+ from typing_extensions import Never
11
+
12
+ import capo_lambda_web._auth._signers
13
+ import capo_lambda_web._auth._sigv4
14
+ import capo_lambda_web._protocol.eventstream
15
+ import capo_lambda_web.errors.access_denied_exception
16
+ import capo_lambda_web.errors.conflict_exception
17
+ import capo_lambda_web.errors.internal_server_exception
18
+ import capo_lambda_web.errors.resource_not_found_exception
19
+ import capo_lambda_web.errors.throttling_exception
20
+ import capo_lambda_web.errors.validation_exception
21
+ import capo_lambda_web.types.tag_key_list
22
+ import capo_lambda_web.types.untag_resource_request
23
+ from capo_lambda_web._protocol.errors import parse_error_metadata_json
24
+ from capo_lambda_web._rule_engine._endpoint_rule_set import EndpointParams, resolve
25
+ from capo_lambda_web._services._pipeline import (
26
+ AsyncOperationOptions,
27
+ OperationOptions,
28
+ raise_error,
29
+ )
30
+ from capo_lambda_web.errors import UnknownServiceError
31
+
32
+
33
+ def handle_error(response: zapros.Response) -> Never:
34
+ data = json.loads(response.read())
35
+ code, message = parse_error_metadata_json(response, data)
36
+ match code:
37
+ case "AccessDeniedException":
38
+ raise capo_lambda_web.errors.access_denied_exception.AccessDeniedException.from_json(
39
+ data, message
40
+ )
41
+ case "ConflictException":
42
+ raise capo_lambda_web.errors.conflict_exception.ConflictException.from_json(
43
+ data, message
44
+ )
45
+ case "InternalServerException":
46
+ raise capo_lambda_web.errors.internal_server_exception.InternalServerException.from_json(
47
+ data, message
48
+ )
49
+ case "ResourceNotFoundException":
50
+ raise capo_lambda_web.errors.resource_not_found_exception.ResourceNotFoundException.from_json(
51
+ data, message
52
+ )
53
+ case "ThrottlingException":
54
+ raise capo_lambda_web.errors.throttling_exception.ThrottlingException.from_json(
55
+ data, message
56
+ )
57
+ case "ValidationException":
58
+ raise capo_lambda_web.errors.validation_exception.ValidationException.from_json(
59
+ data, message
60
+ )
61
+ case _:
62
+ raise UnknownServiceError(code=code, message=message, response=response)
63
+
64
+
65
+ def get_signer(
66
+ options: AsyncOperationOptions | OperationOptions,
67
+ auth_schemes: list[dict[str, Any]] | None = None,
68
+ ) -> capo_lambda_web._auth._signers.Signer | None:
69
+ name_to_schema = {s["name"]: s for s in (auth_schemes or [])} # noqa: F841
70
+ if (
71
+ options.credentials_provider is not None
72
+ and name_to_schema
73
+ and not name_to_schema.keys() & {"sigv4", "sigv4-s3express"}
74
+ ):
75
+ raise RuntimeError(
76
+ "Endpoint requires an unsupported auth scheme: " + ", ".join(name_to_schema)
77
+ )
78
+ if options.credentials_provider is not None:
79
+ endpoint_scheme = name_to_schema.get("sigv4") or name_to_schema.get(
80
+ "sigv4-s3express"
81
+ )
82
+ if endpoint_scheme is not None or not name_to_schema:
83
+ sigv4_config = capo_lambda_web._auth._sigv4.build_sigv4_auth_scheme(
84
+ "lambda", options.region, endpoint_scheme
85
+ )
86
+ if sigv4_config is not None:
87
+ return capo_lambda_web._auth._signers.SigV4Signer(
88
+ options.credentials_provider, auth_scheme=sigv4_config
89
+ )
90
+ raise RuntimeError("Auth was not resolved")
91
+
92
+
93
+ def build_request(
94
+ options: OperationOptions | AsyncOperationOptions,
95
+ input_: capo_lambda_web.types.untag_resource_request.UntagResourceRequest,
96
+ ) -> zapros.Request:
97
+ endpoint = resolve(
98
+ EndpointParams(
99
+ Region=options.region,
100
+ UseDualStack=options.use_dual_stack,
101
+ UseFIPS=options.use_fips,
102
+ Endpoint=options.endpoint,
103
+ )
104
+ ) # noqa: F841
105
+ url = endpoint.url.rstrip("/") + "/2025-03-07/tags/{resource}"
106
+ url = url.replace("{resource}", quote(input_["resource"], safe=""))
107
+ params: list[tuple[str, str]] = []
108
+ for item in input_["tag_keys"]:
109
+ params.append(("tagKeys", item))
110
+ headers: dict[str, str] = {k: ", ".join(v) for k, v in endpoint.headers.items()}
111
+ body: bytes | None = b""
112
+ signer = get_signer(options, auth_schemes=endpoint.properties.get("authSchemes"))
113
+ normalized_url = zapros.URL(url)
114
+ for k, v in params:
115
+ normalized_url.search_params.append(k, v)
116
+ return zapros.Request(
117
+ normalized_url, "DELETE", headers=headers, body=body, context={"signer": signer}
118
+ )
119
+
120
+
121
+ def untag_resource(
122
+ options: OperationOptions,
123
+ input_: capo_lambda_web.types.untag_resource_request.UntagResourceRequest,
124
+ ) -> tuple[None, zapros.Response]:
125
+ response = options.client.handler.handle(build_request(options, input_))
126
+ try:
127
+ if response.status >= 300:
128
+ response.read()
129
+ raise_error(response, handle_error)
130
+ return None, response
131
+ except BaseException:
132
+ response.close()
133
+ raise
134
+
135
+
136
+ async def async_untag_resource(
137
+ options: AsyncOperationOptions,
138
+ input_: capo_lambda_web.types.untag_resource_request.UntagResourceRequest,
139
+ ) -> tuple[None, zapros.Response]:
140
+ response = await options.client.handler.ahandle(build_request(options, input_))
141
+ try:
142
+ if response.status >= 300:
143
+ await response.aread()
144
+ raise_error(response, handle_error)
145
+ return None, response
146
+ except BaseException:
147
+ await response.aclose()
148
+ raise
@@ -0,0 +1,196 @@
1
+ """Generated from Smithy shape ``com.amazonaws.lambdaweb#UpdateWebFunctionEndpoint``."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import json
6
+ from typing import Any
7
+ from urllib.parse import quote
8
+
9
+ import zapros
10
+ from typing_extensions import Never
11
+
12
+ import capo_lambda_web._auth._signers
13
+ import capo_lambda_web._auth._sigv4
14
+ import capo_lambda_web._protocol.eventstream
15
+ import capo_lambda_web.errors.access_denied_exception
16
+ import capo_lambda_web.errors.conflict_exception
17
+ import capo_lambda_web.errors.internal_server_exception
18
+ import capo_lambda_web.errors.resource_not_found_exception
19
+ import capo_lambda_web.errors.service_quota_exceeded_exception
20
+ import capo_lambda_web.errors.throttling_exception
21
+ import capo_lambda_web.errors.validation_exception
22
+ import capo_lambda_web.types.auth_type
23
+ import capo_lambda_web.types.auto_deployment_mode
24
+ import capo_lambda_web.types.date_time
25
+ import capo_lambda_web.types.endpoint_state
26
+ import capo_lambda_web.types.endpoint_type
27
+ import capo_lambda_web.types.endpoint_update_status
28
+ import capo_lambda_web.types.region_list
29
+ import capo_lambda_web.types.regional_endpoints
30
+ import capo_lambda_web.types.revision_weight_list
31
+ import capo_lambda_web.types.scaling_config
32
+ import capo_lambda_web.types.throttle_config
33
+ import capo_lambda_web.types.update_web_function_endpoint_request
34
+ import capo_lambda_web.types.update_web_function_endpoint_response
35
+ from capo_lambda_web._protocol.errors import parse_error_metadata_json
36
+ from capo_lambda_web._rule_engine._endpoint_rule_set import EndpointParams, resolve
37
+ from capo_lambda_web._services._pipeline import (
38
+ AsyncOperationOptions,
39
+ OperationOptions,
40
+ raise_error,
41
+ )
42
+ from capo_lambda_web.errors import UnknownServiceError
43
+
44
+
45
+ def handle_error(response: zapros.Response) -> Never:
46
+ data = json.loads(response.read())
47
+ code, message = parse_error_metadata_json(response, data)
48
+ match code:
49
+ case "AccessDeniedException":
50
+ raise capo_lambda_web.errors.access_denied_exception.AccessDeniedException.from_json(
51
+ data, message
52
+ )
53
+ case "ConflictException":
54
+ raise capo_lambda_web.errors.conflict_exception.ConflictException.from_json(
55
+ data, message
56
+ )
57
+ case "InternalServerException":
58
+ raise capo_lambda_web.errors.internal_server_exception.InternalServerException.from_json(
59
+ data, message
60
+ )
61
+ case "ResourceNotFoundException":
62
+ raise capo_lambda_web.errors.resource_not_found_exception.ResourceNotFoundException.from_json(
63
+ data, message
64
+ )
65
+ case "ServiceQuotaExceededException":
66
+ raise capo_lambda_web.errors.service_quota_exceeded_exception.ServiceQuotaExceededException.from_json(
67
+ data, message
68
+ )
69
+ case "ThrottlingException":
70
+ raise capo_lambda_web.errors.throttling_exception.ThrottlingException.from_json(
71
+ data, message
72
+ )
73
+ case "ValidationException":
74
+ raise capo_lambda_web.errors.validation_exception.ValidationException.from_json(
75
+ data, message
76
+ )
77
+ case _:
78
+ raise UnknownServiceError(code=code, message=message, response=response)
79
+
80
+
81
+ def handle_response(
82
+ response: zapros.Response,
83
+ ) -> capo_lambda_web.types.update_web_function_endpoint_response.UpdateWebFunctionEndpointResponse:
84
+ out: capo_lambda_web.types.update_web_function_endpoint_response.UpdateWebFunctionEndpointResponse = capo_lambda_web.types.update_web_function_endpoint_response.deserialize_json(
85
+ json.loads(response.read())
86
+ )
87
+ return out
88
+
89
+
90
+ async def async_handle_response(
91
+ response: zapros.Response,
92
+ ) -> capo_lambda_web.types.update_web_function_endpoint_response.UpdateWebFunctionEndpointResponse:
93
+ out: capo_lambda_web.types.update_web_function_endpoint_response.UpdateWebFunctionEndpointResponse = capo_lambda_web.types.update_web_function_endpoint_response.deserialize_json(
94
+ json.loads(await response.aread())
95
+ )
96
+ return out
97
+
98
+
99
+ def get_signer(
100
+ options: AsyncOperationOptions | OperationOptions,
101
+ auth_schemes: list[dict[str, Any]] | None = None,
102
+ ) -> capo_lambda_web._auth._signers.Signer | None:
103
+ name_to_schema = {s["name"]: s for s in (auth_schemes or [])} # noqa: F841
104
+ if (
105
+ options.credentials_provider is not None
106
+ and name_to_schema
107
+ and not name_to_schema.keys() & {"sigv4", "sigv4-s3express"}
108
+ ):
109
+ raise RuntimeError(
110
+ "Endpoint requires an unsupported auth scheme: " + ", ".join(name_to_schema)
111
+ )
112
+ if options.credentials_provider is not None:
113
+ endpoint_scheme = name_to_schema.get("sigv4") or name_to_schema.get(
114
+ "sigv4-s3express"
115
+ )
116
+ if endpoint_scheme is not None or not name_to_schema:
117
+ sigv4_config = capo_lambda_web._auth._sigv4.build_sigv4_auth_scheme(
118
+ "lambda", options.region, endpoint_scheme
119
+ )
120
+ if sigv4_config is not None:
121
+ return capo_lambda_web._auth._signers.SigV4Signer(
122
+ options.credentials_provider, auth_scheme=sigv4_config
123
+ )
124
+ raise RuntimeError("Auth was not resolved")
125
+
126
+
127
+ def build_request(
128
+ options: OperationOptions | AsyncOperationOptions,
129
+ input_: capo_lambda_web.types.update_web_function_endpoint_request.UpdateWebFunctionEndpointRequest,
130
+ ) -> zapros.Request:
131
+ endpoint = resolve(
132
+ EndpointParams(
133
+ Region=options.region,
134
+ UseDualStack=options.use_dual_stack,
135
+ UseFIPS=options.use_fips,
136
+ Endpoint=options.endpoint,
137
+ )
138
+ ) # noqa: F841
139
+ url = (
140
+ endpoint.url.rstrip("/")
141
+ + "/2025-03-07/web-functions/{functionName}/endpoints/{endpointName}"
142
+ )
143
+ url = url.replace("{functionName}", quote(input_["function_name"], safe=""))
144
+ url = url.replace("{endpointName}", quote(input_["endpoint_name"], safe=""))
145
+ params: list[tuple[str, str]] = []
146
+ headers: dict[str, str] = {k: ", ".join(v) for k, v in endpoint.headers.items()}
147
+ body: bytes | None = json.dumps(
148
+ capo_lambda_web.types.update_web_function_endpoint_request.serialize_json(
149
+ input_
150
+ ),
151
+ allow_nan=False,
152
+ ).encode()
153
+ headers["content-type"] = "application/json"
154
+ signer = get_signer(options, auth_schemes=endpoint.properties.get("authSchemes"))
155
+ normalized_url = zapros.URL(url)
156
+ for k, v in params:
157
+ normalized_url.search_params.append(k, v)
158
+ return zapros.Request(
159
+ normalized_url, "PATCH", headers=headers, body=body, context={"signer": signer}
160
+ )
161
+
162
+
163
+ def update_web_function_endpoint(
164
+ options: OperationOptions,
165
+ input_: capo_lambda_web.types.update_web_function_endpoint_request.UpdateWebFunctionEndpointRequest,
166
+ ) -> tuple[
167
+ capo_lambda_web.types.update_web_function_endpoint_response.UpdateWebFunctionEndpointResponse,
168
+ zapros.Response,
169
+ ]:
170
+ response = options.client.handler.handle(build_request(options, input_))
171
+ try:
172
+ if response.status >= 300:
173
+ response.read()
174
+ raise_error(response, handle_error)
175
+ return handle_response(response), response
176
+ except BaseException:
177
+ response.close()
178
+ raise
179
+
180
+
181
+ async def async_update_web_function_endpoint(
182
+ options: AsyncOperationOptions,
183
+ input_: capo_lambda_web.types.update_web_function_endpoint_request.UpdateWebFunctionEndpointRequest,
184
+ ) -> tuple[
185
+ capo_lambda_web.types.update_web_function_endpoint_response.UpdateWebFunctionEndpointResponse,
186
+ zapros.Response,
187
+ ]:
188
+ response = await options.client.handler.ahandle(build_request(options, input_))
189
+ try:
190
+ if response.status >= 300:
191
+ await response.aread()
192
+ raise_error(response, handle_error)
193
+ return await async_handle_response(response), response
194
+ except BaseException:
195
+ await response.aclose()
196
+ raise
@@ -0,0 +1,21 @@
1
+ """Runtime helpers for generated paginated ``iter_*`` operation methods."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import Any
6
+
7
+
8
+ def resolve_path(obj: Any, path: tuple[str, ...]) -> Any:
9
+ """Walk ``path`` segments on a nested ``dict`` (TypedDict at runtime).
10
+
11
+ Returns ``None`` as soon as any intermediate value is missing or non-dict —
12
+ the generated iter loop uses a falsy token as the terminate signal, so this
13
+ short-circuit gives the same semantics for dotted paths as for top-level ones.
14
+ """
15
+ for key in path:
16
+ if not isinstance(obj, dict):
17
+ return None
18
+ obj = obj.get(key)
19
+ if obj is None:
20
+ return None
21
+ return obj
@@ -0,0 +1 @@
1
+ """Protocol runtime modules. Hand-written; not generated."""
@@ -0,0 +1,93 @@
1
+ """Shared service-error runtime.
2
+
3
+ Hand-written, not regenerated. Helpers for extracting error metadata
4
+ from HTTP error responses.
5
+ """
6
+
7
+ from __future__ import annotations
8
+
9
+ from typing import TYPE_CHECKING
10
+
11
+ from zapros import Response
12
+
13
+ from .xml import fromstring
14
+
15
+ if TYPE_CHECKING:
16
+ from xml.etree.ElementTree import Element
17
+
18
+
19
+ def find_error_element(root: Element) -> Element:
20
+ """Return the element holding the error structure's members.
21
+
22
+ Handles the three XML error envelopes: a bare ``<Error>`` root
23
+ (restXml with ``noErrorWrapping``), an ``<ErrorResponse><Error>``
24
+ wrapper (restXml/awsQuery), and the ec2Query
25
+ ``<Response><Errors><Error>`` envelope. Falls back to ``root``
26
+ when no ``<Error>`` element is found.
27
+ """
28
+ if root.tag.endswith("Error"):
29
+ return root
30
+ for path in ("Error", "Errors/Error"):
31
+ err = root.find(path)
32
+ if err is not None:
33
+ return err
34
+ return root
35
+
36
+
37
+ def parse_error_metadata(root: Element) -> tuple[str | None, str | None]:
38
+ """Return ``(code, message)`` from an XML error envelope.
39
+
40
+ Accepts any envelope understood by :func:`find_error_element`.
41
+ Missing children yield ``None``.
42
+ """
43
+ err = find_error_element(root)
44
+ code_el = err.find("Code")
45
+ msg_el = err.find("Message")
46
+ code = code_el.text if code_el is not None else None
47
+ message = msg_el.text if msg_el is not None else None
48
+ return code, message
49
+
50
+
51
+ def parse_error_metadata_json(
52
+ response: Response, data: dict
53
+ ) -> tuple[str | None, str | None]:
54
+ """Return ``(code, message)`` from a restJson1 error response.
55
+
56
+ Code precedence: the ``X-Amzn-Errortype`` response header, then the
57
+ ``__type`` body field, then ``code``. The raw value is normalized by
58
+ dropping a trailing ``:uri`` suffix first, then a ``prefix#``
59
+ namespace — in that order, so a ``#`` inside the uri suffix cannot
60
+ hijack the code. Message comes from ``message`` or ``Message``.
61
+ Missing values yield ``None``.
62
+ """
63
+ code = (
64
+ response.headers.get("X-Amzn-Errortype")
65
+ or data.get("__type")
66
+ or data.get("code")
67
+ )
68
+ if code is not None:
69
+ code = code.split(":", 1)[0].rsplit("#", 1)[-1]
70
+ message = data.get("message") or data.get("Message")
71
+ return code, message
72
+
73
+
74
+ def is_xml_error_body(body: bytes) -> bool:
75
+ """Whether a 2xx response body is really an XML error document.
76
+
77
+ S3 answers CopyObject, UploadPartCopy and CompleteMultipartUpload
78
+ with ``200 OK`` before the operation finishes; a failure after that
79
+ point is reported as an ``<Error>`` body (or an empty body) on the
80
+ 200 response. Official SDKs check the body for exactly these
81
+ operations.
82
+ """
83
+ if not body:
84
+ return True
85
+ return fromstring(body).tag == "Error"
86
+
87
+
88
+ __all__ = [
89
+ "find_error_element",
90
+ "is_xml_error_body",
91
+ "parse_error_metadata",
92
+ "parse_error_metadata_json",
93
+ ]