Перехватывание http-on-modify-request
Заметил некоторые странности при работе с application/x-www-form-urlencoded
и multipart/form-data
.
Вот кусок кода:
if (topic == "http-on-modify-request") { subject.QueryInterface(Components.interfaces.nsIHttpChannel); const SCRIPTABLE_STREAM_CID = "@mozilla.org/scriptableinputstream;1"; const nsIScriptableInputStream = Components.interfaces.nsIScriptableInputStream; if (subject.requestMethod=="POST"){ subject.QueryInterface(Components.interfaces.nsIUploadChannel); subject.uploadStream.QueryInterface(Components.interfaces.nsISeekableStream); var uploadStream = subject.uploadStream; var sInputStream = Components.classes[SCRIPTABLE_STREAM_CID].createInstance(nsIScriptableInputStream); sInputStream.init(uploadStream); var str; if (sInputStream.available()>0){ str = sInputStream.read(sInputStream.available()); uploadStream.seek(0,0); } [...] } }
Нужно ли закрывать sInputStream
? Для application/x-www-form-urlencoded
закрытие sInputStream
не влечёт за собой никаких видимых последствий, в случае multipart/form-data
"POST" не выполняется.
Закрывать конечно же нельзя, это закроет и uploadStream тоже. То, что application/x-www-form-urlencoded
тем не менее работает, лишь означает, что используется тип потока, который игнорирует закрытие — после закрытия потока все равно можно читать дальше.
Более того, не стоит слишком сильно рассчитывать на то, что uploadStream поддерживает операцию seek(). Вполне может попасться случай, когда данные можно прочитать только один раз (как раз с multipart/form-data
).
BlockSite это делает. Если нужно запретить соединение, делаем:
aSubject.loadFlags = Components.interfaces.nsICachingChannel.LOAD_ONLY_FROM_CACHE; aSubject.cancel(Components.results.NS_ERROR_FAILURE);
Первая строчка нужна из-за ошибки в Gecko 1.8, после вызова cancel соединение все равно устанавливается.