#retrofit #retrofit2 #okhttp
Вопрос:
Я расследую проблему, которая начала возникать в нашем приложении, которое настраивает прокси-сервер файлов pac на устройстве. Одна вещь, которую я заметил, заключается в том, что до того, как это начало происходить, мы увеличили версию дооснащения с 2.6.0 до 2.9.0, в которой используется OHTTP3. Я понимаю общую основную причину, и это то, что okhttp пытается подчиняться системным настройкам и пытается подключиться к прокси-серверу, указанному устройством. Но наш прокси-сервер настроен с использованием URL-адреса файла pac, а не статического хоста с портом.
Трассировка проблемы:
Fatal Exception: java.lang.IllegalArgumentException: port out of range:-1
at java.net.InetSocketAddress.checkPort(InetSocketAddress.java:144)
at java.net.InetSocketAddress.createUnresolved(InetSocketAddress.java:269)
at sun.net.spi.DefaultProxySelector$1.run(DefaultProxySelector.java:315)
at sun.net.spi.DefaultProxySelector$1.run(DefaultProxySelector.java:219)
at java.security.AccessController.doPrivileged(AccessController.java:43)
at sun.net.spi.DefaultProxySelector.select(DefaultProxySelector.java:218)
at okhttp3.internal.connection.RouteSelector$resetNextProxy$1.invoke(RouteSelector.java:106)
at okhttp3.internal.connection.RouteSelector.resetNextProxy(RouteSelector.java:113)
at okhttp3.internal.connection.RouteSelector.<init>(RouteSelector.java:53)
at okhttp3.internal.connection.ExchangeFinder.findConnection(ExchangeFinder.java:209)
at okhttp3.internal.connection.ExchangeFinder.findHealthyConnection(ExchangeFinder.java:108)
at okhttp3.internal.connection.ExchangeFinder.find(ExchangeFinder.java:76)
at okhttp3.internal.connection.RealCall.initExchange$okhttp(RealCall.java:245)
at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.java:32)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:100)
at okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.java:96)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:100)
at okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.java:83)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:100)
at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.java:76)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:100)
Я ищу какой-нибудь намек на то, что может быть причиной этой проблемы.
Это может быть ошибка в библиотеке, так как все, похоже, ведет к обновлению, но я открыт для любых предложений. Похоже, это не связано с какой-либо версией Android, исправлением безопасности, моделью устройства или чем-либо в этом роде.
Комментарии:
1. Если вы достанете файл pac (это javascript), он будет выглядеть нормально? Что
System.out.println(ProxySelector.getDefault().select(URI.create("your url")));
возвращается?2. Эта проблема возникает только в Crashlytics, и я не могу ее воспроизвести, поэтому, должно быть, это какой-то крайний случай, вызывающий ужасные вещи. Я все равно попробовал то, что ты предложил. Когда запрос проксируется, в журнале записывается «HTTP @ localhost:34930», где запускается прокси-служба. То же самое можно получить из системных свойств «HttpProxy: локальный хост httpPort:37985». Если прокси-сервер не настроен, в журнале указывается «ПРЯМОЙ», а системные свойства: «HttpProxy: httpPort:0». Все это происходит из-за моего тестирования, когда я не могу воспроизвести проблему.
3. Похоже, что это может быть даже неправильно настроенная конфигурация сети на каком-то случайном рабочем месте
4. не было бы лучше, если бы OHTTP не создавал исключений в таких случаях, а скорее игнорировал настройки прокси-сервера?
5. OHTTP, как правило, будет полагаться на хорошо зарекомендовавшие себя реализации системных интерфейсов. Вы можете обернуть API ProxySelector и передать его в OkHttp. Вероятно, стоит обрабатывать это только в каждой HTTP-платформе, если это что-то вроде, вероятно, во встроенной версии Android, которую невозможно исправить.