Chrome本机消息传递不接受某些大小的消息(Windows)
问题内容:
我正在开发与本机消息传递主机配合使用的Chrome扩展程序。它在大多数情况下都有效,但是当我发送某些大小的消息时,我发现了一个奇怪的行为。大小在2560到2815字节(十六进制的A00和AFF)之间时,似乎已丢弃该消息。所有后续消息也都未到达,这表明该流由于某种原因而损坏。
这是精简的Python本机消息传递应用程序,可用于对其进行测试:
import sys
import struct
def output(message):
encoded_message = message.encode('utf-8')
# Write message size.
sys.stdout.write(struct.pack('I', len(encoded_message)))
# Write the message itself.
sys.stdout.write(encoded_message)
sys.stdout.flush()
if __name__ == "__main__":
output('{"type": "%s"}' % ('x'*2820))
output('{"type": "%s"}' % ('x'*2560))
我收到的是第一个消息,而不是第二个。
我看了看Chrome存储库中的代码。似乎负责该功能的功能没有什么特别之处:
void NativeMessageProcessHost::ProcessIncomingData(
const char* data, int data_size) {
DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
incoming_data_.append(data, data_size);
while (true) {
if (incoming_data_.size() < kMessageHeaderSize)
return;
size_t message_size =
*reinterpret_cast<const uint32*>(incoming_data_.data());
if (message_size > kMaximumMessageSize) {
LOG(ERROR) << "Native Messaging host tried sending a message that is "
<< message_size << " bytes long.";
Close(kHostInputOuputError);
return;
}
if (incoming_data_.size() < message_size + kMessageHeaderSize)
return;
content::BrowserThread::PostTask(content::BrowserThread::UI, FROM_HERE,
base::Bind(&Client::PostMessageFromNativeProcess, weak_client_ui_,
destination_port_,
incoming_data_.substr(kMessageHeaderSize, message_size)));
incoming_data_.erase(0, kMessageHeaderSize + message_size);
}
}
有人知道这里会发生什么吗?
更新资料
我在64位版本的Windows 7和Windows 8.1上遇到此问题。
我在稳定版,Beta版和开发版频道(版本37、38和39)上尝试了Chrome 64位。我还尝试了32位稳定版Chrome
我使用32位版本的Python 2.7.7和PyInstaller 2.1为本地消息传递主机创建可执行文件。
问题答案:
由于您使用的是Windows,因此我怀疑Windows正在将回车符(\x0D
)添加到换行符(\x0A
)。
根据Python
2.x-将二进制输出写入stdout吗?
,一种防止在Windows上修改输出流的方法是在将任何内容写入stdout之前使用以下代码段。
if sys.platform == "win32":
import os, msvcrt
msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)