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'" <[email protected]>
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