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

python - La mensajería nativa de Chrome no acepta mensajes de ciertos tamaños(Windows)



c++ google-chrome-extension (1)

Estoy desarrollando una extensión de Chrome que funciona con un host de mensajería nativo. Funciona en la mayoría de los casos, pero he encontrado un comportamiento extraño cuando envío mensajes de ciertos tamaños. Parece que el mensaje se descarta, cuando el tamaño está entre 2560 y 2815 bytes (A00 y AFF en hexadecimal). Todos los mensajes subsiguientes tampoco llegan, lo que sugiere que la transmisión está dañada por alguna razón.

Aquí hay una aplicación de mensajería nativa de Python reducida, que se puede usar para probarla:

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))

Recibo el primer mensaje y no el segundo.

He echado un vistazo al código en el repositorio de Chrome . La función, que parece ser responsable de esa funcionalidad, no tiene nada especial:

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); } }

¿Alguien tiene alguna idea de lo que puede estar pasando aquí?

Actualizar

He experimentado este problema en las versiones de 64 bits de Windows 7 y Windows 8.1.

Probé Chrome de 64 bits en los canales Stable, Beta y Dev - versiones 37, 38 y 39. También probé Chrome estable de 32 bits

Uso la versión de 32 bit de Python 2.7.7 y PyInstaller 2.1 para crear un ejecutable para el host de mensajería nativo.


Como está utilizando Windows, sospecho que Windows está agregando retornos de carro ( /x0D ) a caracteres de nueva línea ( /x0A ).

Según Python 2.x - ¿Escribir salida binaria a stdout? , una forma de evitar la modificación de la secuencia de salida en Windows es usar el siguiente fragmento antes de escribir algo en stdout.

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