Faraday: Faraday и socks прокси с поддержкой авторизации

Созданный на 11 апр. 2018  ·  9Комментарии  ·  Источник: lostisland/faraday

Основная информация

  • Faraday Версия: 0.14, адаптер Net::HTTP
  • Рубиновая версия: 2.3.1

    Описание проблемы

Использование прокси-сервера socks с аутентификацией приводит к Faraday::ConnectionFailed: достигнут конец файла

Действия по воспроизведению

Инициализировать Фарадея

    Faraday.new do |connection|
      connection.proxy = "socks://user:pass<strong i="14">@host</strong>:port"
      connection.adapter Faraday.default_adapter
    end

и сделать любой запрос

feature v1.0

Самый полезный комментарий

я использую драгоценный камень 'socksify'

require "socksify/http"

class Faraday::Adapter::NetHttp
  def net_http_connection(env)
    if (proxy = env[:request][:proxy])
      proxy_class(proxy)
    else
      Net::HTTP
    end.new(env[:url].hostname, env[:url].port || (env[:url].scheme == "https" ? 443 : 80))
  end

  def proxy_class(proxy)
    if proxy.uri.scheme == "socks"
      TCPSocket.socks_username = proxy[:user] if proxy[:user]
      TCPSocket.socks_password = proxy[:password] if proxy[:password]
      Net::HTTP::SOCKSProxy(proxy[:uri].host, proxy[:uri].port)
    else
      Net::HTTP::Proxy(proxy[:uri].host, proxy[:uri].port, proxy[:uri].user, proxy[:uri].password)
    end
  end
end

Все 9 Комментарий

Я смог исправить это с помощью обезьяньей заплатки Faraday::Adapter::NetHttp, но я не уверен, что это было лучшее решение.

Привет @yarafan , спасибо за отчет.
Могу я спросить вас, как вы пропатчили Faraday::Adapter::NetHttp ?

я использую драгоценный камень 'socksify'

require "socksify/http"

class Faraday::Adapter::NetHttp
  def net_http_connection(env)
    if (proxy = env[:request][:proxy])
      proxy_class(proxy)
    else
      Net::HTTP
    end.new(env[:url].hostname, env[:url].port || (env[:url].scheme == "https" ? 443 : 80))
  end

  def proxy_class(proxy)
    if proxy.uri.scheme == "socks"
      TCPSocket.socks_username = proxy[:user] if proxy[:user]
      TCPSocket.socks_password = proxy[:password] if proxy[:password]
      Net::HTTP::SOCKSProxy(proxy[:uri].host, proxy[:uri].port)
    else
      Net::HTTP::Proxy(proxy[:uri].host, proxy[:uri].port, proxy[:uri].user, proxy[:uri].password)
    end
  end
end

@yarafan Понятно , так что в основном Net::HTTP не поддерживает прокси-сервер socks из коробки.
В этом случае я бы не классифицировал это как ошибку, а скорее как запрос функции для поддержки прокси-серверов socks.
Как и любой другой запрос функции, это должно быть решено для всех адаптеров в текущей ветке 0.x, однако для ветки v1.0 мы удаляем все адаптеры из Faraday и оставляем только Net::HTTP.
Самое время представить это 👍

Я обновлю заголовок и назову проблему, если кому-то нужно использовать прокси-серверы socks до этого, они могут использовать ваш обезьяний патч.

Добавить поддержку аутентификации в Net::HTTP.SOCKSProxy.
https://github.com/astro/socksify-ruby/pull/24/files

Я ищу делать именно это

Хорошая работа @yarafan

Всем привет. Каков статус этой функции? Он все еще находится в разработке?
Мне было бы очень интересно не использовать патч для обезьян, чтобы сделать это

@gcolson yes @technoweenie уже сделал большую часть работы 🎉
Однако, к сожалению, в настоящее время мы ожидаем объединения зависимого PR, см. мой комментарий: https://github.com/lostisland/faraday/pull/992#issuecomment -508437342

Была ли эта страница полезной?
0 / 5 - 0 рейтинги

Смежные вопросы

jeffb-stell picture jeffb-stell  ·  5Комментарии

mokolabs picture mokolabs  ·  3Комментарии

QuinnWilton picture QuinnWilton  ·  4Комментарии

mattmill30 picture mattmill30  ·  4Комментарии

Lewiscowles1986 picture Lewiscowles1986  ·  4Комментарии