نحن نشغل تطبيقًا كبيرًا جدًا يحتوي على مئات المكونات الفرعية التي تستخدم Faraday إلى حد ما. تتوقع معظم هذه المكونات تكوين Faraday بمتغيرات البيئة http_proxy
وما إلى ذلك ؛ إنهم لا يمررون إعداد :proxy
صريحًا لمنشئي الاتصال.
ومع ذلك ، يجب أن تستخدم بعض المكونات (2 أو 3 من حوالي 100) اتصال فاراداي بدون وكيل. هذا يعني أنه لا يمكننا استخدام Faraday.ignore_env_proxy = true
، وإلا فإن العناصر الـ 100 المتبقية تنكسر.
ما أرغب في امتلاكه هو طريقة لتلك المكونات القليلة لتكون قادرة على إنشاء كائن اتصال فاراداي لا يستخدم وكيلًا ، لا من البيئة ولا غير ذلك.
على غرار # 752 ، ينتج عن هذا كائن faraday الذي سيستخدم إعدادات الوكيل من البيئة عند إجراء الاتصالات:
c = Faraday.new('https://www.google.com', proxy: nil)
حاولت أيضًا أن أكون ذكيًا جدًا وتمرير تجزئة فارغة كخيارات الوكيل بدلاً من ذلك ، مثل:
c = Faraday.new('https://www.google.com', proxy: {})
لكن باستخدام أخطاء الاتصال هذه مع:
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'
أعتقد أن الحصول على هذا الدعم (أو طريقة أخرى للقول "لا تستخدم وكيلاً" عبر إعدادات :proxy
) من شأنه أن يحل هذه المشكلة تمامًا بالنسبة لي.
@ asf-stripe لم أحاول القيام بذلك مطلقًا (عادةً ما يكون كل شيء أو لا شيء) ، لكن أعتقد أنه يمكنك محاولة تعيين الوكيل على صفر بعد تهيئة الاتصال باستخدام أداة الضبط (https://github.com/lostisland/faraday/blob /master/lib/faraday/connection.rb#L397)
c = Faraday.new('https://www.google.com')
c.proxy = nil
يجب أن يؤدي هذا إلى ضبط القيمة @manual_proxy
env على true وإجبار Faraday على تجاهل env لهذا الاتصال المعين.
واسمحوا لي أن أعرف إذا كان هذا يعمل 😄
OMG ، هذا بالتأكيد حل بديل. ما فعلناه حتى الآن هو برنامج وسيط مثل هذا (لاستخدامنا لـ Octokit):
# 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
وبعد ذلك ، عندما يحين وقت تهيئة 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
مما يمكنني قوله ، سيعمل حل البرنامج الوسيط بشكل أفضل مع octokit ، وإلا فسنضطر إلى صنع غلاف octokit لتصحيح كائن Faraday بعد الإنشاء.
نعم ، لا يعمل الحل الخاص بي إلا إذا كان لديك وصول إلى الاتصال الفعلي (إما باستخدام غلاف أو أشياء مثل instance_variable_get
). افترضت أن هذا هو الحال بالنظر إلى المحاولات التي ذكرتها في منشورك الأول.
سعيد لسماع نجاح اقتراحي ولديك أيضًا برمجيات وسيطة مخصصة لحالات أخرى.
سأغلق هذه المشكلة ولكن يرجى التواصل إذا كنت لا تزال بحاجة إلى أي مساعدة 😄
التعليق الأكثر فائدة
OMG ، هذا بالتأكيد حل بديل. ما فعلناه حتى الآن هو برنامج وسيط مثل هذا (لاستخدامنا لـ Octokit):
وبعد ذلك ، عندما يحين وقت تهيئة octokit:
مما يمكنني قوله ، سيعمل حل البرنامج الوسيط بشكل أفضل مع octokit ، وإلا فسنضطر إلى صنع غلاف octokit لتصحيح كائن Faraday بعد الإنشاء.