Написание простого веб-сервера на Ruby - PullRequest
5 голосов
/ 10 марта 2010

Я хочу создать чрезвычайно простой веб-сервер для разработки в Ruby (нет, я не хочу использовать готовые решения).

Вот код:

#!/usr/bin/ruby

require 'socket'

server = TCPServer.new('127.0.0.1', 8080)

while connection = server.accept
  headers = []
  length  = 0

  while line = connection.gets
    headers << line

    if line =~ /^Content-Length:\s+(\d+)/i
      length = $1.to_i
    end

    break if line == "\r\n"
  end

  body = connection.readpartial(length)

  IO.popen(ARGV[0], 'r+') do |script|
    script.print(headers.join + body)
    script.close_write
    connection.print script.read
  end

  connection.close
end

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

Пока все хорошо, но этооказывается очень хрупким, так как он разбивается на второй запрос с ошибкой:

/usr/bin/serve:24:in `write': Broken pipe (Errno::EPIPE)
    from /usr/bin/serve:24:in `print'
    from /usr/bin/serve:24
    from /usr/bin/serve:23:in `popen'
    from /usr/bin/serve:23

Есть идеи, как улучшить приведенный выше код, чтобы его было достаточно для простого использования?Ubuntu 9.10 (2.6.31-20-generic), Ruby 1.8.7 (2009-06-12 patchlevel 174) [i486-linux]

Ответы [ 3 ]

5 голосов
/ 10 марта 2010

Похоже, проблема в дочернем скрипте, поскольку родительский скрипт в вашем вопросе работает на моем компьютере (Debian Squeeze, Ruby 1.8.7 patchlevel 249):

Я создал фиктивный дочерний скрипт bar.rb:

#!/usr/bin/ruby1.8

s = $stdin.read
$stderr.puts s
print s

Затем я запустил ваш скрипт, передав ему путь к фиктивному скрипту:

$ /tmp/foo.rb /tmp/bar.rb

Я ударил его с помощью wget:

$ wget localhost:8080/index

И увидел вывод фиктивного скрипта:

GET /index HTTP/1.0^M
User-Agent: Wget/1.12 (linux-gnu)^M
Accept: */*^M
Host: localhost:8080^M
Connection: Keep-Alive^M
^M

Я также видел, что wget получил то, что отправил:

$ cat index
GET /index HTTP/1.0
User-Agent: Wget/1.12 (linux-gnu)
Accept: */*
Host: localhost:8080
Connection: Keep-Alive

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

3 голосов
/ 10 марта 2010

Буклет Ruby Web Servers описывает большинство стратегий реализации веб-сервера.

1 голос
/ 10 марта 2010

С Ruby Webrick Lib у вас есть простая библиотека для создания веб-сервера.

http://www.ruby -doc.org / STDLIB / libdoc / WEBrick / RDoc /

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...