python - Chrome native 消息传递不接受特定大小的消息 (Windows)

标签 python c++ google-chrome-extension chrome-native-messaging

我正在开发一个与 native 消息传递主机配合使用的 Chrome 扩展程序。 它在大多数情况下都有效,但当我发送特定大小的消息时,我发现了奇怪的行为。 当大小在 2560 到 2815 字节(十六进制的 A00 和 AFF)之间时,消息似乎被丢弃。所有后续消息也未到达,这表明该流由于某种原因已损坏。

这是一个精简的 Python native 消息应用程序,可用于测试它:

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 repository 中的代码。 Function 似乎负责该功能,但没有任何特殊之处:

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 上遇到过此问题。

我在稳定版、测试版和开发版 channel 上尝试了 64 位 Chrome - 版本 37、38 和 39。 我也尝试过稳定的 Chrome 32 位

我使用 32 位版本的 Python 2.7.7 和 PyInstaller 2.1 为 native 消息传递主机创建可执行文件。

最佳答案

由于您使用的是 Windows,我怀疑 Windows 将回车符 (\x0D) 添加到换行符 (\x0A)。

根据Python 2.x - Write binary output to stdout? ,防止在 Windows 上修改输出流的一种方法是在将任何内容写入 stdout 之前使用以下代码片段。

if sys.platform == "win32":
    import os, msvcrt
    msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)

关于python - Chrome native 消息传递不接受特定大小的消息 (Windows),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26163089/

相关文章:

python - 如何使用join方法和sort方法

python - Telegram Bot 如何在 curl 中设置解析模式?

c++ - 使用 Qt Creator 表单进行适当的子类化?

C++ 基础转换

Javascript:如何检查数据是否已加载

python - 使用正则表达式函数时返回值不一致

python - Python 上的纸牌配对游戏

c++ - 使用 if() 根据属性修改类行为是否有代码味道?

javascript - chrome扩展程序应在youtube标签不清晰时暂停视频

javascript - Chrome 扩展的 HTML5 sessionStorage 或 chrome.storage?