Порт исключения IllegalArgumentException вне зоны действия: -1 в перехватчиках дооснащения

#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, которую невозможно исправить.