연휴에 블로그를 돌아다니다가 루비로 간단한 웹서버를 만들어보면 어떨까하는 생각이 들었습니다. 그래서 참고 자료를 찾아보고 있었는데... MSDN 블로그(여기)에서 루비로 만든 웹서버를 찾았습니다. @0@)-b 그것도 무려 70줄짜리~!!!
물론, GET 밖에는 처리하지 못하는 초 간단한 웹서버지만 일단 루비 언어(Ruby)의 간결함과 강력함을 확인하는데는 그만인 것 같습니다. ^^;;; 저도 비슷한 역할을 하는 웹서버를 C++로 작성해봤는데, 문자열 처리하고 경로 찾는 부분이 거의 절반이고, 소켓 연결을 관리하는 코드가 절반이었습니다. ㅠㅠ
그런데, 루비로 만든 웹 서버는 그냥 몇 줄에 다 처리가 가능하군요. @0@)-b... 제가 예전에 C++로 만든 웹서버 수준으로 맞춘다면 40줄 미만으로 끝날듯도... 쿨럭..;;;; ㅠㅠ
좋은 참고 자료가 될 것 같아서 까먹기 전에 링크와 코드를 남겨둡니다. ;)
(정말 편하기는 짱이로군요. ㅠㅠ)
그럼 좋은 하루 되세요 ;)
물론, 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
그럼 좋은 하루 되세요 ;)
'프로그래밍(Programming) > 루비(Ruby)' 카테고리의 다른 글
Ubuntu 11.04에서 Rails 3.2.1 설치 후 sqlite3.h 가 없다고 오류날 때... (0) | 2012.01.28 |
---|---|
루비(Ruby)로 만든 웹사이트 스크랩퍼(Web site scrapper) (0) | 2011.10.23 |
복잡한 멜론 다운로드 폴더를 정리하는 루비(Ruby) 프로그램 (5) | 2011.09.05 |
우분투에서 NetBeans로 루비(Ruby) 개발하기~!! (4) | 2011.08.23 |
루비(Ruby) 언어를 배우기 시작했습니다. ^^)-b (11) | 2011.08.21 |