@@ -13,9 +13,11 @@ import cats.data.NonEmptyList
13
13
import cats .effect .Async
14
14
import cats .effect .MonadCancelThrow
15
15
import cats .effect .Resource
16
+ import cats .effect .implicits .*
16
17
import cats .effect .std
17
18
import cats .syntax .all .*
18
19
import fs2 .compression .Compression
20
+ import org .http4s .Uri
19
21
import org .http4s .client .Client
20
22
import playground .plugins .PlaygroundPlugin
21
23
import playground .plugins .SimpleHttpBuilder
@@ -115,15 +117,39 @@ object OperationRunner {
115
117
116
118
}
117
119
120
+ // https://github.com/kubukoz/smithy-playground/issues/158
121
+ def dynamicBaseUri [F [_]: MonadCancelThrow ](
122
+ getUri : F [Uri ]
123
+ ): Client [F ] => Client [F ] =
124
+ client =>
125
+ Client [F ] { req =>
126
+ getUri.toResource.flatMap { uri =>
127
+ client.run(
128
+ req.withUri(
129
+ req
130
+ .uri
131
+ .copy(
132
+ scheme = uri.scheme,
133
+ authority = uri.authority,
134
+ // prefixing with uri.path
135
+ path = uri.path.addSegments(req.uri.path.segments),
136
+ )
137
+ )
138
+ )
139
+ }
140
+ }
141
+
118
142
def forSchemaIndex [F [_]: StdlibRuntime : Async : Compression : std.Console ](
119
143
dsi : DynamicSchemaIndex ,
120
144
client : Client [F ],
145
+ baseUri : F [Uri ],
121
146
awsEnv : Resource [F , AwsEnvironment [F ]],
122
147
plugins : List [PlaygroundPlugin ],
123
148
): Map [QualifiedIdentifier , Resolver [F ]] = forServices(
124
149
services = dsi.allServices.toList,
125
150
getSchema = dsi.getSchema,
126
151
client = client,
152
+ baseUri = baseUri,
127
153
awsEnv = awsEnv,
128
154
plugins = plugins,
129
155
)
@@ -132,6 +158,7 @@ object OperationRunner {
132
158
services : List [DynamicSchemaIndex .ServiceWrapper ],
133
159
getSchema : ShapeId => Option [Schema [? ]],
134
160
client : Client [F ],
161
+ baseUri : F [Uri ],
135
162
awsEnv : Resource [F , AwsEnvironment [F ]],
136
163
plugins : List [PlaygroundPlugin ],
137
164
): Map [QualifiedIdentifier , Resolver [F ]] =
@@ -140,6 +167,7 @@ object OperationRunner {
140
167
OperationRunner .forService[svc.Alg , F ](
141
168
svc.service,
142
169
client,
170
+ baseUri,
143
171
awsEnv,
144
172
getSchema,
145
173
plugins,
@@ -173,6 +201,7 @@ object OperationRunner {
173
201
def forService [Alg [_[_, _, _, _, _]], F [_]: StdlibRuntime : Async : Compression : std.Console ](
174
202
service : Service [Alg ],
175
203
client : Client [F ],
204
+ baseUri : F [Uri ],
176
205
awsEnv : Resource [F , AwsEnvironment [F ]],
177
206
schemaIndex : ShapeId => Option [Schema [? ]],
178
207
plugins : List [PlaygroundPlugin ],
@@ -195,7 +224,11 @@ object OperationRunner {
195
224
builder
196
225
.client(
197
226
service,
198
- client,
227
+ dynamicBaseUri[F ](
228
+ baseUri.flatTap { uri =>
229
+ std.Console [F ].println(s " Using base URI: $uri" )
230
+ }
231
+ ).apply(client),
199
232
)
200
233
.leftMap(e => Issue .InvalidProtocol (e.protocolTag.id, serviceProtocols))
201
234
.map(service.toPolyFunction(_))
0 commit comments