So say I'm looking for a random reddit post via something like:
https://www.reddit.com/r/EarthPorn/random/.json
And I get a 302 redirect to something like:
https://www.reddit.com/r/EarthPorn/comments/3viwq1/mj枚lkeviken_sweden_3246x2448_oc/.json which gets stored in the "Location" header.
Notice the umlaut. It causes the IllegalArgumentException.
So I see that this was announced as part of the 2.5 release: "OkHttp now rejects request headers that contain invalid characters". And I think that is good as default behavior but it would be nice to be able to sanitize the headers before the request chain is errored out completely.
I can't use a network interceptor to solve this problem:
client.networkInterceptors().add(object : Interceptor {
override fun intercept(chain: Interceptor.Chain?): Response? {
var req = chain?.request()
//The request headers are all valid
return chain?.proceed(req)?.let { //BOOM!!! The crash happens in proceed
//This is where we would fix the headers if we could
it
}
}
})
My stack trace looks like:
fail
java.lang.IllegalArgumentException: Unexpected char 0xf6 at 53 in header value: https://www.reddit.com/r/EarthPorn/comments/3viwq1/mj枚lkeviken_sweden_3246x2448_oc/.json
at com.squareup.okhttp.Headers$Builder.checkNameAndValue(Headers.java:295)
at com.squareup.okhttp.Headers$Builder.add(Headers.java:245)
at com.squareup.okhttp.internal.http.FramedTransport.readSpdy3HeadersList(FramedTransport.java:229)
at com.squareup.okhttp.internal.http.FramedTransport.readResponseHeaders(FramedTransport.java:142)
at com.squareup.okhttp.internal.http.HttpEngine.readNetworkResponse(HttpEngine.java:909)
at com.squareup.okhttp.internal.http.HttpEngine.access$300(HttpEngine.java:93)
at com.squareup.okhttp.internal.http.HttpEngine$NetworkInterceptorChain.proceed(HttpEngine.java:894)
at com.hotpodata.baconforkotlin.RedditSessionService$genService$1.intercept(RedditSessionService.kt:73)
Yup, real problem. Will fix.
Same in my case
12-13 12:01:16.269 23912-23999/com.namshi.android.rel D/Retrofit: Cookie: identity=aWRlbnRpdHk9ZXlKaGJHY2lPaUpTVXpJMU5pSXNJblI1Y0NJNklrcFhVeUo5LmV5SjFjMlZ5Ym1G
dFpTSTZJblpoYkdWeWFYVXVkSFZ5WTJGdVFIbHZjR1Z6Ynk1amIyMGlMQ0p5YjJ4bGN5STZXeUpT
VDB4RlgwTlZVMVJQVFVWU0lpd2lVazlNUlY5RFZWTlVUMDFGVWlKZExDSmpkWE4wYjIxbGNrbGtJ
am8yTWpJM09UZ3NJbVY0Y0NJNklqRTBOVFE0TXpreU16UWlMQ0pwWVhRaU9pSXhORFE1TmpVMU1q
TTBJbjAuSFVfaDZ3a25hcXpnNnBfNFh5T3c5aEFhSFctZmFkMlllRVd5Wm9HVHEzZ0s0d0hTQXJ3
NmE2cWV3SFVLNFJUT0dRaVZWN1ljZDNhQi1xLUNjb1NzNHhwTjh4MjJfa2lLdFFqcWFuVlowN3VH
ZWFXXy05MjVwakFXSmVvWE9CVlFncU1sTkJMUUQ3WTRDc00tSEdONjFCSWlZZzdTZ0h4bTAxWnFz
WTdxRE4wOyBleHBpcmVzPVN1biwgMDctRmViLTIwMTYgMTA6MDA6MzQgR01UOyBNYXgtQWdlPTUx
ODQwMDA7IHBhdGg9LzsgZG9tYWluPS5uYW1zaGkuY29tOyBzZWN1cmU7IGh0dHBvbmx5
12-13 12:01:16.269 23912-23999/com.namshi.android.rel D/Retrofit: N-Locale: en_AE
12-13 12:01:16.269 23912-23999/com.namshi.android.rel D/Retrofit: N-App: some app
12-13 12:01:16.269 23912-23999/com.namshi.android.rel D/Retrofit: N-Device: mobile
12-13 12:01:16.269 23912-23999/com.namshi.android.rel D/Retrofit: N-Build: 2.10.1
12-13 12:01:16.269 23912-23999/com.namshi.android.rel D/Retrofit: N-Platform: android
12-13 12:01:16.269 23912-23999/com.namshi.android.rel D/Retrofit: ---> END HTTP (no body)
12-13 12:01:16.286 23912-23999/com.namshi.android.rel D/Retrofit: ---- ERROR https://api.namshi.com/rose/u/_meta/config-apps-8
12-13 12:01:16.287 23912-23999/com.namshi.android.rel D/Retrofit: java.lang.IllegalArgumentException: Unexpected char 0x0a at 85 in header value: identity=aWRlbnRpdHk9ZXlKaGJHY2lPaUpTVXpJMU5pSXNJblI1Y0NJNklrcFhVeUo5LmV5SjFjMlZ5Ym1G
dFpTSTZJblpoYkdWeWFYVXVkSFZ5WTJGdVFIbHZjR1Z6Ynk1amIyMGlMQ0p5YjJ4bGN5STZXeUpT
VDB4RlgwTlZVMVJQVFVWU0lpd2lVazlNUlY5RFZWTlVUMDFGVWlKZExDSmpkWE4wYjIxbGNrbGtJ
am8yTWpJM09UZ3NJbVY0Y0NJNklqRTBOVFE0TXpreU16UWlMQ0pwWVhRaU9pSXhORFE1TmpVMU1q
TTBJbjAuSFVfaDZ3a25hcXpnNnBfNFh5T3c5aEFhSFctZmFkMlllRVd5Wm9HVHEzZ0s0d0hTQXJ3
NmE2cWV3SFVLNFJUT0dRaVZWN1ljZDNhQi1xLUNjb1NzNHhwTjh4MjJfa2lLdFFqcWFuVlowN3VH
ZWFXXy05MjVwakFXSmVvWE9CVlFncU1sTkJMUUQ3WTRDc00tSEdONjFCSWlZZzdTZ0h4bTAxWnFz
WTdxRE4wOyBleHBpcmVzPVN1biwgMDctRmViLTIwMTYgMTA6MDA6MzQgR01UOyBNYXgtQWdlPTUx
ODQwMDA7IHBhdGg9LzsgZG9tYWluPS5uYW1zaGkuY29tOyBzZWN1cmU7IGh0dHBvbmx5
at com.squareup.okhttp.Headers$Builder.checkNameAndValue(Headers.java:295)
at com.squareup.okhttp.Headers$Builder.add(Headers.java:245)
at com.squareup.okhttp.Request$Builder.addHeader(Request.java:194)
at retrofit.client.OkClient.createRequest(OkClient.java:66)
at retrofit.client.OkClient.execute(OkClient.java:53)
at com.namshi.android.api.singletons.AppRetrofitClient.execute(AppRetrofitClient.java:99)
at com.newrelic.agent.android.instrumentation.retrofit.ClientExtension.execute(ClientExtension.java:45)
at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:326)
at retrofit.RestAdapter$RestHandler.access$100(RestAdapter.java:220)
at retrofit.RestAdapter$RestHandler$2.obtainResponse(RestAdapter.java:278)
at retrofit.CallbackRunnable.run(CallbackRunnable.java:42)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
at retrofit.Platform$Android$2$1.run(Platform.java:142)
at java.lang.Thread.run(Thread.java:818)
12-13 12:01:16.287 23912-23999/com.namshi.android.rel D/Retrofit: ---- END ERROR
I'm running in the same problem. Is there any progress so far?
Since the HTTP spec actually does not disallow other characters, the http client should not disallow such usage either. Currently if the server wants such a header (shame if so, but actually nothing against it), there is no way to work with that backend at the moment, right?
Yep. We're gonna fix this.
Most helpful comment
Yup, real problem. Will fix.