1
1
import posixpath
2
+ import urllib .parse
2
3
from collections .abc import Awaitable , Callable
3
4
from typing import Any
4
5
@@ -167,13 +168,28 @@ def build_metadata(
167
168
client_registration_options : ClientRegistrationOptions ,
168
169
revocation_options : RevocationOptions ,
169
170
) -> OAuthMetadata :
170
- def append_path (base : str , suffix : str ) -> str :
171
- return posixpath .join (base .rstrip ("/" ), suffix .lstrip ("/" ))
171
+
172
+ def append_path (issuer_url : AnyHttpUrl , endpoint_path : str ) -> str :
173
+ parsed = urllib .parse .urlparse (str (issuer_url ))
174
+
175
+ base_path = parsed .path .rstrip ("/" )
176
+ endpoint_path = endpoint_path .lstrip ("/" )
177
+ new_path = posixpath .join (base_path , endpoint_path )
178
+
179
+ if not new_path .startswith ("/" ):
180
+ new_path = "/" + new_path
181
+
182
+ new_url = urllib .parse .urlunparse (parsed ._replace (path = new_path ))
183
+
184
+ if new_url .startswith ("/" ):
185
+ new_url = new_url [1 :]
186
+ return new_url
172
187
173
188
authorization_url = modify_url_path (
174
189
issuer_url , lambda path : append_path (path , AUTHORIZATION_PATH )
175
190
)
176
191
token_url = modify_url_path (issuer_url , lambda path : append_path (path , TOKEN_PATH ))
192
+
177
193
# Create metadata
178
194
metadata = OAuthMetadata (
179
195
issuer = issuer_url ,
@@ -206,4 +222,4 @@ def append_path(base: str, suffix: str) -> str:
206
222
)
207
223
metadata .revocation_endpoint_auth_methods_supported = ["client_secret_post" ]
208
224
209
- return metadata
225
+ return metadata
0 commit comments