2014-09-15 2 views
0

보안 헤더를 기반으로 요청을 거부 할 수있는 노드 서버가 있습니다. 요청을 거절하면 빈 데이터와 끝 핸들러를 사용하여 요청 본문을 읽어야합니까, 아니면 그냥 401이라는 응답을 보내고 요청을 읽지 않은 상태로 둘 수 있습니까?노드에서받은 http 요청에 대해 end()를 호출해야합니까?

응답을 읽지 않은 채로두면 클라이언트에서 "기존 연결이 원격 호스트에 의해 강제로 닫혔습니다."라는 오류가 발생하는 것 같습니다. 요청 본문이 읽힐 때까지 기다리는 코드를 추가하면 문제를 해결할 수 있지만 서버 코드의 여러 지점에서 지연을 추가하면 유리한 효과가있는 것으로 보입니다. 간헐적 인 결함으로 알기가 어려울 수 있습니다.

문제를 해결하기 위해 보인다 있다는 커피 스크립트 코드는 다음과 같습니다

@res.writeHead status, message, @headers 
@req.on 'data', (d) -> 
# wait for request to be completely read before ending response stream 
@req.on 'end', => @res.end() 

빈 데이터 핸들러는 종료 이벤트를 얻기 위해 필요하며 종료 이벤트는 아마도는 상기 오류를 방지하는 데 필요한 입니다 고객. 요청 본문이 메가 바이트 일 수 있다는 점을 감안할 때 이것이 401 응답을 보내는 가장 좋은 방법인지 또는 전체 요청을 읽지 않아도되는 더 좋은 방법입니다.

+0

그냥 401을 보낼 수 있습니다. Res.send 호출 res.end – Sami

답변

0

자세한 조사 결과 많은 웜이 발견되었습니다. 클라이언트에서 잠재적으로 오류를 일으키지 않고 요청 스트림을 중지시키는 제대로 구현 된 메소드가없는 것 같습니다. 나는 매우 긴 요청을 중단하고 짧은 사람은 완료 할 수 있도록하기로 결정했습니다 How to cancel HTTP upload from data events?

:

이 질문에 오류를 발생시키지 않고 초기 요청을 종료의 어려움을 설명합니다. 내 응용 프로그램에서 이것은 보통 DOS 공격 일 것입니다. (합법적 인 요청은 보통 짧습니다)

관련 문제