ロード トップ 参照元 逆検索 検索 ヘルプ

[logo] あやしいhttp待ち受けスクリプト


SuzTiki:RubyでServer

Handlerというクラスを定義して、

  Handler::handle(head, method, action, content);
というメソッドで適当に料理してください。

標準出力に書くとブラウザに送られると思います。‥‥‥というのは勘違いで、 メソッドの返り値の文字列が送られるんでした。_o_

wwwsrvやるより、一から動かせるだけの最低限分を書いた方がいいかも。


= server.rb
require 'socket'
require 'timeout'

class AyashiiServer

  # サーバーの初期化。ポートを開いて待ち続ける
  def initialize(port, handler)
    $handler = handler
    serverSocket = TCPserver.open(port)
    while true
      begin
        socket = serverSocket.accept
        process(socket)
      rescue
        print "an error occered.\n"
      end
    end
  end

  # 一つのセッションを処理する。
  def process(socket)
    begin
      head, method, action, content = readRequest(socket)
      response = serve(head, method, action, content)
      sendResponse(socket, response)
    ensure
      socket.close
    end
  end

  # リクエストを読む
  def readRequest(socket)
    action = ''
    method = ''
    head = {}

    while(true)
      str = nil
      begin
        timeout(1) {
          str = socket.gets
        }
      rescue TimeoutError
        raise
      end
      break unless str

      str.chop!
      
      if str =~ /^(get|post) \/(\S*)/i then
        method = $1
        action = $2
      end
      
      if str =~ /^(\S+):\s*(.*)$/ then
        key = $1.downcase
        head[key] = $2
      elsif str =~ /^\s*$/i then
        break
      end
    end
    content = ''

    if head['content-length'] && head['content-length'].to_i > 0 then
      content = socket.read(head['content-length'].to_i)
    end

    return [head, method, action, content]
  end

  # リクエストを処理する
  def serve(head, method, action, content)
    return $handler.handle(head, method, action, content)
  end

  # レスポンスを送信する
  def sendResponse(socket,result)
    if result.type == Array then
      head = result[0]
      content = result[1]
    else
      head = {}
      content = result
    end

    head['Content-length'] = content.length.to_s
    head['Content-Type'] = 'text/html'
    head['Cache-Control'] = 'no-cache'
    head['Date'] = Time.new.to_s
    head['Server'] = ServerVersion
    header = ''

    head.each{|k,v|
      header += k + ": " + v + "\r\n"
    }

    socket.write("HTTP/1.1 200 OK\r\n")
    socket.write(header + "\r\n" + content)
  end

end

(最終更新 Thu Mar 30 17:57:25 2006)