Xpoint
   [напомнить пароль]

Перехватывание http-on-modify-request

2006-10-04 18:04:10 [обр] KML [досье]

Заметил некоторые странности при работе с 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" не выполняется.

спустя 2 часа 47 минут [обр] Владимир Палант [досье]

Закрывать конечно же нельзя, это закроет и uploadStream тоже. То, что application/x-www-form-urlencoded тем не менее работает, лишь означает, что используется тип потока, который игнорирует закрытие — после закрытия потока все равно можно читать дальше.

Более того, не стоит слишком сильно рассчитывать на то, что uploadStream поддерживает операцию seek(). Вполне может попасться случай, когда данные можно прочитать только один раз (как раз с multipart/form-data).

спустя 1 час [обр] KML [досье]
Спасибо, буду проверять поддерживается seek() или нет.
спустя 4 дня [обр] KML [досье]
А можно ли каким-нибудь образом прервать процедуру отправки данных? Например, если я хочу не пропускать некоторые POST запросы.
спустя 26 дней [обр] Владимир Палант [досье]

BlockSite это делает. Если нужно запретить соединение, делаем:

aSubject.loadFlags = Components.interfaces.nsICachingChannel.LOAD_ONLY_FROM_CACHE;
aSubject.cancel(Components.results.NS_ERROR_FAILURE);

Первая строчка нужна из-за ошибки в Gecko 1.8, после вызова cancel соединение все равно устанавливается.

Powered by POEM™ Engine Copyright © 2002-2005