Faraday: Kemampuan untuk mengabaikan pengaturan proxy env untuk satu koneksi

Dibuat pada 22 Agu 2019  ·  3Komentar  ·  Sumber: lostisland/faraday

Info dasar

  • Versi Faraday: 0.15.4
  • Versi Ruby: 2.4.3

Deskripsi masalah

Kami menjalankan aplikasi yang cukup besar dengan ratusan sub-komponen yang menggunakan Faraday sampai batas tertentu. Sebagian besar komponen ini berharap untuk mengkonfigurasi Faraday dengan variabel lingkungan http_proxy dan seterusnya; mereka tidak meneruskan pengaturan :proxy eksplisit ke konstruktor koneksi.

Beberapa komponen (2 atau 3 dari sekitar 100), bagaimanapun, harus menggunakan koneksi Faraday tanpa proxy. Itu berarti kita tidak dapat menggunakan Faraday.ignore_env_proxy = true , jika tidak ~100 komponen yang tersisa akan rusak.

Yang ingin saya miliki adalah cara agar beberapa komponen tersebut dapat membuat objek koneksi Faraday yang tidak menggunakan proxy, baik dari lingkungan maupun sebaliknya.

Langkah-langkah untuk mereproduksi

Mirip dengan #752, ini menghasilkan objek faraday yang akan menggunakan pengaturan proxy dari lingkungan saat membuat koneksi:

c = Faraday.new('https://www.google.com', proxy: nil)

Saya juga mencoba menjadi Sangat Cerdas dan melewatkan hash kosong sebagai Opsi Proxy, seperti:

c = Faraday.new('https://www.google.com', proxy: {})

tetapi menggunakan kesalahan koneksi ini dengan:

NoMethodError: undefined method `hostname' for nil:NilClass
from vendor/bundle/ruby/2.4.0/gems/faraday-0.15.4/lib/faraday/adapter/net_http.rb:97:in `net_http_connection'

Saya percaya ini (atau cara lain untuk mengatakan "jangan gunakan proxy" melalui pengaturan :proxy ) didukung akan sepenuhnya menyelesaikan masalah ini untuk saya.

info

Komentar yang paling membantu

OMG, itu pasti solusi. Apa yang kami lakukan sejauh ini adalah middleware seperti ini (untuk penggunaan Octokit kami):

    # A Faraday middleware that throws out any configured proxy away
    # from the request environment, to make connections to GHE work
    # (those must not be proxied).
    class ProxyDroppingMiddleware < Faraday::Middleware
      def call(request_env)
        request_env[:request][:proxy] = nil
        @app.call(request_env)
      end
    end

Dan kemudian, ketika tiba saatnya untuk menginisialisasi octokit:

        stack = Faraday::RackBuilder.new do |builder|
          builder.use ProxyDroppingMiddleware
          # What follows is the default octokit middleware:
          builder.use Faraday::Request::Retry, exceptions: [Octokit::ServerError]
          builder.use Octokit::Middleware::FollowRedirects
          builder.use Octokit::Response::RaiseError
          builder.use Octokit::Response::FeedParser
          builder.adapter Faraday.default_adapter
        end
        options[:middleware] = stack

Dari apa yang saya tahu, penyelesaian middleware akan bekerja lebih baik dengan octokit, jika tidak, kita harus membuat pembungkus octokit untuk menambal objek Faraday setelah pembuatan.

Semua 3 komentar

@asf-stripe Saya belum pernah mencoba melakukan ini (biasanya semua atau tidak sama sekali), tetapi saya pikir Anda dapat mencoba mengatur proxy ke nil SETELAH inisialisasi koneksi dengan setter (https://github.com/lostisland/faraday/blob /master/lib/faraday/connection.rb#L397)

c = Faraday.new('https://www.google.com')
c.proxy = nil

Ini harus mengatur env @manual_proxy menjadi true dan memaksa Faraday untuk mengabaikan env untuk koneksi tertentu.
Tolong beri tahu saya jika itu berhasil

OMG, itu pasti solusi. Apa yang kami lakukan sejauh ini adalah middleware seperti ini (untuk penggunaan Octokit kami):

    # A Faraday middleware that throws out any configured proxy away
    # from the request environment, to make connections to GHE work
    # (those must not be proxied).
    class ProxyDroppingMiddleware < Faraday::Middleware
      def call(request_env)
        request_env[:request][:proxy] = nil
        @app.call(request_env)
      end
    end

Dan kemudian, ketika tiba saatnya untuk menginisialisasi octokit:

        stack = Faraday::RackBuilder.new do |builder|
          builder.use ProxyDroppingMiddleware
          # What follows is the default octokit middleware:
          builder.use Faraday::Request::Retry, exceptions: [Octokit::ServerError]
          builder.use Octokit::Middleware::FollowRedirects
          builder.use Octokit::Response::RaiseError
          builder.use Octokit::Response::FeedParser
          builder.adapter Faraday.default_adapter
        end
        options[:middleware] = stack

Dari apa yang saya tahu, penyelesaian middleware akan bekerja lebih baik dengan octokit, jika tidak, kita harus membuat pembungkus octokit untuk menambal objek Faraday setelah pembuatan.

Ah ya, solusi saya hanya berfungsi jika Anda memiliki akses ke koneksi yang sebenarnya (baik menggunakan pembungkus atau hal-hal seperti instance_variable_get ). Saya berasumsi bahwa itulah yang terjadi dengan melihat upaya yang Anda sebutkan di posting pertama Anda.

Senang mendengar saran saya berhasil dan Anda bahkan memiliki middleware khusus untuk kasus lain.
Saya akan menutup masalah ini, tetapi harap hubungi jika Anda masih membutuhkan bantuan

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

mokolabs picture mokolabs  ·  3Komentar

JasonBarnabe picture JasonBarnabe  ·  4Komentar

iMacTia picture iMacTia  ·  3Komentar

QuinnWilton picture QuinnWilton  ·  4Komentar

jordansissel picture jordansissel  ·  5Komentar