-
Notifications
You must be signed in to change notification settings - Fork 1.6k
/
Copy pathbegingetresponse.cpp
195 lines (166 loc) · 6.98 KB
/
begingetresponse.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
/**
* File name: Begingetresponse::cs
* This program shows how to use BeginGetResponse and EndGetResponse methods of the
* HttpWebRequest class. It also shows how to create a customized timeout.
* This is important in case od asynchronous request, because the NCL classes do
* not provide any off-the-shelf asynchronous timeout.
* It uses an asynchronous approach to get the response for the HTTP Web Request.
* The RequestState class is defined to chekc the state of the request.
* After a HttpWebRequest Object* is created, its BeginGetResponse method is used to start
* the asynchronous response phase.
* Finally, the EndGetResponse method is used to end the asynchronous response phase .
*/
// <Snippet1>
#using <System.dll>
using namespace System;
using namespace System::Net;
using namespace System::IO;
using namespace System::Text;
using namespace System::Threading;
public ref class RequestState
{
private:
// This class stores the State of the request.
const int BUFFER_SIZE;
public:
StringBuilder^ requestData;
array<Byte>^BufferRead;
HttpWebRequest^ request;
HttpWebResponse^ response;
Stream^ streamResponse;
RequestState()
: BUFFER_SIZE( 1024 )
{
BufferRead = gcnew array<Byte>(BUFFER_SIZE);
requestData = gcnew StringBuilder( "" );
request = nullptr;
streamResponse = nullptr;
}
};
ref class HttpWebRequest_BeginGetResponse
{
public:
static ManualResetEvent^ allDone = gcnew ManualResetEvent( false );
literal int BUFFER_SIZE = 1024;
literal int DefaultTimeOut = 120000; // 2 minute timeout
// Abort the request if the timer fires.
static void TimeoutCallback( Object^ state, bool timedOut )
{
if ( timedOut )
{
HttpWebRequest^ request = dynamic_cast<HttpWebRequest^>(state);
if ( request != nullptr )
{
request->Abort();
}
}
}
static void RespCallback( IAsyncResult^ asynchronousResult )
{
try
{
// State of request is asynchronous.
RequestState^ myRequestState = dynamic_cast<RequestState^>(asynchronousResult->AsyncState);
HttpWebRequest^ myHttpWebRequest = myRequestState->request;
myRequestState->response = dynamic_cast<HttpWebResponse^>(myHttpWebRequest->EndGetResponse( asynchronousResult ));
// Read the response into a Stream object.
Stream^ responseStream = myRequestState->response->GetResponseStream();
myRequestState->streamResponse = responseStream;
// Begin the Reading of the contents of the HTML page and print it to the console.
IAsyncResult^ asynchronousInputRead = responseStream->BeginRead( myRequestState->BufferRead, 0, BUFFER_SIZE, gcnew AsyncCallback( ReadCallBack ), myRequestState );
return;
}
catch ( WebException^ e )
{
Console::WriteLine( "\nRespCallback Exception raised!" );
Console::WriteLine( "\nMessage: {0}", e->Message );
Console::WriteLine( "\nStatus: {0}", e->Status );
}
allDone->Set();
}
static void ReadCallBack( IAsyncResult^ asyncResult )
{
try
{
RequestState^ myRequestState = dynamic_cast<RequestState^>(asyncResult->AsyncState);
Stream^ responseStream = myRequestState->streamResponse;
int read = responseStream->EndRead( asyncResult );
// Read the HTML page and then print it to the console.
if ( read > 0 )
{
myRequestState->requestData->Append( Encoding::ASCII->GetString( myRequestState->BufferRead, 0, read ) );
IAsyncResult^ asynchronousResult = responseStream->BeginRead( myRequestState->BufferRead, 0, BUFFER_SIZE, gcnew AsyncCallback( ReadCallBack ), myRequestState );
return;
}
else
{
Console::WriteLine( "\nThe contents of the Html page are : " );
if ( myRequestState->requestData->Length > 1 )
{
String^ stringContent;
stringContent = myRequestState->requestData->ToString();
Console::WriteLine( stringContent );
}
Console::WriteLine( "Press any key to continue.........." );
Console::ReadLine();
responseStream->Close();
}
}
catch ( WebException^ e )
{
Console::WriteLine( "\nReadCallBack Exception raised!" );
Console::WriteLine( "\nMessage: {0}", e->Message );
Console::WriteLine( "\nStatus: {0}", e->Status );
}
allDone->Set();
}
};
int main()
{
try
{
// Create a HttpWebrequest object to the desired URL.
HttpWebRequest^ myHttpWebRequest = dynamic_cast<HttpWebRequest^>(WebRequest::Create( "http://www.contoso.com" ));
/**
* If you are behind a firewall and you do not have your browser proxy setup
* you need to use the following proxy creation code.
// Create a proxy object.
WebProxy* myProxy = new WebProxy();
// Associate a new Uri object to the _wProxy object, using the proxy address
// selected by the user.
myProxy.Address = new Uri(S"http://myproxy");
// Finally, initialize the Web request object proxy property with the _wProxy
// object.
myHttpWebRequest.Proxy=myProxy;
***/
// Create an instance of the RequestState and assign the previous myHttpWebRequest
// object to its request field.
RequestState^ myRequestState = gcnew RequestState;
myRequestState->request = myHttpWebRequest;
// Start the asynchronous request.
IAsyncResult^ result = dynamic_cast<IAsyncResult^>(myHttpWebRequest->BeginGetResponse( gcnew AsyncCallback( HttpWebRequest_BeginGetResponse::RespCallback ), myRequestState ));
// this line impliments the timeout, if there is a timeout, the callback fires and the request becomes aborted
ThreadPool::RegisterWaitForSingleObject( result->AsyncWaitHandle, gcnew WaitOrTimerCallback( HttpWebRequest_BeginGetResponse::TimeoutCallback ), myHttpWebRequest, HttpWebRequest_BeginGetResponse::DefaultTimeOut, true );
// The response came in the allowed time. The work processing will happen in the
// callback function.
HttpWebRequest_BeginGetResponse::allDone->WaitOne();
// Release the HttpWebResponse resource.
myRequestState->response->Close();
}
catch ( WebException^ e )
{
Console::WriteLine( "\nMain Exception raised!" );
Console::WriteLine( "\nMessage: {0}", e->Message );
Console::WriteLine( "\nStatus: {0}", e->Status );
Console::WriteLine( "Press any key to continue.........." );
}
catch ( Exception^ e )
{
Console::WriteLine( "\nMain Exception raised!" );
Console::WriteLine( "Source : {0} ", e->Source );
Console::WriteLine( "Message : {0} ", e->Message );
Console::WriteLine( "Press any key to continue.........." );
Console::Read();
}
}
// </Snippet1>