Hi Francois,

> You should be able to catch it by assigning an event handler to
THttpCli.CtrlSocket.OnBgException

I followed your suggestion and created this :
=====
HttpCli->CtrlSocket->OnBgException=HttpException;
HttpCli->GetASync();
=====
void __fastcall HttpComponent::HttpException
 (TObject *Sender, Exception *E, bool &CanClose)
{
 DebugText("Exception occurred...");
}
=====
Then I trigger an error situation by saving the received http data to a
TFileStream located on an USB memory stick which has insufficient free space
(as describer in my earlier mail). This will trigger an exception in
procedure TStream.WriteBuffer : 'Stream write error' which is located in
'...\Win32\rtl\common\classes.pas'.

Unfortunately, the exception does not cause the handler defined in
HttpCli->CtrlSocket->OnBgException to be called.

Do you have any ideas about what I'm doing wrong ?

Thank you,

Kris
 

-----Original Message-----
From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On
Behalf Of Francois PIETTE
Sent: dinsdag 28 februari 2006 19:37
To: ICS support mailing
Subject: Re: [twsocket] HttpCli->GetASync() exception

> (1) How can I detect that procedure TStream.WriteBuffer has 
> encountered a 'Stream write error' ? I need to catch this exception so 
> I can abort the http transfer (HttpCli->Abort()), but haven't got a 
> clue how/where to do this. Preferably I need a way to communicate this 
> error so that
> HttpRequestDone() is able not only to take HttpCli->StatusCode into 
> account, but also any stream write errors that might have occurred.

You should be able to catch it by assigning an event handler to
THttpCli.CtrlSocket.OnBgException.
Ideally I should expose this OnBgException in THttpCli.

> (2) I was wondering what the variable WORD Error in 
> HttpRequestDone(TObject *Sender, THttpRequest RqType, WORD Error) 
> actually means ?

Mostly winsock errors. Try accessing a host where no server is operating.

> (3) Is it correct to assume that, unlike the synchronous Get, the 
> GetASync()-call does not need a Try{} since, as you already indicated, 
> these exceptions are triggered in a different context anyway ?

Wrong. There may be exception in the early phase, before async operation
occurs.

--
[EMAIL PROTECTED]
http://www.overbyte.be


----- Original Message -----
From: "Kris Schoofs" <[EMAIL PROTECTED]>
To: "'ICS support mailing'" <twsocket@elists.org>
Sent: Tuesday, February 28, 2006 7:15 PM
Subject: Re: [twsocket] HttpCli->GetASync() exception


> Francois,
>
> Thank you for your explanation.
>
> To get into more detail... I'm attempting to code something where I 
> download
> a file using GetASync() and where I'm able to report *all* errors that 
> might
> occur during the download process. However, I'm having some trouble 
> handling
> some situations where things go wrong...
>
> Below is a very small piece of code that helps to illustrate the 
> problem...
> =====
> void HttpComponent::StartDownload(void)
> {
> HttpCli->OnDocBegin=HttpDocBegin;
> HttpCli->OnDocEnd=HttpDocEnd;
> HttpCli->OnRequestDone=HttpRequestDone;
> HttpCli1->GetASync();
> // *** No need for Try{} since exceptions are
> // *** triggered in a different context anyway ?
> }
> =====
> void __fastcall HttpComponent::HttpRequestDone
> (TObject *Sender, THttpRequest RqType, WORD Error)
> {
> // *** Not sure what WORD Error actually contains ?
> DebugText("Error=%d",Error);
> DebugText("StatusCode=%d",HttpCli->StatusCode);
> }
> =====
> void __fastcall HttpComponent::HttpDocBegin(TObject *Sender)
> {
> HttpCli->RcvdStream=new TFileStream(HttpDestinationFile,fmCreate);
> }
> =====
> void __fastcall HttpComponent::HttpDocEnd(TObject *Sender)
> {
> delete HttpCli1->ReceivedStream;
> }
> =====
> When everything goes well and HttpRequestDone() is eventually called I get

> :
> Error=0
> StatusCode=200 (=OK)
>
> I was wondering what would happen if the writing to the FileStream would
> fail for any reason (e.g. no more free space). To simulate such an error I
> saved the FileStream to an USB memory stick that did not have sufficient
> space on it to contain the downloaded file.
>
> This triggers following exception every time a piece of the downloaded 
> file
> is written as soon as I run out of free space on the memory stick  :
> => procedure TStream.WriteBuffer : 'Stream write error'
> When HttpRequestDone() is eventually called it will report :
> Error=0
> StatusCode=200 (=OK)
>
> Even though the actual http transfer never encountered a problem (as
> confirmed by StatusCode=200) things clearly went wrong when when writing 
> the
> received data to the filestream.
>
> I have following questions which I hope someone can clarify :
>
> (1) How can I detect that procedure TStream.WriteBuffer has encountered a
> 'Stream write error' ? I need to catch this exception so I can abort the
> http transfer (HttpCli->Abort()), but haven't got a clue how/where to do
> this. Preferably I need a way to communicate this error so that
> HttpRequestDone() is able not only to take HttpCli->StatusCode into 
> account,
> but also any stream write errors that might have occurred.
>
> (2) I was wondering what the variable WORD Error in 
> HttpRequestDone(TObject
> *Sender, THttpRequest RqType, WORD Error) actually means ?
>
> (3) Is it correct to assume that, unlike the synchronous Get, the
> GetASync()-call does not need a Try{} since, as you already indicated, 
> these
> exceptions are triggered in a different context anyway ?
>
> Thank you,
>
> Kris
>
>
> -----Original Message-----
> From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On
> Behalf Of Francois Piette
> Sent: dinsdag 28 februari 2006 8:48
> To: ICS support mailing
> Subject: Re: [twsocket] HttpCli->GetASync() exception
>
>> The httptest1.cpp example for HttpCli has following exception handling...
>>
>>     try {
>>         HttpCli1->Get();
>>     } __except (TRUE) {
>>         DisplayMemo->Lines->Add("GET Failed !");
>>         DisplayMemo->Lines->Add("StatusCode   = " +
>> IntToStr(HttpCli1->StatusCode));
>>         return;
>>     }
>>
>> I was wondering if an exception can also occur when using
>> HttpCli->GetASync() instead of HttpCli1->Get() ?
>> If so, is it possible to give me an example which errors can be
>> encountered here when calling GetASync() ?
>
> The same exceptions can occur. But they will be triggered in another 
> context
> since it is asynchronous. You can trap them from the
> Application->OnException. You can also trap them where ever you call the
> message pump (all events are actually subroutines called from the message
> pump).
>
> --
> Contribute to the SSL Effort. Visit
> http://www.overbyte.be/eng/ssl.html
> --
> [EMAIL PROTECTED]
> Author of ICS (Internet Component Suite, freeware) Author of MidWare
> (Multi-tier framework, freeware) http://www.overbyte.be
>
>
> --
> To unsubscribe or change your settings for TWSocket mailing list please 
> goto
> http://www.elists.org/mailman/listinfo/twsocket
> Visit our website at http://www.overbyte.be
>
> -- 
> To unsubscribe or change your settings for TWSocket mailing list
> please goto http://www.elists.org/mailman/listinfo/twsocket
> Visit our website at http://www.overbyte.be 

-- 
To unsubscribe or change your settings for TWSocket mailing list
please goto http://www.elists.org/mailman/listinfo/twsocket
Visit our website at http://www.overbyte.be

-- 
To unsubscribe or change your settings for TWSocket mailing list
please goto http://www.elists.org/mailman/listinfo/twsocket
Visit our website at http://www.overbyte.be

Reply via email to