Как мне отправлять HTTP-запросы через TCPSocket?

#ruby #http #tcp

#ruby #http #tcp

Вопрос:

Я написал класс в Ruby , который действует как HTTP-клиент. Код минимален, но причина, по которой я не использую 'net/http' , заключается в том, что этот метод позволяет мне иметь больший контроль над выполняемыми запросами, а документация по HTTP вообще не помогает.

В любом случае, проблема в том, что сокет будет работать только для одного запроса и ответа. Отправка второго или последующего запроса дает мне пустой ответ.

Например:

  1. Открыть соединение с Google
  2. ПОЛУЧАЕМ «/»
  3. Ответ — это google.ca html
  4. ПОЛУЧАЕМ «/»
  5. Ответ пустой

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

Итак, в чем здесь проблема?

Есть ли метод, который позволяет мне проверить, имеет ли TCPSocket объект открытое соединение, чтобы я случайно не открыл новое?

Комментарии:

1. Без примеров кода действительно сложно быть конкретным. Вместо того, чтобы изобретать хорошо продуманное колесо, почему бы не взглянуть на Ruby’s open-uri или typhoeus, httpclient или curb gems?

Ответ №1:

Попробуйте:

 require "socket"
host = "google.com"
port = 80
socket = TCPSocket.new host,port
request = "GET / HTTP/1.0rnHost:#{host}rnrn"
socket.print request
response = socket.read
  

Это вернет главную страницу Google. Если вы хотите отправлять запрос за запросом, измените его на «HTTP / 1.1» и прочитайте ответ, затем отправьте следующий запрос.