изменить почтовые данные запроса в расширении Firefox - PullRequest
1 голос
/ 25 января 2011

Я пытаюсь перехватить http-запрос, изменить некоторые параметры его сообщения и отправить измененный запрос. Я пытался использовать метод setData потока загрузки для изменения запроса, но отправляется тот же исходный запрос.

У меня следующий код, выполняемый по запросу "http-on-modify-request":

//rewind the request to read post body  
channel= subject.QueryInterface(Components.interfaces.nsIHttpChannel);
channel=channel.QueryInterface(Components.interfaces.nsIUploadChannel);  
channel = channel.uploadStream;  
channel.QueryInterface(Components.interfaces.nsISeekableStream)
                .seek(Components.interfaces.nsISeekableStream.NS_SEEK_SET, 0);  
var stream = Components.classes["@mozilla.org/binaryinputstream;1"]
                .createInstance(Components.interfaces.nsIBinaryInputStream);  
stream.setInputStream(channel);  
var postBytes = stream.readByteArray(stream.available());  
poststr = String.fromCharCode.apply(null, postBytes);  

//change the poststr

poststr=poststr.replace(....);  
stringStream.setData(poststr, poststr.length);  
//changing the postdata  
channel = channel.QueryInterface(Components.interfaces.nsIUploadChannel);  
channel = channel.uploadStream;  
channel = channel.QueryInterface(Components.interfaces.nsISeekableStream)
          .seek(Components.interfaces.nsISeekableStream.NS_SEEK_SET, 0);  
channel.uploadStream.QueryInterface(Components.interfaces.nsIMIMEInputStream);  
channel.uploadStream.setData(stringStream);  
channel.send();

Что я здесь не так делаю? Я попытался прервать первоначальный запрос и начать с нового запроса, но затем страница вообще не загружается. Спасибо заранее.

1 Ответ

0 голосов
/ 25 февраля 2011

эй, я понял, что случилось !!:)

В файле uploadstream.setData есть почка.Он устанавливает метод запроса канала в PUT, а не в POST. Поэтому нам нужно изменить это после вызова setData.Следующее, кажется, решает проблему:)

channel.uploadStream.setData(stringStream);   
channel.requestMethod = "POST";  

@ MatrixFrog: Вы правы.Мне не нужно звонить channel.send.Об этой части заботятся:)

...