Ruby WEBrick에서 서버 사이드 코드 처리하기

WEBRick 또한 웹 서비스를 위한 라이브러리이기 때문에 간단한 라우팅 기능을 지원합니다. 이를 이용하면 Static 파일만 서빙하는게 아닌 실제 웹 요청 시 원하는 코드를 동작시킬 수 있습니다.

바로 mount_proc 메소드인데요, 먼저 ruby-doc.org에서는 아래와 같이 정의되어 있습니다.

mount_proc(dir, proc=nil, &block) click to toggle source Mounts proc or block on dir and calls it with a WEBrick::HTTPRequest and WEBrick::HTTPResponse

# File webrick/httpserver.rb, line 158
def mount_proc(dir, proc=nil, &block)
  proc ||= block
  raise HTTPServerError, "must pass a proc or block" unless proc
  mount(dir, HTTPServlet::ProcHandler.new(proc))
end

우리가 mount_proc를 사용하면서 먼저 알아야할 점은 req 와 res 입니다.

  • req: request(헤더부터 데이터 부분까지 모두)
  • res: response(헤더부터 데이터 부분까지 모두)

두개로 나누어서 볼 수 있고, 해당 부분을 이용하여 클라이언트로부터 넘어온 Parameter 값을 사용하거나 Response 시 Type 등을 지정할 수 있습니다.

server.mount_proc '/add' do |req,res|   
                res['Content-Type'] = "text/html"  #Content-Type 지정
                res.body=wscan_list().to_s   #함수를 이용한 처리
                res.body=res.body+"<br><input type='text'>"  #HTML 처리
                end

위 코드를 간단히 보자면 server라는 WEBrick 객체에서 mount_proc를 이용하여 /add 페이지로 접근 시 동작하도록 설정한 내용입니다. res['Content-Type'] = "text/html" 이 부분을 보면 res 내 Content-Type 영역에 “text/html” 데이터를 넣어주어 해당 페이지가 html 으로써 읽어질 수 있도록 설정하였습니다.

res.body 값에 넘겨줄 response 데이터를 넣어주어 사용자로 하여금 일반 웹 서버에 접근한 것과 동일한 효과를 낼 수 있습니다. 이러면 WEBrick::mount 와 WEBrick::mount_proc 와 어떤 차이가 있을까 생각되겠죠.

server = WEBrick::HTTPServer.new({:BindAddress => '127.0.0.1',
                                  :Port => '6644'})
server.mount_proc '/add' do |req,res|   
                res['Content-Type'] = "text/html"  #Content-Type 지정
                res.body=wscan_list().to_s   #함수를 이용한 처리
                res.body=res.body+"<br><input type='text'>"  #HTML 처리
                end
trap(:INT){server.shutdown}
server.start

Reference