2014-02-13 13 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”响应头。

相关问题