Well, this works for me on Firefox 2.0. I'm not sure what else to do...
[EMAIL PROTECTED] wrote:
> On Feb 21, 4:59 pm, Nikitas Liogkas <[EMAIL PROTECTED]> wrote:
>> I believe you have to make the stream seekable (so that you can rewind
>> it after you read it, in order for the POST request to be sent to the
>> server properly), and, if you are using JavaScript, scriptable (so that
>> we can access it from JavaScript).
>>
>> So, assuming you intercept the request before it is sent to the server,
>> you would do something like:
>> channel.QueryInterface(Components.interfaces.nsIUploadChannel);
>> channel.uploadStream.QueryInterface(Components.interfaces.nsISeekableStream);
>> var stream = Components.classes["@mozilla.org/scriptableinputstream;1"]
>>
>> .createInstance(Components.interfaces.nsIScriptableInputStream);
>> stream.init(channel.uploadStream);
>> channel.uploadStream.seek(Components.interfaces.nsISeekableStream.NS_SEEK_SET,
>> 0);
>>
>> ...then read from stream: stream.read(...)
>>
>> ...and finally maybe set the POST body to something else, depending on
>> what you read in, and allow the request to proceed:
>> var stringStream =
>> Components.classes["@mozilla.org/io/string-input-stream;1"]
>> .createInstance(Components.interfaces.nsIStringInputStream);
>> var newbody = <some string>;
>> stringStream.setData(newbody, newbody.length);
>>
>> // have to rewind the stream before setting the new POST body
>> channel.QueryInterface(Components.interfaces.nsIUploadChannel);
>> channel.uploadStream.QueryInterface(Components.interfaces.nsISeekableStream);
>> channel.uploadStream.seek(Components.interfaces.nsISeekableStream.NS_SEEK_SET,
>> 0);
>>
>> channel.uploadStream.QueryInterface(Components.interfaces.nsIMIMEInputStream);
>> channel.uploadStream.setData(stringStream);
>>
>
> I did try something like this but the setData part does not work. the
> original POST data is sent to the server.
>
> What is the correct way of modifying POST data. What I try to do is
> to add some prefix value string for some name=value in the POST data.
>
> Thanks,
> Wayne
>
>> Since you are using C++, you probably do not need to cast to
>> nsIScriptableInputStream at the beginning.
>>
>> HTH
>>
>> nikitas
>>
>> [EMAIL PROTECTED] wrote:
>>> On Feb 20, 12:01 am, [EMAIL PROTECTED] wrote:
>>>> Hi,
>>>> Can you please tell me how can I get the HTTP Post data from a http
>>>> observer?
>>>> Thank you.
>>> I did some research, and come up the following code.
>>> But when i read the UploadStream, it always return 0. I have checked
>>> via etheral, there is post data, but my code just is not able to read
>>> it.
>>> Can you please tell me what did I do wrong?
>>> here is an overview of what I did:
>>> 1. cast the observer subject to be a nsIUploadChannel
>>> 2. get the Upload input Stream from the uploadChannel
>>> 3. read from the upload input stream.
>>> But i just get 0 when I read from the stream.
>>> nsCAutoString requestMethod;
>>> nsCOMPtr<nsIHttpChannel> channel =
>>> do_QueryInterface(aSubject);
>>> channel->GetRequestMethod(requestMethod);
>>> FILE* log = fopen( "http.log", "a+");
>>> if (requestMethod.Equals("POST") ) {
>>> nsCOMPtr<nsIUploadChannel> uploadChannel =
>>> do_QueryInterface(aSubject);
>>> if (uploadChannel) {
>>> nsCOMPtr<nsIInputStream> is;
>>> uploadChannel->GetUploadStream(getter_AddRefs(is));
>>> if(is) {
>>> nsresult rv2;
>>> PRUint32 numRead;
>>> char buf[512];
>>> fprintf (log, "%s POST ",uri);
>>> while (1)
>>> {
>>> rv = is->Read(buf, sizeof(buf), &numRead);
>>> if (NS_FAILED(rv))
>>> {
>>> printf("### error reading stream: %x\n", rv);
>>> fprintf (log, " error ");
>>> break;
>>> }
>>> if (numRead == 0) {
>>> fprintf (log, " nothing ");
>>> break;
>>> }
>>> buf[numRead -1]= '\0';
>>> // buf now contains numRead bytes of data
>>> fprintf (log, "%s",buf);
>>> }
>>> fprintf (log, "\n");
>>> }
>>> } else {
>>> fprintf (log, "%s POST \n",uri);
>>> }
>>> } else {
>>> fprintf (log, "%s\n",uri);
>>> }
>>> fclose(log);
>
_______________________________________________
dev-tech-network mailing list
[email protected]
https://lists.mozilla.org/listinfo/dev-tech-network