星期五, 2月 10, 2012

node.js 的 ServerResponse 回應 binary data 的問題

這兩天在測試時一直被一個問題困擾, 我是用 node.js 寫一個簡單的 HTTP Server 接收 GET request, 這個 server 會把傳入的 GET 參數 (都是表示整數的字串) 轉成整數後加總傳回, 一開始都用文字的方式傳回, 測試也都正常, 可是因為我的 client 要處理字串有點麻煩, 所以當我嘗試把加總值改成用 binary data 傳回一個 16 位元的整數值時, client 這邊一直收不到答案, 經過一番測試, 發現 node.js 這邊會把 HTTP respnse header 與 binary data 分開成兩次傳回, client 這邊沒有考慮到這個問, 於是就收不到答案了。

後來直接看了一下 node.js 裡頭 http.js 原始碼, 發現果然如果使用 ServerResponse.end() 或是 ServerResponse.Write() 送出回應時, 如果 header 尚未送出, 而要回應的資料是字串的話, 就會直接將 header 與回應內容串在一起後送出, 但若是回應的是 binary data, 就會將 header 與 binary data 分開送, 事實上, 只要傳送的資料的編碼不同, 就會分開傳送。

如果您也使用 node.js 的話, 希望這個經驗能夠避免一些問題。

沒有留言: