Firefox addon - ловить переменные поста перед отправкой [без enctype]

У меня есть следующая форма:

<form method="post" action="includes/do.php">
    <input type="text" name="action" value="login" />
    <input type="text" name="email" value="myemail@hotmail.com" />
    <input type="text" name="pass" value="helloworld" />
    <input type="submit" value="Send" />
</form>

Затем я хочу поймать значения переменных перед отправкой внутри firefox addon observer, Обратите внимание, что форма не имеет атрибута: enctype="multipart/form-data", Это важная деталь, потому что у меня есть код, который позволяет мне получать данные поста, но он работает только если enctype="multipart/form-data",

Я уверен, что я должен использовать:

var scrStream = Cc["@mozilla.org/scriptableinputstream;1"]
                .createInstance(Ci.nsIScriptableInputStream);

но у меня пока нет рабочего кода (я новичок).

Я хочу получить что-то вроде:

{
    "action": "login",
    "email": "myemail@hotmail.com",
    "pass": "helloworld"
}

Если вы знаете о какой-то функции со следующим интерфейсом, тогда лучше:

function get_post_data(channel) {
    var data;
    // ...
    return data
}

Спасибо!

1 ответ

Решение

Учитывая, что у вас есть nsIUploadChannel канал, вы можете прочитать содержимое потока и проанализировать их, как будто они где GET параметры (например, some=value&someother=thing).

чтение

var instream = Cc["@mozilla.org/scriptableinputstream;1"].
               createInstance(Ci.nsIScriptableInputStream);
instream.init(channel.uploadStream);
var data = instream.read(instream.available());

Сохранение исходного потока загрузки без изменений

Есть некоторые вещи, которые следует учитывать, если вы хотите иметь оригинал .uploadStream все еще работает, а именно вы не должны получить доступ nsIMultiplexInputStream экземпляры вообще (они сломаются) и вы должны проверить nsISeekableStream и перемотать поток.

var ustream = channel.uploadStream;
if (ustream instanceof Ci.nsIMultiplexInputStream) {
  throw new Error("multiplexed input streams are not supported!");
}
if (!(ustream instanceof Ci.nsISeekableStream)) {
  throw new Error("cannot rewind upload stream; not touching");
}
var pos = ustream.tell();
var instream = Cc["@mozilla.org/scriptableinputstream;1"].
               createInstance(Ci.nsIScriptableInputStream);
instream.init(ustream);
var data = instream.read(instream.available());
ustream.seek(0, pos); // restore position

Если вы замените поток на .setUploadStream во всяком случае, тогда это не так уж много проблем и может быть проигнорировано.

анализ

Как именно вы разбираете GET Параметры стиля зависят от вас и уже обсуждались в других ответах. Единственное, что нужно помнить, это то, что обычно GET парсеры ожидают ведущего ? (например ?some=value), POST данные не имеют этого (например, просто some=value).

Другие вопросы по тегам