2013-03-25 52 views
1

在接受通常很大(幾MB)的HTTPS發佈請求的node.js服務器中,我們希望能夠在整個事件被接受之前開始處理請求由服務器。Nodejs:如何根據標頭拒絕https帖子

例如,如果有一個胖胖的身體請求到達,我們希望查看它的路徑,並根據它決定是否終止/拒絕它,而不必等待整個請求到達(並支付IO接受那個胖體的費用)。

+0

你不能在'createServer'回調中檢查請求標頭,並執行諸如'request.pause(); if(request.url condition){response.end();返回; } request.resume();'? – fardjad 2013-03-25 10:51:59

+0

你的意思是在'requestListener'中我傳遞了'createServer'?如果這兩個條件都成立,那麼這將起作用:1)所有標題都已收到,並且2)還沒有太晚(即尚未收到正文)。文件不清楚這些條件是否成立。 – 2013-03-25 11:27:46

+0

你看看這個嗎? https://github.com/felixge/node-formidable(這是Express.js用來解析請求的主體) – 2013-03-25 13:32:50

回答

1

你可以嘗試的連接限制中間件:

https://github.com/senchalabs/connect/blob/master/lib/middleware/limit.js

,或者通過檢查req.headers [內容長度]等實施以類似的方式自己的解決方案..

+2

快速提示:檢查req.headers [content-length]可能是一個糟糕的主意,用一個簡單的「curl -H」內容長度來操作它相當容易:1'--data'thisisnot = one'http:/ /your.host」。 – red 2013-03-25 14:21:52

+0

問題是在請求主體收到之前req.headers是否可訪問。 – 2013-03-27 12:20:11

+0

節點HTTP將把請求解析爲標題和正文,但不解析實際的標題和正文。您可能需要考慮像Mikeals的Request這樣的庫,它可以輕鬆使用節點流API。然後你會使用一個EventEmitter,一旦接收到標題,就等待'data'事件句柄。 https://github.com/mikeal/request/issues/434 – ZimSystem 2013-03-27 13:48:30

0

根據實驗,似乎Node.js在解析HTTP標頭後僅觸發了request事件。這意味着在我們開始收聽data事件之前,有機會檢查標題。

因此,解決方案似乎是在讀取任何數據之前檢查標頭,並可能在此時拒絕該請求。如果我們不拒絕那個時候,我們開始在數據緩衝區到達時累積數據緩衝區,如果它們超過限制(因此與報告的內容長度發生衝突),我們有另一個機會通過調用response.end()來拒絕請求。