2011.09.15 17:39
     

연휴에 블로그를 돌아다니다가 루비로 간단한 웹서버를 만들어보면 어떨까하는 생각이 들었습니다. 그래서 참고 자료를 찾아보고 있었는데... MSDN 블로그(여기)에서 루비로 만든 웹서버를 찾았습니다. @0@)-b 그것도 무려 70줄짜리~!!!

물론, GET 밖에는 처리하지 못하는 초 간단한 웹서버지만 일단 루비 언어(Ruby)의 간결함과 강력함을 확인하는데는 그만인 것 같습니다. ^^;;; 저도 비슷한 역할을 하는 웹서버를 C++로 작성해봤는데, 문자열 처리하고 경로 찾는 부분이 거의 절반이고, 소켓 연결을 관리하는 코드가 절반이었습니다. ㅠㅠ

그런데, 루비로 만든 웹 서버는 그냥 몇 줄에 다 처리가 가능하군요. @0@)-b... 제가 예전에 C++로 만든 웹서버 수준으로 맞춘다면 40줄 미만으로 끝날듯도... 쿨럭..;;;; ㅠㅠ 

좋은 참고 자료가 될 것 같아서 까먹기 전에 링크와 코드를 남겨둡니다. ;)
(정말 편하기는 짱이로군요. ㅠㅠ)

require 'socket'
class HttpServer
  def initialize(session, request, basePath)
    @session = session
    @request = request
    @basePath = basePath
  end

  def getFullPath()
    fileName = nil
    if @request =~ /GET .* HTTP.*/
      fileName = @request.gsub(/GET /, '').gsub(/ HTTP.*/, '')
    end
    fileName = fileName.strip
    unless fileName == nil
      fileName = @basePath + fileName
      fileName = File.expand_path(fileName, @defaultPath)
      fileName.gsub!('/', '\\')
    end
    fileName << "\\index.html" if  File.directory?(fileName)
    return fileName
  end

  def serve()
    @fullPath = getFullPath()
    src = nil
    begin
      if File.exist?(@fullPath) and File.file?(@fullPath)
        if @fullPath.index(@basePath) == 0 #path should start with base path
          contentType = getContentType(@fullPath)
          @session.print "HTTP/1.1 200/OK\r\nServer: Makorsha\r\nContent-type: #{contentType}\r\n\r\n"
          src = File.open(@fullPath, "rb")
          while (not src.eof?)
            buffer = src.read(256)
            @session.write(buffer)
          end
          src.close
          src = nil
        else
          # should have sent a 403 Forbidden access but then the attacker knows that such a file exists
          @session.print "HTTP/1.1 404/Object Not Found\r\nServer: Makorsha\r\n\r\n"
        end
      else
        @session.print "HTTP/1.1 404/Object Not Found\r\nServer: Makorsha\r\n\r\n"
      end
    ensure
      src.close unless src == nil
      @session.close
    end
  end

  def getContentType(path)
    #TODO replace with access to HKEY_CLASSES_ROOT => "Content Type"
    ext = File.extname(path)
    return "text/html"  if ext == ".html" or ext == ".htm"
    return "text/plain" if ext == ".txt"
    return "text/css"   if ext == ".css"
    return "image/jpeg" if ext == ".jpeg" or ext == ".jpg"
    return "image/gif"  if ext == ".gif"
    return "image/bmp"  if ext == ".bmp"
    return "text/plain" if ext == ".rb"
    return "text/xml"   if ext == ".xml"
    return "text/xml"   if ext == ".xsl"
    return "text/html"
  end
end

def logger(message)
  logStr =  "\n\n======================================================\n#{message}"
  puts logStr
  $log.puts logStr unless $log == nil
end

basePath = "d:\\web"
server = TCPServer.new('XXX.XXX.XXX.XXX', 9090)
logfile = basePath + "\\log.txt"
$log = File.open(logfile, "w+")

loop do
  session = server.accept
  request = session.gets
  logStr =  "#{session.peeraddr[2]} (#{session.peeraddr[3]})\n"
  logStr += Time.now.localtime.strftime("%Y/%m/%d %H:%M:%S")
  logStr += "\n#{request}"
  logger(logStr)

  Thread.start(session, request) do |session, request|
    HttpServer.new(session, request, basePath).serve()
  end
end
log.close

그럼 좋은 하루 되세요 ;) 
Mittm

Android App

Posted by kkamagui

댓글을 달아 주세요

  1. Favicon of http://blog.wimy.com BlogIcon zelon 2011.09.22 13:27  댓글주소  수정/삭제  댓글쓰기

    루비도 무척 편하네. 파이썬도 간단한 웹 서버 있던데(http://www.linuxjournal.com/content/tech-tip-really-simple-http-server-python) 웃긴게.... 미친(?) 파이썬은 SimpleHTTPServer 라는 클래스가 존재;;;;

    • Favicon of http://www.mint64os.pe.kr BlogIcon kkamagui 2011.09.22 23:57  댓글주소  수정/삭제

      오우 횽~ 안녕하세요 :)

      역시 파이썬은 짱이로군요 ㅠㅠ

      없는 게 없는 만물상 같은 느낌이랄까 ㅎㅎ

      잘 지내시고 계시죠? >ㅁ<)-b

  2. guest 2012.02.02 00:55  댓글주소  수정/삭제  댓글쓰기

    ruby도 Webrick이라는 웹서버 클래스가 standard lib에 있지요. (rails 개발모드에서 주로 사용하는..)
    웹관련된쪽은 python보다 ruby쪽 lib가 더 많은듯...

    • Favicon of http://www.mint64os.pe.kr BlogIcon kkamagui 2012.02.04 01:24  댓글주소  수정/삭제

      헛... 웹브릭이 루비 라이브러리에 있는 웹서버였나요? ㅠㅠ
      낫 놓고 기억자도 모른다더니만... OTL..
      제가 딱 그런 격이군요. ㅠㅠ 좋은 말씀 감사합니다. ^^

  3. Favicon of http://blog.naver.com/sol9501.do BlogIcon sol9501 2013.05.23 22:39  댓글주소  수정/삭제  댓글쓰기

    안녕하세요. 크롤러 개발하려고 검색하던중 잠시들립니다.^^
    저도 PHP/JAVA로만 개발하다 이번에 PMS 레일즈로 개발하니 3달 고생하니 정말 편하구나 쉽더군요.
    처음에 개념만 정확히 잡으면 정말 편한언어임에는 틀림없습니다.^^
    그럼 수고하세요~