Firefox 插件 - 在提交之前捕获 post 个变量 [no enctype]
Firefox addon - Catch post variables before submit [no 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"
。这是一个重要的细节,因为我有一个代码可以让我获取 post 数据,但它仅在 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
}
谢谢!
假设你有一个 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
样式参数取决于您,并且已在 other answers 中讨论过。
唯一要记住的是,通常 GET
解析器期望前导 ?
(例如 ?some=value
),POST
数据没有那个(例如 some=value
) .
我有以下表格:
<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"
。这是一个重要的细节,因为我有一个代码可以让我获取 post 数据,但它仅在 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
}
谢谢!
假设你有一个 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
样式参数取决于您,并且已在 other answers 中讨论过。
唯一要记住的是,通常 GET
解析器期望前导 ?
(例如 ?some=value
),POST
数据没有那个(例如 some=value
) .