Faraday: القدرة على تجاهل إعدادات الوكيل env لاتصال واحد

تم إنشاؤها على ٢٢ أغسطس ٢٠١٩  ·  3تعليقات  ·  مصدر: lostisland/faraday

معلومات أساسية

  • إصدار فاراداي: 0.15.4
  • إصدار روبي: 2.4.3.2

وصف المشكلة

نحن نشغل تطبيقًا كبيرًا جدًا يحتوي على مئات المكونات الفرعية التي تستخدم 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 ) من شأنه أن يحل هذه المشكلة تمامًا بالنسبة لي.

info

التعليق الأكثر فائدة

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 بعد الإنشاء.

ال 3 كومينتر

@ 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 ). افترضت أن هذا هو الحال بالنظر إلى المحاولات التي ذكرتها في منشورك الأول.

سعيد لسماع نجاح اقتراحي ولديك أيضًا برمجيات وسيطة مخصصة لحالات أخرى.
سأغلق هذه المشكلة ولكن يرجى التواصل إذا كنت لا تزال بحاجة إلى أي مساعدة 😄

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات

القضايا ذات الصلة

mokolabs picture mokolabs  ·  3تعليقات

ioquatix picture ioquatix  ·  4تعليقات

jordansissel picture jordansissel  ·  5تعليقات

t3hk0d3 picture t3hk0d3  ·  3تعليقات

Lewiscowles1986 picture Lewiscowles1986  ·  4تعليقات