Net::HTTP не отправляет запрос

У меня есть следующий метод в нашем проекте Ruby 1.8.7:

def self.ping_server
  request_data = get_request_data

  uri = 'another_server.our_company.com'
  https = Net::HTTP.new(uri)
  https.use_ssl = true
  path = "/our_service"
  data = request_data.to_json
  response = https.post(path, data, {'Content-Type' => 'application/json'})

  return response
end

Всякий раз, когда я запускаю этот метод, я получаю следующую ошибку времени ожидания:

Завершено 500 Internal Server Error за 128936 мс

Errno::ETIMEDOUT (Connection timed out - connect(2)):
  lib/my_class.rb:51:in `ping_our_server'

Я проверил у коллеги, у которого есть доступ к журналам для another_server.our_company.com. Мой запрос не поступает на другой сервер.

Что мне сделать, чтобы мой запрос работал?


РЕДАКТИРОВАТЬ: при дальнейшем рассмотрении я думаю, что происходит следующее (но я не совсем уверен): наш другой сервер будет принимать только HTTPS-запросы, но похоже, что мой запрос отправляется по HTTP. по какой-то причине. Есть ли что-то, что мне нужно добавить, чтобы убедиться, что мой запрос отправляется через HTTPS?


person Kevin    schedule 25.10.2013    source источник


Ответы (1)


Согласно этому веб-сайту, вы отправляете запрос HTTPS следующим образом:

require "net/https"
require "uri"

uri = URI.parse("https://secure.com/")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE

request = Net::HTTP::Get.new(uri.request_uri)

response = http.request(request)
response.body
response.status
response["header-here"] # All headers are lowercase

Согласно этот сайт ( которая связана с моей первой ссылкой), вы также должны сделать это, чтобы закрыть уязвимость в net/https библиотеке:

Чтобы начать работу, вам нужен пакет сертификатов локального ЦС, официальный сайт curl поддерживает обновленный cacert. pem / ca-bundle.crt, содержащий все основные сертификаты, если они вам нужны.

Затем, после установки gem-пакета always_verify_ssl_certificates, вы можете запустить тест так же просто, как:

require 'always_verify_ssl_certificates'
AlwaysVerifySSLCertificates.ca_file = "/path/path/path/cacert.pem"

http= Net::HTTP.new('https://some.ssl.site', 443)
http.use_ssl = true
req = Net::HTTP::Get.new('/')
response = http.request(req)

Если у сайта плохой сертификат, на этом этапе будет выдано сообщение об ошибке. В противном случае будет возвращен допустимый объект ответа HTTP.

person Kevin    schedule 25.10.2013