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.
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.
@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
Komentar yang paling membantu
OMG, itu pasti solusi. Apa yang kami lakukan sejauh ini adalah middleware seperti ini (untuk penggunaan Octokit kami):
Dan kemudian, ketika tiba saatnya untuk menginisialisasi octokit:
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.