Cegah OkHttp/Retrofit melewati proksi

Saat OkHttp mencoba proxy, dan rute tersebut gagal satu kali, setiap permintaan setelah permintaan tersebut akan sepenuhnya melewati proxy sistem Android. Jadi sulit untuk melakukan debug menggunakan Charles.

Saat ini saya memiliki kode di bawah ini, tetapi ini diatur hanya untuk build Debug. Ini berfungsi dengan baik, tetapi ini adalah peretasan, dan kami berencana merilisnya untuk semua pengguna.

Apakah ada pengaturan OkHttpClient.dontBypassProxy tersembunyi yang tidak dapat saya temukan? Atau, apakah kode di bawah ini terlihat seperti solusi yang bagus?

    OkHttpClient.Builder baseClientBuilder = new OkHttpClient.Builder().retryOnConnectionFailure(false).connectionPool(new ConnectionPool(5, 20, TimeUnit.SECONDS));

    //Ask OkHttp what proxies we have setup
    List<Proxy> proxies = ProxySelector.getDefault().select(URI.create("http://www.somesite.com"));

    if (proxies.size() > 0 && proxies.get(0) != Proxy.NO_PROXY) {
        //Force OkHttp to always use this proxy
        baseClientBuilder.proxy(proxies.get(0));
    }

person Mike Odie    schedule 20.04.2016    source sumber
comment
Hanya ingin tahu: apakah ini hanya menjadi masalah jika Anda memiliki dua proxy?   -  person Jesse Wilson    schedule 21.04.2016
comment
Itu hanya satu proksi. Saya bahkan tidak tahu cara menambahkan dua proxy di Android. Jadi itu sebabnya peretasannya adalah untuk mengambil proxy pertama yang dilihatnya.   -  person Mike Odie    schedule 22.04.2016
comment
Bisakah Anda mengisolasi ini ke dalam test case yang gagal? Berikut contohnya: gist.github.com/swankjesse/981fcae102f513eb13ed   -  person Jesse Wilson    schedule 24.04.2016
comment
Tentu, ini contoh kasusnya. testForceProxy menggunakan peretasan proxy paksa saya, sehingga lolos karena proxy tidak dilewati. Sedangkan testBypassProxy menggunakan pemilih proxy. Jadi gagal tesnya, karena proxy di-bypass dan koneksi berhasil. Di testBypassProxy, saya ingin memberi tahu klien untuk menggunakan proxy jika ada, dan tidak mencoba rute lain. pastebin.com/iSCYwXmQ   -  person Mike Odie    schedule 25.04.2016
comment
Saya memiliki masalah yang sama. Setiap detik percobaan permintaan yang sama melewati proxy. Saya menggunakan v3.2.0   -  person sat    schedule 25.04.2016
comment
@MikeOdie ini berfungsi sesuai desain, meskipun ada kemungkinan kami dapat mengubah desainnya. Perilaku ProxySelector diwarisi dari HttpURLConnection, yang dapat Anda verifikasi dengan pengujian ini: gist.github.com/swankjesse /240132f0d750a05d0380f32f7f822531 Jika Anda ingin memulai diskusi tentang pelacak masalah OkHttp, silakan lakukan.   -  person Jesse Wilson    schedule 26.04.2016
comment
Oke, bagus, terima kasih. Saya melihat apa yang dilakukan HttpURLConnection. Saya akan mengajukan permintaan fitur. Sementara itu, apakah menurut Anda peretasan saya baik-baik saja? Ini berfungsi dengan baik di internal, tapi saya tidak yakin apakah sudah siap untuk ditayangkan. https://github.com/square/okhttp/issues/2525   -  person Mike Odie    schedule 29.04.2016


Jawaban (1)


Ini telah diperbaiki di OkHttp 3.5.0

https://square.github.io/okhttp/changelog_3x/

OkHttp tidak lagi mencoba koneksi langsung jika proksi HTTP sistem gagal. Perilaku ini mengejutkan karena OkHttp mengabaikan konfigurasi yang ditentukan pengguna. Jika Anda perlu menyesuaikan perilaku fallback proxy, terapkan java.net.ProxySelector Anda sendiri.

person Yuri Schimke    schedule 08.12.2019