2016-07-04 46 views
0

我有一個奇怪的HTTP和HTTP類似的處理案例,我必須支持一些破損的客戶端。具體而言,客戶端將發出HTTP PUT請求,並且在客戶端發送請求主體之前,需要在收到請求頭之後發送200 OK。通常情況下,我這樣做:正確的Node.js API用於確定是否發送了'100 Continue'

app.put('/*', function (req, res, next) { 
    res.socket.write('HTTP/1.0 200 OK\r\n\r\n'); 
    /* Pipe socket and handle data here */ 
} 

然而,隨着Node.js的(V6.2.2在本文寫作),較新版本時,客戶端與適當的HTTP/1.1請求連接,並在其請求頭Expect: 100-continue,在我有機會發送自己的響應狀態行之前,HTTP服務器將(正確)發送一個HTTP/1.1 100 Continue消息。因此,客戶端會得到兩條狀態行:

HTTP/1.1 100 Continue 
HTTP/1.0 200 OK 

這不是一個大問題。我只需要檢測Node.js HTTP服務器何時處理狀態行,所以我不發送重複。訣竅是,我不認爲這個API是適當的暴露。我打了招呼周圍,用這種方法提出了:

app.put('/*', function (req, res, next) { 
    if (!res._sent100) { 
    res.socket.write('HTTP/1.0 200 OK\r\n\r\n'); 
    } 
    /* Pipe socket and handle data here */ 
} 

我的問題:有沒有更好的辦法時,內置的HTTP服務器,通過使用res._sent100發送100 Continue比檢測?

有一個HTTP server checkContinue event。但是,如果我處理該事件,則正常事件不會觸發。我將它與Express結合使用,並且我需要正常的請求事件,以便正常的中間件堆棧可以運行。如果我可以處理checkContinue,請將我自己的財產寫入res,然後將其傳回正常堆棧進行處理,那麼一切都會好起來的。但是,我沒有看到有記錄的方式來做到這一點。

回答

1

這似乎工作:

server.on('checkContinue', (req, res) => { 
    res.mySent100 = true; 
    res.writeContinue(); 
    server.emit('request', req, res); 
}); 

(其中server是服務於您的快速應用程序的HttpServer的實例)