2012-11-30 7 views
3

Node.js v0.8.15에서 HTTPParser로 게임하고 있습니다. 불행히도 콜백 중 일부는 호출되지 않습니다.Node.js HTTPParser가 콜백 중 일부를 호출하지 않습니다.

예를 들어 다음 코드는 onHeadersComplete 만 호출합니다. 전화 번호를 onURL, onHeaderFieldonHeaderValue으로 변경할 수 없습니다.

var 
    HTTPParser = process.binding('http_parser').HTTPParser, 
    parser = new HTTPParser(HTTPParser.REQUEST), 
    request = new Buffer(
     'GET /test HTTP/1.1\r\n' + 
     'Host: www.example.com\r\n' + 
     'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/17.0 Firefox/17.0\r\n' + 
     'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n' + 
     'Accept-Language: en-US,en;q=0.5\r\n' + 
     'Accept-Encoding: gzip, deflate\r\n' + 
     '\r\n' 
    ); 

parser.onURL = function() { 
    console.log('onURL'); 
} 

parser.onHeaderField = function() { 
    console.log('onHeaderField'); 
} 

parser.onHeaderValue = function() { 
    console.log('onHeaderValue'); 
} 

parser.onHeadersComplete = function() { 
    console.log('onHeadersComplete'); 
} 

parser.execute(request, 0, request.length); 

무엇이 잘못 되었습니까?

답변

1

process.binding은 코어 노드 라이브러리에서만 사용하기로되어 있습니다. http 파서 C++ 코드는 소스를 간략히 읽은 후 작은 이벤트 하위 집합 (onHeaders, onHeadersComplete, onBody, onMessageComplete) 만 노출하므로 이러한 이벤트가 래치 할 수있는 유일한 이벤트라고 생각합니다.

파서는 내부적으로 파서의 추가 콜백을 사용하지만 이벤트로 JS 토지에 노출되지 않습니다.

1

검색 엔진에서 여기 오는 사람들. Node의 최근 버전은 약간 다른 조직을 사용합니다. 이 코드는 다음과 같이 작동합니다.

var HTTPParser = process.binding('http_parser').HTTPParser; 

var parser = new HTTPParser(HTTPParser.REQUEST); 

const kOnHeaders = HTTPParser.kOnHeaders | 0; 
const kOnHeadersComplete = HTTPParser.kOnHeadersComplete | 0; 
const kOnBody = HTTPParser.kOnBody | 0; 
const kOnMessageComplete = HTTPParser.kOnMessageComplete | 0; 
const kOnExecute = HTTPParser.kOnExecute | 0; 

parser[kOnHeaders] = 
    function(headers, url) { 
     console.log('kOnHeaders'); 
    } 
parser[kOnHeadersComplete] = 
    function(versionMajor, versionMinor, headers, method, 
      url, statusCode, statusMessage, upgrade, shouldKeepAlive) { 
     console.log('kOnHeadersComplete'); 
    } 
parser[kOnBody] = 
    function(b, start, len) { 
     console.log('kOnBody'); 
    } 
parser[kOnMessageComplete] = 
    function() { 
     console.log('kOnMessageComplete'); 
    } 
parser[kOnExecute] = 
    function() { 
     console.log('kOnExecute'); 
    } 

var ret = parser.execute(new Buffer(
     'GET /test HTTP/1.1\r\n' + 
     'Host: www.example.com\r\n' + 
     'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/17.0 Firefox/17.0\r\n' + 
     'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n' + 
     'Accept-Language: en-US,en;q=0.5\r\n' + 
     'Accept-Encoding: gzip, deflate\r\n' + 
     '\r\n' 
    )); 

또는 몇 가지 래퍼 모듈이 있습니다. 개체 현재 다음있다 방법 : 가까운

  • 은 - 구문 분석을 취소하고 파서를 무료
  • 실행 - 데이터의 덩어리를 읽고 파싱 (?). 헤더 천천히
  • 마무리 도착하는 경우 여러 번 호출 할 수 -
  • 재 초기화를 분석 완료, 더 이상 데이터가 없습니다 파서에게 - 다른 유형의 메시지 (요청/응답)
  • 일시 정지에 대한 파서를 준비 - IDK, 어쩌면 데이터 추가에
  • 이력서를 분석 중지 - IDK, 어쩌면
  • 소비 분석 시작 - IDK, 뭔가를 스트림
  • 에 대한
  • 이 unconsume - IDK 뭔가를 스트림
  • 에 대한
  • getCurrentBuffer - 현재 데이터 안부를 반환 (?) 강사 사용 세부 사항에 관해서는

, 당신은 노드의 소스를 참조 할 수 있습니다

관련 문제