ป้องกัน OkHttp/Retrofit จากการข้ามพร็อกซี

เมื่อ OkHttp ลองใช้พร็อกซี และเส้นทางนั้นล้มเหลวหนึ่งครั้ง ทุกคำขอหลังจากคำขอนั้นจะข้ามพร็อกซีระบบ Android โดยสมบูรณ์ ดังนั้นจึงเป็นเรื่องยากที่จะดีบักโดยใช้ Charles

ขณะนี้ฉันมีโค้ดด้านล่าง แต่มีการตั้งค่าไว้สำหรับรุ่น Debug เท่านั้น มันใช้งานได้ดี แต่เป็นการแฮ็ก และเรากำลังเตรียมที่จะเผยแพร่สิ่งนี้ให้กับผู้ใช้ทุกคน

มีการตั้งค่า OkHttpClient.dontBypassProxy ที่ซ่อนอยู่ซึ่งฉันหาไม่พบหรือไม่ หรือโค้ดด้านล่างดูเหมือนเป็นวิธีแก้ปัญหาที่ดี?

    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 แหล่งที่มา
comment
แค่อยากรู้อยากเห็น: นี่เป็นปัญหาเมื่อคุณมีผู้รับมอบฉันทะสองคนหรือไม่?   -  person Jesse Wilson    schedule 21.04.2016
comment
มันเป็นเพียงตัวแทนเดียว ฉันไม่รู้วิธีเพิ่มพรอกซีสองตัวใน Android นั่นคือสาเหตุที่แฮ็คต้องคว้าพร็อกซีตัวแรกที่เห็น   -  person Mike Odie    schedule 22.04.2016
comment
คุณสามารถแยกสิ่งนี้ออกเป็นกรณีทดสอบที่ล้มเหลวได้หรือไม่? ตัวอย่าง: gist.github.com/swankjesse/981fcae102f513eb13ed   -  person Jesse Wilson    schedule 24.04.2016
comment
แน่นอนว่านี่คือกรณีทดสอบ testForceProxy ใช้การบังคับแฮ็กพร็อกซีของฉัน ดังนั้นจึงผ่านได้เนื่องจากพร็อกซีไม่ได้ถูกข้าม ในขณะที่ testBypassProxy ใช้ตัวเลือกพร็อกซี ดังนั้นจึงล้มเหลวในการทดสอบ เนื่องจากพร็อกซีถูกข้ามและการเชื่อมต่อสำเร็จ ใน testBypassProxy ฉันต้องการบอกไคลเอ็นต์ให้ใช้พรอกซีหากมีอยู่ และอย่าลองใช้เส้นทางอื่น pastebin.com/iSCYwXmQ   -  person Mike Odie    schedule 25.04.2016
comment
ฉันมีปัญหาเดียวกัน ทุก ๆ วินาทีที่พยายามร้องขอเดียวกันจะข้ามพรอกซี ฉันใช้เวอร์ชัน 3.2.0   -  person sat    schedule 25.04.2016
comment
@MikeOdie สิ่งนี้ใช้งานได้ตามที่ออกแบบไว้ แม้ว่าจะเป็นไปได้ที่เราสามารถเปลี่ยนการออกแบบได้ ลักษณะการทำงานของ ProxySelector สืบทอดมาจาก HttpURLConnection ซึ่งคุณสามารถตรวจสอบได้ด้วยการทดสอบนี้: gist.github.com/swankjesse /240132f0d750a05d0380f32f7f822531 หากคุณต้องการเริ่มการสนทนาเกี่ยวกับเครื่องมือติดตามปัญหาของ OkHttp โปรดดำเนินการ   -  person Jesse Wilson    schedule 26.04.2016
comment
โอเค เยี่ยมเลย ขอบคุณ ฉันเห็นว่า HttpURLConnection กำลังทำอะไรอยู่ ฉันจะยื่นคำขอคุณสมบัติ ในระหว่างนี้ คุณคิดว่าแฮ็คของฉันดูโอเคไหม? ใช้งานได้ดีในบ้าน แต่ฉันไม่แน่ใจว่าพร้อมถ่ายทอดสดหรือไม่ https://github.com/square/okhttp/issues/2525   -  person Mike Odie    schedule 29.04.2016


คำตอบ (1)


สิ่งนี้ได้รับการแก้ไขแล้วใน OkHttp 3.5.0

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

OkHttp จะไม่พยายามเชื่อมต่อโดยตรงอีกต่อไปหากพร็อกซี HTTP ของระบบล้มเหลว พฤติกรรมนี้น่าประหลาดใจเนื่องจาก OkHttp ไม่สนใจการกำหนดค่าที่ระบุของผู้ใช้ หากคุณต้องการปรับแต่งพฤติกรรมทางเลือกของพร็อกซี ให้ใช้ java.net.ProxySelector ของคุณเอง

person Yuri Schimke    schedule 08.12.2019