Jan Skrasek
09/05/2022, 7:48 AMmbonnin
09/05/2022, 7:50 AMx-apollo-operation-name
from the query
neither the response. You could write your own interceptor to get them though and store them in a custom ExecutionContext
mbonnin
09/05/2022, 7:51 AMApolloClient
is adding automatically are very few: https://github.com/apollographql/apollo-kotlin/blob/782f7ebbc155471ca8b15bbeaa78ec[…]om/apollographql/apollo3/api/http/DefaultHttpRequestComposer.ktmbonnin
09/05/2022, 7:52 AMquery.name()
and query.id()
to retrieve the same valuesJan Skrasek
09/05/2022, 7:52 AMmbonnin
09/05/2022, 7:52 AMJan Skrasek
09/05/2022, 7:55 AMinternal class NetworkAuthorizationInterceptor(
private val ...
) :
HttpInterceptor {
override suspend fun intercept(request: HttpRequest, chain: HttpInterceptorChain): HttpResponse {
return chain.proceed(
request
.newBuilder()
.addHeader("Authorization", ...)
.build()
)
}
}
mbonnin
09/05/2022, 7:56 AMExecutionContext
is not documented a lot, it's mostly used internally. It works the same as CoroutineContext
, it's a type-safe map-like APImbonnin
09/05/2022, 7:57 AMDefaultNetorkTransport
to transfer that information from the HTTP layer to the GraphQL layer. 2min, I'll try to make an examplembonnin
09/05/2022, 8:09 AMclass RequestHeaders(
val headers: List<HttpHeader>
): ExecutionContext.Element {
override val key: ExecutionContext.Key<*>
get() = Key
companion object Key : ExecutionContext.Key<RequestHeaders>
}
class MyNetworkTransport(serverUrl: String): NetworkTransport {
private val httpRequestComposer = DefaultHttpRequestComposer(serverUrl)
private val delegate = HttpNetworkTransport.Builder()
.serverUrl(serverUrl)
.httpEngine(DefaultHttpEngine())
.build()
override fun <D : Operation.Data> execute(request: ApolloRequest<D>): Flow<ApolloResponse<D>> {
val customScalarAdapters = request.executionContext[CustomScalarAdapters]!!
val httpRequest = httpRequestComposer.compose(request)
return delegate.execute(request, httpRequest, customScalarAdapters).map {
it.newBuilder()
.addExecutionContext(RequestHeaders(httpRequest.headers))
.build()
}
}
override fun dispose() {
delegate.dispose()
}
}
@Test
fun executionContext() = runTest {
val mockServer = MockServer()
val apolloClient = ApolloClient.Builder()
.networkTransport(MyNetworkTransport(mockServer.url()))
.build()
apolloClient.query(EpisodeHeroNameQuery(Episode.EMPIRE))
}
mbonnin
09/05/2022, 8:10 AMJan Skrasek
09/05/2022, 8:22 AMmbonnin
09/05/2022, 8:23 AMHttpRequest.body
longer than needed. This is a non-trivial object (contains an Okio source, etc...) so it might take some memorymbonnin
09/05/2022, 8:24 AMJan Skrasek
09/05/2022, 8:28 AMmbonnin
09/05/2022, 8:29 AMmbonnin
09/05/2022, 8:30 AMJan Skrasek
09/05/2022, 8:30 AMmbonnin
09/05/2022, 8:30 AMmbonnin
09/05/2022, 8:30 AMmbonnin
09/05/2022, 8:31 AMmbonnin
09/05/2022, 8:31 AMJan Skrasek
09/05/2022, 8:31 AMmbonnin
09/05/2022, 8:31 AMhttpRequest
completelyJan Skrasek
09/05/2022, 8:32 AMmbonnin
09/05/2022, 8:32 AM