2013-02-04 3 views
0

기존 Ruby 응용 프로그램에 HTTP 서버를 추가하려고합니다. 응용 프로그램은 select 루프를 기반으로하므로 들어오는 HTTP 요청도 처리해야합니다 (동일한 스레드에서 요청을 처리하는 것이 중요합니다. 그렇지 않으면 거기에서 마샬링하기 위해 후프를 통과해야합니다).네트워킹이없는 Ruby HTTP 서버

Ruby에는 독립형 HTTP 서버용 솔루션이 많이 있지만 기존 소켓에서 HTTP 서버를 구현하는 라이브러리를 찾을 수없는 것 같습니다. HTTP 라이브러리가 포트를 열고 기다리는 것을 원하지 않습니다. 소켓에 연결하려고합니다.

내가 찾고 기본 논리는 이것이다 :

handler = SomeHTTPParsingLibrary.new 
# set up handler callbacks, etc on handler... 

while socket = get_incoming_connection() 
    handler.handle_request(socket) 
end 

는 다음과 같이 작업 할 수있는 기존의 루비 라이브러리가 있습니까? HTTP는 간단하지만 충분한 프로토콜입니다. (쿠키, 기본 인증 등을 필요로합니다.) 내 자신의 것을 굴리지 말아야 할 정도로 짜증나는 세부 정보가 있습니다.

답변

0

전화 할 방법을 알아 내기 위해 슬리브를 약간 위로 굴려야 할 수도 있지만, mongrel에서 HTTPParser 클래스를 시도해 보는 것이 좋습니다.

+0

WEBrick과 함께 갔지만, 간단하게 'WEBrick :: HTTPServer :: run'을 보면 쉽게 알 수 있습니다. 감사. – user2040448

0

httprequest.rb (webrick - ruby ​​stdlib에서) 코드를 한 눈에 보면 목적에 맞을 것처럼 보입니다.

WEBrick::HTTPRequest 개체는 소켓을 해당 parse() 메서드의 인수로 수락 할 수 있습니다. 그런 다음 요청 객체가 들어오는 HTTP 요청으로 완전히 채워지면 차단되고 반환됩니다.

예를 들면 :

물론
res = HTTPResponse.new(@config) 
    req = HTTPRequest.new(@config) 

    # some code to "select" a socket goes here 

    # sock is active, hand it over to the req object for reading. 
    req.parse(sock) 
    res.request_method = req.request_method 

이이 스레드가 현재 요청 처리가 완료된 것입니다 차단하는 것으로 가정합니다.

OTOH, 과 같은 것이 사용자의 요구에 맞을 수도 있지만 쿠키 처리와 같은 다른 것들은 희생하여 속도를 선호합니다.