2014-02-13 15 views
0

我試圖使用相互證書身份驗證從TLS安全服務發送和接收數據。我成功連接到該服務,並且回覆是我已獲得授權。我將數據發送到服務器,然後連接'數據'事件......我知道我的數據準確發送,因爲我獲得了準確的響應數據。nodeJS TLS在數據中包含奇數字符

數據在每個塊的開始和結尾(有時在中間)包含奇數字符。

HTTP/1.1 200 OK 
X-Powered-By: Servlet/2.5 
Set-Cookie: JSESSIONID=8f2a41305cbe859001f1d54e5e80; Path=/xds; Secure 
Content-Type: application/soap+xml;charset=utf-8 
Transfer-Encoding: chunked 
Date: Thu, 13 Feb 2014 01:53:14 GMT 

6c 
<?xml version='1.0' encoding='UTF-8'?><S:Envelope x......... 
2000 
<ns4:AdhocQueryResponse xmlns:ns2="urn:oasis:names:......... 
1485 
8425c" objectType="urn:oasis:names:tc:ebxml-regrep:......... 
0 

這裏是代碼我使用:

var tls = require('tls'); 
var net = require('net'); 

var receiveData = function(sock) { 
    var response = ''; 
    sock.on('error', function(err) { 
     console.log("Socket error: " + err); 
    }); 

    sock.on('data', function(d){ 
     response += d.toString(); 
    }); 

    sock.on('end', function() { 
     console.log("Done receiving data from via TLS: " + response.length); 
     console.log(response); 
    }); 
}; 

var sendData = function(sock) { 
    console.log("Sending request to HIE"); 

    var req = 'POST ' + path + ' HTTP/1.1\r\n' + 
     'Host: localhost\r\n' + 
     'Content-Length: ' + data.length + '\r\n' + 
     'Content-Type: application/soap+xml; charset=utf-8\r\n' + 
     'SOAPAction: "http://www.w3.org/2003/05/soap-envelope"\r\n' + 
     '\r\n'; 
    sock.write(req); 
    sock.write(data); 
}; 

var options = { 
    port: port, 
    host: host, 
    key: fs.readFileSync(tls_key, encoding='ascii'), 
    cert: fs.readFileSync(tls_cert, encoding='ascii'), 
    ca: fs.readFileSync(tls_ca, encoding='ascii') 
}; 

var sock = tls.connect(options, function() { 
    var authorized = sock.authorized; 

    if (authorized) { 
     console.log("Successfully connected via TLS"); 
     sock.setKeepAlive(true); 
     receiveData(sock); 
     sendData(sock); 
    } else { 
     console.log("Unauthorized to connect via TLS: " + sock.authorizationError); 
    } 
}); 

有誰知道爲什麼我收到這些奇怪的字符?我試過設置襪子的setEncoding('utf8'),並且刪除了我需要的.toString()數據。但是,這並沒有解決這些奇怪字符的問題。

我想他們可能是大塊數據量的指標......但是,「6c」位於第一個塊的中間。所以,我不認爲就是這樣。更重要的是,即使在該塊中發送了大量數據,第三塊也是0。

請幫忙!

回答

0

你差點弄明白了!其原因在數據中的數字是,該響應是使用塊傳輸編碼,如在「傳輸編碼」響應頭中可以看出:每個組塊之前

Transfer-Encoding: chunked

的數字(頭部本身不是塊,所以6c是'數據'的第一部分)是代表在該塊中發送的字節數的十六進制值。響應由一個0字節的塊結束。詳情參見以下內容:

http://en.wikipedia.org/wiki/Chunked_transfer_encoding

http://tools.ietf.org/html/rfc2616#section-3.6.1

塊傳輸編碼允許在不知道到底有多少數據響應啓動時將返回到返回的數據。如果知道要返回多少數據,則應該相應地設置「Content-Length」響應頭。

相關問題