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