'Xamarin Android. Socket closed when using Refit with Cancellation token
I have project written in Xamarin Forms. Recently i had to adjust my project to instead of using HttpClient use Xamarin.Android.Net.AndroidClientHandler (native android) because some SSL problems. In my app to do http calls i use Refit. To every method Refit interface declaration I add CancellationToken as parameter. Right now since im using native android http client, refit is also using one. And here is my problem.
Example http call in my app:var profile = await _usersRepository.GetProfile(userGuid, _cancellationTokenUser.Token);
If im navigating away from viewmodel that calls this method i'm calling _cancellationTokenUser.Cancel(). Im doing this so tcp connection with API shuts down and server doesn't have to process data that is no longer needed. When calling this endpoint first time everything is ok. The second time i call same URL (after i cancelled previous request) i get this exception (on iOS its working fine):
Java.net.SocketException: Socket closed at java.net.SocketInputStream.read(SocketInputStream.java:209) at java.net.SocketInputStream.read(SocketInputStream.java:144) at com.android.org.conscrypt.ConscryptEngineSocket$SSLInputStream.readFromSocket(ConscryptEngineSocket.java:945) at com.android.org.conscrypt.ConscryptEngineSocket$SSLInputStream.processDataFromSocket(ConscryptEngineSocket.java:909) at com.android.org.conscrypt.ConscryptEngineSocket$SSLInputStream.readUntilDataAvailable(ConscryptEngineSocket.java:824) at com.android.org.conscrypt.ConscryptEngineSocket$SSLInputStream.read(ConscryptEngineSocket.java:797) at com.android.okhttp.okio.Okio$2.read(Okio.java:138) at com.android.okhttp.okio.AsyncTimeout$2.read(AsyncTimeout.java:213) at com.android.okhttp.okio.RealBufferedSource.indexOf(RealBufferedSource.java:307) at com.android.okhttp.okio.RealBufferedSource.indexOf(RealBufferedSource.java:301) at com.android.okhttp.okio.RealBufferedSource.readUtf8LineStrict(RealBufferedSource.java:197) at com.android.okhttp.internal.http.Http1xStream.readResponse(Http1xStream.java:188) at com.android.okhttp.internal.http.Http1xStream.readResponseHeaders(Http1xStream.java:129) at com.android.okhttp.internal.http.HttpEngine.readNetworkResponse(HttpEngine.java:750) at com.android.okhttp.internal.http.HttpEngine.readResponse(HttpEngine.java:622) at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:475) at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:411) at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:542) at com.android.okhttp.internal.huc.DelegatingHttpsURLConnection.getResponseCode(DelegatingHttpsURLConnection.java:106) at com.android.okhttp.internal.huc.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:30)
Looks like tcp connection is closed (since i passed to refit cancellation token) and the second time i make request new socket isnt opening but refit(http client?) tries to use old socket that is closed. Did any of you encounter same behaviour?
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|
