Как проанализировать JSON из стандартного ввода на хосте Chrome Native Messaging?
Связанные с:
Использование кода в разделе Как использовать shell-скрипт в качестве основного приложения Chrome Native Messaging для отправки JSON
от клиента (приложения) к хосту
#!/bin/bash
# Loop forever, to deal with chrome.runtime.connectNative
while IFS= read -r -n1 c; do
# Read the first message
# Assuming that the message ALWAYS ends with a },
# with no }s in the string. Adopt this piece of code if needed.
if [ "$c" != '}' ] ; then
continue
fi
# do stuff
message='{"message": "'$c'"}'
# Calculate the byte size of the string.
# NOTE: This assumes that byte length is identical to the string length!
# Do not use multibyte (unicode) characters, escape them instead, e.g.
# message='"Some unicode character:\u1234"'
messagelen=${#message}
# Convert to an integer in native byte order.
# If you see an error message in Chrome's stdout with
# "Native Messaging host tried sending a message that is ... bytes long.",
# then just swap the order, i.e. messagelen1 <-> messagelen4 and
# messagelen2 <-> messagelen3
messagelen1=$(( ($messagelen ) & 0xFF ))
messagelen2=$(( ($messagelen >> 8) & 0xFF ))
messagelen3=$(( ($messagelen >> 16) & 0xFF ))
messagelen4=$(( ($messagelen >> 24) & 0xFF ))
# Print the message byte length followed by the actual message.
printf "$(printf '\\x%x\\x%x\\x%x\\x%x' \
$messagelen1 $messagelen2 $messagelen3 $messagelen4)%s" "$message"
done
что приводит к
{"message":"}"}
получать на клиентское приложение.
Цикл явно не захватывает переменную $c
в пределах while
петля.
С JSON-вводом от клиента
{"text":"abc"}
используя JavaScript, мы можем получить единственное свойство строки JSON, проверив символы в предыдущих и последующих индексах
var result = "";
var i = 0;
var input = '{"text":"abc"}';
while (i < input.length) {
if (input[i - 2] === ":" && input[i - 1] === '"' || result.length) {
result += input[i];
}
if (input[i + 1] === '"' && input[i + 2] === "}") {
// do stuff
break;
}
++i;
};
console.log(result);
пока не уверен точно, как скрыть if
условия для bash из JavaScript, чтобы получить единственное свойство JSON, которому приведенный выше код будет соответствовать, и объединить его в строку, описанную ниже. Как сравнить две строковые переменные в операторе if в Bash? и как объединить строковые переменные в Bash?, И учитывая объект JSON, имеющий вложенные свойства, используя вложенные или множественные, если условия потребуют корректировки кода потенциально несколько раз для конкретного JSON, передаваемого хосту.
Документация описывает протокол
Собственный протокол обмена сообщениями
Chrome запускает каждый собственный узел обмена сообщениями в отдельном процессе и связывается с ним, используя стандартный ввод (stdin) и стандартный вывод (stdout). Один и тот же формат используется для отправки сообщений в обоих направлениях: каждое сообщение сериализуется с использованием JSON, в кодировке UTF-8 и ему предшествует 32-битная длина сообщения в собственном байтовом порядке.
Не удалось найти ответы в SO, в котором определенно описана процедура синтаксического анализа JSON из stdin на хосте приложения Chrome Native Messsaging с использованием bash.
Как создать общее решение или алгоритм (включая описания каждого шага, необходимого для протокола и языка) для анализа JSON, отправленного клиентом на хосте из stdin
получить и установить правильную длину 32-битного сообщения в собственном байтовом порядке в ответном сообщении JSON, которое будет отправлено (например, echo
; printf
) клиенту, использующему bash?