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)
 // *** 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 ?
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 :
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 :
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,


-----Original Message-----
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

Contribute to the SSL Effort. Visit
Author of ICS (Internet Component Suite, freeware) Author of MidWare
(Multi-tier framework, freeware)

To unsubscribe or change your settings for TWSocket mailing list please goto
Visit our website at

To unsubscribe or change your settings for TWSocket mailing list
please goto
Visit our website at

Reply via email to