Faraday: Möglichkeit, env-Proxy-Einstellungen für eine einzelne Verbindung zu ignorieren

Erstellt am 22. Aug. 2019  ·  3Kommentare  ·  Quelle: lostisland/faraday

Basisinformation

  • Faraday-Version: 0.15.4
  • Ruby-Version: 2.4.3

Fehlerbeschreibung

Wir betreiben eine ziemlich große App mit Hunderten von Unterkomponenten, die bis zu einem gewissen Grad Faraday verwenden. Die meisten dieser Komponenten erwarten, Faraday mit den Umgebungsvariablen http_proxy und so weiter zu konfigurieren; Sie übergeben keine explizite :proxy -Einstellung an die Verbindungskonstruktoren.

Einige Komponenten (2 oder 3 von etwa 100) müssen jedoch eine Faraday-Verbindung ohne Proxy verwenden. Das bedeutet, dass wir Faraday.ignore_env_proxy = true nicht verwenden können, da sonst die verbleibenden ~100 Komponenten kaputt gehen.

Was ich gerne hätte, ist eine Möglichkeit für diese wenigen Komponenten, ein Faraday-Verbindungsobjekt zu erstellen, das keinen Proxy verwendet, weder aus der Umgebung noch anderweitig.

Schritte zum Reproduzieren

Ähnlich wie bei #752 ergibt dies ein Faraday-Objekt, das die Proxy-Einstellungen aus der Umgebung verwendet, wenn es Verbindungen herstellt:

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

Ich habe auch versucht, Very Smart zu sein und stattdessen einen leeren Hash als Proxy-Optionen zu übergeben, etwa so:

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

aber mit diesen Verbindungsfehlern mit:

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'

Ich glaube, wenn dies (oder eine andere Art zu sagen "keinen Proxy verwenden" über :proxy -Einstellungen) unterstützt wird, würde dieses Problem für mich vollständig gelöst.

info

Hilfreichster Kommentar

OMG, das ist definitiv ein Workaround. Was wir bisher gemacht haben, war eine Middleware wie diese (für unsere Verwendung von 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

Und dann, wenn es an der Zeit ist, Octokit zu initialisieren:

        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

Soweit ich das beurteilen kann, funktioniert der Middleware-Workaround besser mit Octokit, andernfalls müssten wir einen Octokit-Wrapper erstellen, um das Faraday-Objekt nach der Erstellung zu patchen.

Alle 3 Kommentare

@asf-stripe Ich habe das noch nie versucht (es ist normalerweise alles oder nichts), aber ich denke, Sie können versuchen, den Proxy NACH der Verbindungsinitialisierung mit dem Setter (https://github.com/lostisland/faraday/blob /master/lib/faraday/connection.rb#L397)

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

Dies sollte die @manual_proxy env auf true setzen und Faraday dazu zwingen, die env für diese bestimmte Verbindung zu ignorieren.
Bitte lassen Sie mich wissen, ob das funktioniert 😄

OMG, das ist definitiv ein Workaround. Was wir bisher gemacht haben, war eine Middleware wie diese (für unsere Verwendung von 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

Und dann, wenn es an der Zeit ist, Octokit zu initialisieren:

        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

Soweit ich das beurteilen kann, funktioniert der Middleware-Workaround besser mit Octokit, andernfalls müssten wir einen Octokit-Wrapper erstellen, um das Faraday-Objekt nach der Erstellung zu patchen.

Ah ja, meine Lösung funktioniert nur, wenn Sie Zugriff auf die eigentliche Verbindung haben (entweder mit einem Wrapper oder Dingen wie instance_variable_get ). Ich bin davon ausgegangen, dass dies der Fall ist, wenn ich die Versuche betrachte, die Sie in Ihrem ersten Beitrag erwähnt haben.

Freut mich zu hören, dass mein Vorschlag funktioniert und Sie sogar eine benutzerdefinierte Middleware für andere Fälle haben.
Ich werde dieses Problem schließen, aber bitte melde dich, wenn du noch Hilfe benötigst 😄

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen