21
|
1 |
/*
|
|
2 |
* Copyright (c) 2001-2008 Nokia Corporation and/or its subsidiary(-ies).
|
|
3 |
* All rights reserved.
|
|
4 |
* This component and the accompanying materials are made available
|
|
5 |
* under the terms of "Eclipse Public License v1.0"
|
|
6 |
* which accompanies this distribution, and is available
|
|
7 |
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
|
|
8 |
*
|
|
9 |
* Initial Contributors:
|
|
10 |
* Nokia Corporation - initial contribution.
|
|
11 |
*
|
|
12 |
* Contributors:
|
|
13 |
*
|
|
14 |
* Description:
|
|
15 |
*
|
|
16 |
*/
|
|
17 |
|
|
18 |
|
|
19 |
#include <uri8.h>
|
|
20 |
#include <e32base.h>
|
|
21 |
//#include <http.h>
|
|
22 |
#include <httpclientserver.h>
|
|
23 |
#include <chttpformencoder.h>
|
|
24 |
#include <ssl.h>
|
|
25 |
#include <signed.h>
|
|
26 |
#include <commdbconnpref.h>
|
|
27 |
#include "bjrhttpserver.h"
|
|
28 |
#include <escapeutils.h>
|
|
29 |
|
|
30 |
const TChar KHttpSlash = '/';
|
|
31 |
const TChar KFileSlash = '\\';
|
|
32 |
|
|
33 |
// format for output of data/time values
|
|
34 |
//_LIT(KDateFormat,"%D%M%Y%/0%1%/1%2%/2%3%/3 %:0%H%:1%T%:2%S.%C%:3");
|
|
35 |
|
|
36 |
// Format for hook file name and location for hooks
|
|
37 |
//_LIT(KHookFormat, "Z:\\httptest\\%S.esk");
|
|
38 |
//_LIT(KHookDir, "C:\\System\\Data\\");
|
|
39 |
|
|
40 |
//_LIT(KEnterProx, "Enter Proxy authority");
|
|
41 |
//_LIT(KEnterHook, "Enter Hook name (preface with '-' to delete)");
|
|
42 |
//_LIT(KEnterSessId, "Enter Session ID (positive integer or 'none')");
|
|
43 |
|
|
44 |
_LIT8 (KAbsDocumentRoot, "/Images/");
|
|
45 |
_LIT8 (KRelDocumentRoot, "/Images");
|
|
46 |
_LIT8 (KRoot, "c:\\data\\");
|
|
47 |
_LIT8 (KHomePage, "Images/index.html");
|
|
48 |
_LIT8 (KFound, "Found");
|
|
49 |
_LIT8 (KOk, "OK");
|
|
50 |
_LIT8 (KNotFound, "Not Found");
|
|
51 |
_LIT8(KTextContent, "text/");
|
|
52 |
_LIT8(KImageContent, "image/");
|
|
53 |
_LIT(KHtml, "html");
|
|
54 |
_LIT8(KGif, "gif");
|
|
55 |
/* If the file httpexampleclient.txt exists in the root directory of a drive
|
|
56 |
it will be used to provide default initial values for when setting the URL,
|
|
57 |
proxy, etc. The file format is:
|
|
58 |
[var] = [value]
|
|
59 |
for example:
|
|
60 |
PROXY = my.proxy.co.uk:5473
|
|
61 |
URL = http://www.example.org/dir/file.html
|
|
62 |
whitespace is ignored.
|
|
63 |
|
|
64 |
Note: these are the the values set at run time, they are merely the default
|
|
65 |
options presented to the user. In the above example the proxy is not turned
|
|
66 |
on by default, but the string "my.proxy.co.uk:5473" is presetned as the default
|
|
67 |
option when the use hits "p", saving them the need to have to type it in.
|
|
68 |
*/
|
|
69 |
// Defaults
|
|
70 |
_LIT(KDefaultFileFormat,"%c:\\httpexampleserver.txt");
|
|
71 |
_LIT(KHookString, "HOOK");
|
|
72 |
_LIT(KProxyString, "PROXY");
|
|
73 |
_LIT(KURLString, "URL");
|
|
74 |
_LIT(KSessionIdString, "SESSIONID");
|
|
75 |
//_LIT(KNone, "none");
|
|
76 |
//_LIT(KSchemeHttps, "https");
|
|
77 |
|
|
78 |
|
|
79 |
|
|
80 |
// File system root
|
|
81 |
//_LIT(KFileSystemRoot,"C:\\");
|
|
82 |
//added on July13,09
|
|
83 |
_LIT(KFileName,"c:\\logs\\logs.txt");
|
|
84 |
_LIT(KFileName2,"c:\\logs\\logs2.txt");
|
|
85 |
|
|
86 |
_LIT(KServerLog,"c:\\httpserverlog.txt");
|
|
87 |
|
|
88 |
const TInt endpos = 0;
|
|
89 |
enum THttpExampleClientPanics
|
|
90 |
{
|
|
91 |
EReqBodySumitBufferNotAllocated,
|
|
92 |
KBodyWithInvalidSize,
|
|
93 |
KCouldntNotifyBodyDataPart
|
|
94 |
};
|
|
95 |
|
|
96 |
// Size of buffer used when submitting request bodies
|
|
97 |
//const TInt KMaxSubmitSize = 1024;
|
|
98 |
//const TInt KMaxHeaderNameLen = 32;
|
|
99 |
//const TInt KMaxHeaderValueLen = 128;
|
|
100 |
|
|
101 |
|
|
102 |
//
|
|
103 |
// Implementation of CHttpServer
|
|
104 |
//
|
|
105 |
|
|
106 |
|
|
107 |
// Supplied as the name of the test program to CHttpExampleUtils
|
|
108 |
_LIT(KHttpExampleClientTestName, "HttpExampleServer");
|
|
109 |
|
|
110 |
CHttpServer::CHttpServer ()
|
|
111 |
{
|
|
112 |
__FLOG_OPEN ( "http", "httpexampleserver.txt" );
|
|
113 |
__FLOG_0 ( _T8 ( "CHttpServer::CHttpServer "));
|
|
114 |
// Initial timestamp is time now
|
|
115 |
ResetTimeElapsed();
|
|
116 |
}
|
|
117 |
|
|
118 |
|
|
119 |
CHttpServer::~CHttpServer()
|
|
120 |
{
|
|
121 |
__FLOG_0 ( _T8 ( "CHttpServer::~CHttpServer"));
|
|
122 |
CleanupTransactions ();
|
|
123 |
//iLogFile.Close();
|
|
124 |
iSess.Close();
|
|
125 |
//delete iUtils;
|
|
126 |
iFileServ.Close();
|
|
127 |
iConnection.Close();
|
|
128 |
iSocketServ.Close();
|
|
129 |
|
|
130 |
iIPAddr.Close();
|
|
131 |
}
|
|
132 |
|
|
133 |
CHttpServer* CHttpServer::NewLC()
|
|
134 |
{
|
|
135 |
CHttpServer* me = new(ELeave) CHttpServer;
|
|
136 |
CleanupStack::PushL(me);
|
|
137 |
me->ConstructL();
|
|
138 |
return me;
|
|
139 |
}
|
|
140 |
|
|
141 |
CHttpServer* CHttpServer::NewL()
|
|
142 |
{
|
|
143 |
CHttpServer* me = NewLC();
|
|
144 |
CleanupStack::Pop(me);
|
|
145 |
return me;
|
|
146 |
}
|
|
147 |
|
|
148 |
void CHttpServer::ConstructL()
|
|
149 |
{
|
|
150 |
__FLOG_0 ( _T8 ( "CHttpServer::ConstructL"));
|
|
151 |
//iUtils = CHttpExampleUtils::NewL(KHttpExampleClientTestName, *this );
|
|
152 |
User::LeaveIfError(iFileServ.Connect());
|
|
153 |
iLogFile.Replace(iFileServ,KServerLog,EFileWrite);
|
|
154 |
_LIT8(Kmsg,"\nChttpServer::ConstructL");
|
|
155 |
iLogFile.Write(Kmsg);
|
|
156 |
User::LeaveIfError( iSocketServ.Connect() );
|
|
157 |
|
|
158 |
}
|
|
159 |
|
|
160 |
RHTTPTransaction CHttpServer::NewTransactionL ( const TUriC8& aUri, RStringF aMethod )
|
|
161 |
{
|
|
162 |
__FLOG_0 ( _T8 ( "CHttpServer::NewTransactionL "));
|
|
163 |
CHttpServerTransactionBase* trans = CHttpDataTransmitter::NewL (*this, /*iUtils,*/ iFileServ, iSess, aUri, aMethod);
|
|
164 |
iTransactions.Append(trans);
|
|
165 |
return trans->Transaction ();
|
|
166 |
}
|
|
167 |
|
|
168 |
// to avoid code bloat
|
|
169 |
#define CHECKVAL(name) if(var==K ##name##String) {a##name.Copy(val);}
|
|
170 |
|
|
171 |
void CHttpServer::SetDefaults(TDes& aURL, TDes& aProxy, TDes& aHook, TDes& aSessionId)
|
|
172 |
{
|
|
173 |
__FLOG_4 ( _T8 ( "CHttpServer::SetDefaults [aURL=%S,aProxy=%S,aHook=%S,aSessionId=%S]"), &aURL, &aProxy, &aHook, &aSessionId);
|
|
174 |
TFileName filename;
|
|
175 |
RFile file;
|
|
176 |
filename.Format(KDefaultFileFormat, 'C');
|
|
177 |
TInt err = file.Open(iFileServ, filename, EFileRead);
|
|
178 |
if(err != KErrNone)
|
|
179 |
{
|
|
180 |
filename.Format(KDefaultFileFormat, 'Z');
|
|
181 |
err = file.Open(iFileServ, filename, EFileRead);
|
|
182 |
}
|
|
183 |
if(err == KErrNone)
|
|
184 |
{
|
|
185 |
TFileText line;
|
|
186 |
line.Set(file);
|
|
187 |
TInt err = line.Read(filename);
|
|
188 |
while(err == KErrNone || err ==KErrTooBig)
|
|
189 |
{
|
|
190 |
filename.Trim();
|
|
191 |
TInt div = filename.Locate('=');
|
|
192 |
if(div>0)
|
|
193 |
{
|
|
194 |
TInt i;
|
|
195 |
for (i=div-1;i>0 && filename[i]==' ';i--); // ibid
|
|
196 |
TPtrC var = filename.Left(i+1);
|
|
197 |
for (i=div+1;i<filename.Length() && filename[i]==' ';i++); //ibid
|
|
198 |
TPtrC val = filename.Right(filename.Length()-i);
|
|
199 |
CHECKVAL(Hook)
|
|
200 |
else CHECKVAL(Proxy)
|
|
201 |
else CHECKVAL(URL)
|
|
202 |
else CHECKVAL(SessionId);
|
|
203 |
__FLOG_3 ( _T8 ( "CHttpServer::SetDefaults [URL=%S,Proxy=%S,SessionId=%S]"), &aURL, &aProxy, &aSessionId);
|
|
204 |
}
|
|
205 |
err = line.Read(filename);
|
|
206 |
}
|
|
207 |
}
|
|
208 |
file.Close();
|
|
209 |
}
|
|
210 |
|
|
211 |
|
|
212 |
void CHttpServer::SetupClientL ()
|
|
213 |
{
|
|
214 |
__FLOG_0 ( _T8 ( "CHttpServer::SetupClientL "));
|
|
215 |
ResetTimeElapsed();
|
|
216 |
TBuf<256> url;
|
|
217 |
TBuf<256> prox;
|
|
218 |
TBuf<256> hook;
|
|
219 |
TBuf<16> sessid;
|
|
220 |
SetDefaults(url, prox, hook, sessid);
|
|
221 |
|
|
222 |
|
|
223 |
//iUtils->Test().Console()->ClearScreen();
|
|
224 |
_LIT(KSelectOption, "\n\n Select an option \n\n");
|
|
225 |
//iUtils->Test().Printf(KSelectOption);
|
|
226 |
_LIT(KPossibleSelectionsText, " 1 Start \n 2 Stop \n 3 Exit\n");
|
|
227 |
_LIT(KPossibleSelections,"123");
|
|
228 |
//iUtils->RequestSelection ( KPossibleSelectionsText, KPossibleSelections );
|
|
229 |
}
|
|
230 |
|
|
231 |
void CHttpServer::StartConnectionL(TInt aIapId)
|
|
232 |
{
|
|
233 |
// Connection preferences
|
|
234 |
TCommDbConnPref commDbConnPref;
|
|
235 |
TUint32 iap(aIapId);
|
|
236 |
_LIT8(Kmsg,"\nCHttpServer::StartConnectionL");
|
|
237 |
iLogFile.Write(Kmsg);
|
|
238 |
commDbConnPref.SetIapId( iap );
|
|
239 |
commDbConnPref.SetDialogPreference( ECommDbDialogPrefDoNotPrompt );
|
|
240 |
commDbConnPref.SetBearerSet( ECommDbBearerWLAN );
|
|
241 |
|
|
242 |
User::LeaveIfError( iConnection.Open( iSocketServ ) );
|
|
243 |
User::LeaveIfError( iConnection.Start( commDbConnPref ) );
|
|
244 |
_LIT8(Kmsg2,"\nConnection started");
|
|
245 |
iLogFile.Write(Kmsg2);
|
|
246 |
}
|
|
247 |
|
|
248 |
|
|
249 |
TInt CHttpServer::GetLocalHost ( TSockAddr& aAddr )
|
|
250 |
{
|
|
251 |
RSocket socket;
|
|
252 |
TInt err = socket.Open ( iSocketServ, KAfInet, KSockStream, KProtocolInetTcp );
|
|
253 |
|
|
254 |
if ( err == KErrNone )
|
|
255 |
{
|
|
256 |
TInetAddr localHost;
|
|
257 |
localHost.SetAddress ( KInetAddrAny );
|
|
258 |
TPckgBuf<TSoInetIfQuery> query;
|
|
259 |
query ().iDstAddr = localHost;
|
|
260 |
|
|
261 |
err = socket.GetOpt ( KSoInetIfQueryByDstAddr, KSolInetIfQuery, query );
|
|
262 |
|
|
263 |
if ( err == KErrNone )
|
|
264 |
{
|
|
265 |
// its local IP address
|
|
266 |
localHost = query ().iSrcAddr;
|
|
267 |
aAddr = localHost;
|
|
268 |
}
|
|
269 |
}
|
|
270 |
socket.Close ();
|
|
271 |
return err;
|
|
272 |
}
|
|
273 |
|
|
274 |
TDesC8& CHttpServer::GetIPAddress()
|
|
275 |
{
|
|
276 |
return iIPAddr;
|
|
277 |
}
|
|
278 |
|
|
279 |
|
|
280 |
void CHttpServer::ProcessSelectionL ( TInt aSelection )
|
|
281 |
{
|
|
282 |
__FLOG_1 ( _T8 ( "CHttpServer::ProcessSelection [aSelection =%d]"), aSelection );
|
|
283 |
//_LIT8(Kmsg,"\n CHttpServer::ProcessSelection");
|
|
284 |
//iLogFile.Write(Kmsg);
|
|
285 |
switch ( aSelection )
|
|
286 |
{
|
|
287 |
case EStart:
|
|
288 |
{
|
|
289 |
_LIT8 ( KHTTPServer, "HTTd/TCP" );
|
|
290 |
|
|
291 |
//_LIT8(Kmsg2,"Opening server RHTTPClientServerSession - ");
|
|
292 |
//iLogFile.Write(Kmsg2);
|
|
293 |
//iLogFile.Write(KHTTPServer);
|
|
294 |
// Open the RHTTPClientServerSession
|
|
295 |
_LIT8(Kmsg2,"\nTrying to connect...");
|
|
296 |
iLogFile.Write(Kmsg2);
|
|
297 |
//StartConnectionL(aIapId);
|
|
298 |
|
|
299 |
iSess.OpenL ( KHTTPServer () );
|
|
300 |
_LIT8(Kmsg3,"\nRHTTPClientServerSession opened");
|
|
301 |
iLogFile.Write(Kmsg3);
|
|
302 |
/*
|
|
303 |
RHTTPConnectionInfo connInfo = iSess.ConnectionInfo();
|
|
304 |
|
|
305 |
//Attach to socket server
|
|
306 |
connInfo.SetPropertyL( iSess.StringPool().StringF(HTTP::EHttpSocketServ,
|
|
307 |
RHTTPClientServerSession::GetTable() ),
|
|
308 |
THTTPHdrVal(iSocketServ.Handle() ) );
|
|
309 |
|
|
310 |
//Attach to connection
|
|
311 |
TInt connPtr = reinterpret_cast<TInt>( &iConnection );
|
|
312 |
connInfo.SetPropertyL( iSess.StringPool().StringF(
|
|
313 |
HTTP::EHttpSocketConnection,
|
|
314 |
RHTTPClientServerSession::GetTable() ),
|
|
315 |
THTTPHdrVal(connPtr) );
|
|
316 |
*/
|
|
317 |
|
|
318 |
iSess.RegisterDocumentRootL ( KAbsDocumentRoot, *this );
|
|
319 |
_LIT8(Kmsg4,"\nDocumentRoot registered");
|
|
320 |
iLogFile.Write(Kmsg4);
|
|
321 |
iSess.SetSessionEventCallback ( this );
|
|
322 |
|
|
323 |
//iUtils->Test ().Console ()->ClearScreen ();
|
|
324 |
_LIT ( KServerStartedMsg, "Http Server Started at Root..." );
|
|
325 |
|
|
326 |
//_LIT8(Kmsg3,"server started");
|
|
327 |
//iLogFile.Write(Kmsg3);
|
|
328 |
|
|
329 |
//iUtils->Test ().Printf ( KServerStartedMsg );
|
|
330 |
__FLOG_0 ( _T8 ( "Http Server Started at Root... "));
|
|
331 |
|
|
332 |
RStringPool stringPool = iSess.StringPool ();
|
|
333 |
THTTPHdrVal ipValue;
|
|
334 |
iSess.PropertySet ().Property ( stringPool.StringF ( HTTP::ELocalHost, RHTTPClientServerSession::GetTable () ), ipValue );
|
|
335 |
//RBuf ipBuf;
|
|
336 |
//ipBuf.Create ( ipValue.StrF ().DesC ().Length () );
|
|
337 |
//ipBuf.Copy ( ipValue.StrF ().DesC () );
|
|
338 |
//iUtils->Test ().Printf ( _L ( "http://" ) );
|
|
339 |
//iUtils->Test ().Printf ( ipBuf );
|
|
340 |
//iUtils->Test ().Printf ( _L ( "/pws/" ) );
|
|
341 |
//ipBuf.Close ();
|
|
342 |
TInt length = ipValue.StrF ().DesC ().Length ();
|
|
343 |
|
|
344 |
iIPAddr.Create(length);
|
|
345 |
iIPAddr.Copy(ipValue.StrF ().DesC ());
|
|
346 |
|
|
347 |
_LIT8(Kmsg5,"\nIP addr obtained");
|
|
348 |
iLogFile.Write(Kmsg5);
|
|
349 |
|
|
350 |
|
|
351 |
_LIT ( KSelectOption, "\n\n Select an option \n\n" );
|
|
352 |
//iUtils->Test ().Printf ( KSelectOption );
|
|
353 |
_LIT ( KPossibleSelectionsText, " 2 Stop \n 3 Exit\n" );
|
|
354 |
_LIT ( KPossibleSelections,"23" );
|
|
355 |
//iUtils->RequestSelection ( KPossibleSelectionsText, KPossibleSelections );
|
|
356 |
break;
|
|
357 |
}
|
|
358 |
case EStop:
|
|
359 |
{
|
|
360 |
//iUtils->Test ().Console ()->ClearScreen ();
|
|
361 |
_LIT ( KServerStoppedMsg, "Server Stopped..." );
|
|
362 |
//iUtils->Test ().Printf ( KServerStoppedMsg );
|
|
363 |
|
|
364 |
CleanupTransactions ();
|
|
365 |
iSess.Close ();
|
|
366 |
|
|
367 |
//SetupClientL ();
|
|
368 |
|
|
369 |
break;
|
|
370 |
}
|
|
371 |
case EExit:
|
|
372 |
{
|
|
373 |
//CActiveScheduler::Stop ();
|
|
374 |
}
|
|
375 |
break;
|
|
376 |
default:
|
|
377 |
break;
|
|
378 |
}
|
|
379 |
}
|
|
380 |
|
|
381 |
|
|
382 |
void CHttpServer::CleanupTransactions ()
|
|
383 |
{
|
|
384 |
__FLOG_0 ( _T8 ( "CHttpServer::CleanupTransactions "));
|
|
385 |
TInt i = iTransactions.Count () - 1;
|
|
386 |
while ( iTransactions.Count () )
|
|
387 |
{
|
|
388 |
iTransactions[i]->Transaction ().Cancel ();
|
|
389 |
CHttpServerTransactionBase* trans = iTransactions[i];
|
|
390 |
iTransactions.Remove ( i );
|
|
391 |
delete trans;
|
|
392 |
--i;
|
|
393 |
}
|
|
394 |
iTransactions.Close ();
|
|
395 |
}
|
|
396 |
|
|
397 |
void CHttpServer::SetHeaderL(RHTTPHeaders aHeaders, TInt aHdrField, const TDesC8& aHdrValue)
|
|
398 |
{
|
|
399 |
__FLOG_1 ( _T8 ( "CHttpServer::SetHeaderL [aHdrField=%d]"), aHdrField);
|
|
400 |
RStringF valStr = iSess.StringPool().OpenFStringL(aHdrValue);
|
|
401 |
CleanupClosePushL(valStr);
|
|
402 |
THTTPHdrVal val(valStr);
|
|
403 |
aHeaders.SetFieldL(iSess.StringPool().StringF(aHdrField,RHTTPClientServerSession::GetTable()), val);
|
|
404 |
CleanupStack::PopAndDestroy(&valStr);
|
|
405 |
}
|
|
406 |
|
|
407 |
void CHttpServer::ResetTimeElapsed()
|
|
408 |
// Resets timestamp to time now
|
|
409 |
{
|
|
410 |
__FLOG_0 ( _T8 ( "CHttpServer::ResetTimeElapsed"));
|
|
411 |
iLastTimeStamp.UniversalTime();
|
|
412 |
}
|
|
413 |
|
|
414 |
|
|
415 |
void CHttpServer::DisplayTimeElapsed()
|
|
416 |
// Calculate elapsed time since last measurement, and display
|
|
417 |
{
|
|
418 |
__FLOG_0 ( _T8 ( "CHttpServer::DisplayTimeElapsed"));
|
|
419 |
TTime timeNow;
|
|
420 |
timeNow.UniversalTime();
|
|
421 |
TTimeIntervalMicroSeconds elapsedMicroSec =
|
|
422 |
timeNow.MicroSecondsFrom(iLastTimeStamp);
|
|
423 |
iLastTimeStamp = timeNow;
|
|
424 |
/*
|
|
425 |
iUtils->Test().Printf(
|
|
426 |
_L("Time elapsed since last measurement is: %d ms\n"),
|
|
427 |
elapsedMicroSec.Int64()/1000
|
|
428 |
);
|
|
429 |
*/
|
|
430 |
}
|
|
431 |
|
|
432 |
void CHttpServer::OnTransactionCompleted ( CHttpServerTransactionBase* iTrans )
|
|
433 |
{
|
|
434 |
__FLOG_1 ( _T8 ( "CHttpServer::OnTransactionCompleted [iTrans =0x%X]"), iTrans );
|
|
435 |
for ( TInt i = 0; i < iTransactions.Count (); ++i)
|
|
436 |
{
|
|
437 |
if (iTransactions[i] == iTrans)
|
|
438 |
{
|
|
439 |
delete iTrans;
|
|
440 |
iTransactions.Remove (i);
|
|
441 |
break;
|
|
442 |
}
|
|
443 |
}
|
|
444 |
}
|
|
445 |
|
|
446 |
void CHttpServer::MHFSessionRunL ( const THTTPSessionEvent& aEvent )
|
|
447 |
{
|
|
448 |
if ( aEvent.iStatus < 0 )
|
|
449 |
{
|
|
450 |
iSess.Close ();
|
|
451 |
}
|
|
452 |
}
|
|
453 |
|
|
454 |
TInt CHttpServer::MHFSessionRunError ( TInt /*aError*/, const THTTPSessionEvent& /*aEvent*/ )
|
|
455 |
{
|
|
456 |
return KErrNone;
|
|
457 |
}
|
|
458 |
/*
|
|
459 |
void CHttpServer::StartHttpServer()
|
|
460 |
{
|
|
461 |
SetupClientL();
|
|
462 |
}
|
|
463 |
*/
|
|
464 |
|
|
465 |
// ------------------------------------------------------
|
|
466 |
|
|
467 |
CHttpServerTransactionBase::~CHttpServerTransactionBase ()
|
|
468 |
{
|
|
469 |
__FLOG_0 ( _T8 ( "CHttpServerTransactionBase::~CHttpServerTransactionBase "));
|
|
470 |
iFile.Close ();
|
|
471 |
}
|
|
472 |
|
|
473 |
CHttpServerTransactionBase::CHttpServerTransactionBase ( MTransactionNotify& aNotify,/*CHttpExampleUtils& aUtils,*/ RFs& aFileServ )
|
|
474 |
: iNotify (aNotify),
|
|
475 |
iFileServ ( aFileServ )
|
|
476 |
//iUtils ( aUtils )
|
|
477 |
{
|
|
478 |
__FLOG_OPEN ( "http", "httpexampleserver.txt" );
|
|
479 |
__FLOG_0 ( _T8 ( "CHttpServerTransactionBase::CHttpServerTransactionBase "));
|
|
480 |
}
|
|
481 |
|
|
482 |
void CHttpServerTransactionBase::ConstructL ( RHTTPClientServerSession& aSession, const TUriC8& aUri, RStringF aMethod )
|
|
483 |
{
|
|
484 |
__FLOG_0 ( _T8 ( "CHttpServerTransactionBase::ConstructL "));
|
|
485 |
iTransaction = aSession.OpenTransactionL(aUri, *this, aMethod);
|
|
486 |
}
|
|
487 |
|
|
488 |
|
|
489 |
void CHttpServerTransactionBase::MHFRunL(RHTTPTransaction aTransaction, const THTTPEvent& aEvent)
|
|
490 |
{
|
|
491 |
__FLOG_0 ( _T8 ( "CHttpServerTransactionBase::MHFRunL"));
|
|
492 |
switch(aEvent.iStatus)
|
|
493 |
{
|
|
494 |
case THTTPEvent::ESucceeded:
|
|
495 |
case THTTPEvent::EFailed:
|
|
496 |
{
|
|
497 |
aTransaction.Close();
|
|
498 |
iNotify.OnTransactionCompleted(this);
|
|
499 |
} break;
|
|
500 |
default:
|
|
501 |
{
|
|
502 |
if (aEvent.iStatus < 0)
|
|
503 |
{
|
|
504 |
aTransaction.Close ();
|
|
505 |
iNotify.OnTransactionCompleted ( this );
|
|
506 |
}
|
|
507 |
} break;
|
|
508 |
}
|
|
509 |
}
|
|
510 |
|
|
511 |
|
|
512 |
|
|
513 |
|
|
514 |
TInt CHttpServerTransactionBase::MHFRunError(TInt aError, RHTTPTransaction /* aTransaction */, const THTTPEvent& /* aEvent */)
|
|
515 |
{
|
|
516 |
__FLOG_1 ( _T8 ( "CHttpServerTransactionBase::MHFRunError [aError=%d]"), aError);
|
|
517 |
//iUtils.Test().Printf(_L("MHFRunError fired with error code %d\n"), aError);
|
|
518 |
return KErrNone;
|
|
519 |
}
|
|
520 |
|
|
521 |
void CHttpServerTransactionBase::SetHeaderL(RStringPool& aStringPool, RHTTPHeaders aHeaders, TInt aHdrField, const TDesC8& aHdrValue)
|
|
522 |
{
|
|
523 |
__FLOG_1 ( _T8 ( "CHttpServerTransactionBase::SetHeaderL [aHdrField=%d]"), aHdrField);
|
|
524 |
RStringF valStr = aStringPool.OpenFStringL(aHdrValue);
|
|
525 |
CleanupClosePushL(valStr);
|
|
526 |
THTTPHdrVal val(valStr);
|
|
527 |
aHeaders.SetFieldL(aStringPool.StringF(aHdrField,RHTTPClientServerSession::GetTable()), val);
|
|
528 |
CleanupStack::PopAndDestroy(&valStr);
|
|
529 |
}
|
|
530 |
|
|
531 |
|
|
532 |
// -------------------------------------------------------
|
|
533 |
|
|
534 |
CHttpDataTransmitter* CHttpDataTransmitter::NewL ( MTransactionNotify& aNotify,/*CHttpExampleUtils& aUtils,*/ RFs& aFileServ, RHTTPClientServerSession& aSession, const TUriC8& aUri, RStringF aMethod )
|
|
535 |
{
|
|
536 |
CHttpDataTransmitter* self = new (ELeave) CHttpDataTransmitter (aNotify, /*aUtils,*/ aFileServ);
|
|
537 |
CleanupStack::PushL ( self );
|
|
538 |
self->ConstructL ( aSession, aUri, aMethod );
|
|
539 |
CleanupStack::Pop (); // self
|
|
540 |
return self;
|
|
541 |
}
|
|
542 |
|
|
543 |
//
|
|
544 |
// methods from MHTTPTransactionCallback
|
|
545 |
//
|
|
546 |
void CHttpDataTransmitter::MHFRunL(RHTTPTransaction aTransaction, const THTTPEvent& aEvent)
|
|
547 |
{
|
|
548 |
__FLOG_0 ( _T8 ( "CHttpDataTransmitter::MHFRunL"));
|
|
549 |
switch (aEvent.iStatus)
|
|
550 |
{
|
|
551 |
case THTTPEvent::EGotRequestHeaders:
|
|
552 |
{
|
|
553 |
const TUriC8& uri = aTransaction.Request ().URI ();
|
|
554 |
const TDesC8& uriDes = uri.UriDes ();
|
|
555 |
|
|
556 |
if ( uriDes.CompareF ( KAbsDocumentRoot ) == 0
|
|
557 |
|| uriDes.CompareF ( KRelDocumentRoot ) == 0 )
|
|
558 |
{
|
|
559 |
RHTTPResponse response = aTransaction.Response ();
|
|
560 |
RStringPool stringPool = aTransaction.Session ().StringPool ();
|
|
561 |
RHTTPHeaders headers = response.GetHeaderCollection();
|
|
562 |
TBuf8<128> referer;
|
|
563 |
referer.Copy (_L("http://"));
|
|
564 |
RStringF hostStr = stringPool.StringF (HTTP::EHost, RHTTPClientServerSession::GetTable());
|
|
565 |
THTTPHdrVal hostVal;
|
|
566 |
aTransaction.Request().GetHeaderCollection().GetField(hostStr, 0, hostVal);
|
|
567 |
referer.Append(hostVal.StrF().DesC());
|
|
568 |
referer.Append(KHttpSlash);
|
|
569 |
// SetHeaderL (stringPool, headers, HTTP::EReferer, referer);
|
|
570 |
referer.Append(KHomePage);
|
|
571 |
// Root path. Redirect to the home page.
|
|
572 |
SetHeaderL (stringPool, headers, HTTP::ELocation, referer);
|
|
573 |
THTTPHdrVal hdr (0);
|
|
574 |
headers.SetFieldL (stringPool.StringF (HTTP::EContentLength, RHTTPClientServerSession::GetTable()), hdr);
|
|
575 |
response.SetStatusCode(HTTPStatus::EFound);
|
|
576 |
RStringF statusText = stringPool.OpenFStringL ( KFound );
|
|
577 |
|
|
578 |
response.SetStatusText (statusText);
|
|
579 |
statusText.Close ();
|
|
580 |
aTransaction.SubmitL ();
|
|
581 |
//iTransSubmitted = ETrue;
|
|
582 |
}
|
|
583 |
}
|
|
584 |
break;
|
|
585 |
case THTTPEvent::EGotRequestBodyData:
|
|
586 |
{
|
|
587 |
User::Invariant ();
|
|
588 |
}
|
|
589 |
break;
|
|
590 |
case THTTPEvent::ERequestComplete:
|
|
591 |
{
|
|
592 |
if ( !iTransSubmitted )
|
|
593 |
{
|
|
594 |
const TDesC8& uriDes = aTransaction.Request ().URI ().UriDes();
|
|
595 |
// __FLOG_1 ( _T8 ("CHttpdProtocolHandler::MHFRunL: [uriDes = %S]"), uriDes );
|
|
596 |
|
|
597 |
if ( OpenFile (uriDes) == KErrNone )
|
|
598 |
{
|
|
599 |
__FLOG_0 ( _T8 ( "CHttpDataTransmitter::MHFRunL: Sending Ok"));
|
|
600 |
RHTTPResponse response = aTransaction.Response();
|
|
601 |
response.SetBody(*this);
|
|
602 |
RHTTPHeaders headers = aTransaction.Response().GetHeaderCollection();
|
|
603 |
RStringPool stringPool = aTransaction.Session().StringPool();
|
|
604 |
SetHeaderL(stringPool, headers, HTTP::EContentType, iContentType);
|
|
605 |
response.SetStatusCode (HTTPStatus::EOk);
|
|
606 |
RStringF statusText = stringPool.OpenFStringL ( KOk );
|
|
607 |
|
|
608 |
response.SetStatusText (statusText);
|
|
609 |
statusText.Close ();
|
|
610 |
THTTPHdrVal hdr (OverallDataSize());
|
|
611 |
headers.SetFieldL (stringPool.StringF (HTTP::EContentLength, RHTTPClientServerSession::GetTable()), hdr);
|
|
612 |
}
|
|
613 |
else
|
|
614 |
{
|
|
615 |
__FLOG_0 ( _T8 ( "CHttpDataTransmitter::MHFRunL: Sending Not Found"));
|
|
616 |
|
|
617 |
RHTTPResponse response = aTransaction.Response();
|
|
618 |
response.SetStatusCode (HTTPStatus::ENotFound);
|
|
619 |
RStringF statusText = aTransaction.Session().StringPool().OpenFStringL ( KNotFound );
|
|
620 |
|
|
621 |
response.SetStatusText (statusText);
|
|
622 |
statusText.Close ();
|
|
623 |
THTTPHdrVal hdr (0);
|
|
624 |
response.GetHeaderCollection().SetFieldL (aTransaction.Session().StringPool().StringF (HTTP::EContentLength, RHTTPClientServerSession::GetTable()), hdr);
|
|
625 |
}
|
|
626 |
aTransaction.SubmitL ();
|
|
627 |
iTransSubmitted = ETrue;
|
|
628 |
|
|
629 |
}
|
|
630 |
}
|
|
631 |
break;
|
|
632 |
default:
|
|
633 |
CHttpServerTransactionBase::MHFRunL(aTransaction, aEvent);
|
|
634 |
}
|
|
635 |
}
|
|
636 |
|
|
637 |
TInt CHttpDataTransmitter::MHFRunError(TInt aError, RHTTPTransaction aTransaction, const THTTPEvent& aEvent)
|
|
638 |
{
|
|
639 |
__FLOG_1 ( _T8 ( "CHttpDataTransmitter::MHFRunError [aError=%d]"), aError);
|
|
640 |
return CHttpServerTransactionBase::MHFRunError(aError, aTransaction, aEvent);
|
|
641 |
}
|
|
642 |
|
|
643 |
TInt CHttpDataTransmitter::OpenFile( const TDesC8& aHttpPath )
|
|
644 |
{
|
|
645 |
__FLOG_0 ( _T8 ( "CHttpDataTransmitter::OpenFile"));
|
|
646 |
|
|
647 |
TBuf8<256> fileName;
|
|
648 |
fileName.Copy(KRoot);
|
|
649 |
if (aHttpPath.Locate(KHttpSlash) == 0)
|
|
650 |
{
|
|
651 |
// Skip that
|
|
652 |
TPtrC8 ptr (aHttpPath.Mid(1));
|
|
653 |
fileName.Append(ptr);
|
|
654 |
//replace forward slash with backward
|
|
655 |
for ( TInt index = 0; index < fileName.Length (); index++ )
|
|
656 |
{
|
|
657 |
if ( fileName[index] == TChar ( KHttpSlash ) )
|
|
658 |
{
|
|
659 |
fileName[index] = TChar ( '\\' );
|
|
660 |
}
|
|
661 |
}
|
|
662 |
}
|
|
663 |
|
|
664 |
HBufC* fileName16 = EscapeUtils::ConvertToUnicodeFromUtf8L (fileName);
|
|
665 |
TInt err = iFile.Open(iFileServ, *fileName16, EFileShareReadersOnly);
|
|
666 |
|
|
667 |
TPtr ptr2 ( fileName16->Des() );
|
|
668 |
//iUtils.Test().Printf(_L("File Name: %S"), &ptr2);
|
|
669 |
__FLOG_1 ( _T8 ( "CHttpDataTransmitter::OpenFile [Error=%d]"), err);
|
|
670 |
|
|
671 |
// For Hardware
|
|
672 |
if ( err != KErrNone )
|
|
673 |
{
|
|
674 |
ptr2[0] = TChar ( 'Z' );
|
|
675 |
err = iFile.Open ( iFileServ, ptr2, EFileShareReadersOnly );
|
|
676 |
}
|
|
677 |
__FLOG_1 ( _T8 ( "CHttpDataTransmitter::OpenFile [Error=%d]"), err);
|
|
678 |
|
|
679 |
if ( err != KErrNone )
|
|
680 |
{
|
|
681 |
delete fileName16;
|
|
682 |
return err;
|
|
683 |
}
|
|
684 |
|
|
685 |
TParse parser;
|
|
686 |
parser.Set(ptr2, NULL, NULL);
|
|
687 |
|
|
688 |
if ( ptr2.Find(KHtml) != KErrNotFound )
|
|
689 |
{
|
|
690 |
iContentType.Copy(KTextContent);
|
|
691 |
iContentType.Copy(KHtml);
|
|
692 |
}
|
|
693 |
else
|
|
694 |
{
|
|
695 |
iContentType.Copy(KImageContent);
|
|
696 |
iContentType.Copy(KGif);
|
|
697 |
}
|
|
698 |
delete fileName16;
|
|
699 |
iFile.Size(iDataToSend);
|
|
700 |
return KErrNone;
|
|
701 |
}
|
|
702 |
|
|
703 |
CHttpDataTransmitter::CHttpDataTransmitter (MTransactionNotify& aNotify,/*CHttpExampleUtils& aUtils,*/ RFs& aFileServ)
|
|
704 |
: CHttpServerTransactionBase (aNotify, /*aUtils,*/ aFileServ)
|
|
705 |
{
|
|
706 |
__FLOG_OPEN ( "http", "httpexampleserver.txt" );
|
|
707 |
__FLOG_0 ( _T8 ( "CHttpDataTransmitter::CHttpDataTransmitter "));
|
|
708 |
}
|
|
709 |
|
|
710 |
TBool CHttpDataTransmitter::GetNextDataPart(TPtrC8& aDataPart)
|
|
711 |
{
|
|
712 |
__FLOG_0 ( _T8 ( "CHttpDataTransmitter::GetNextDataPart"));
|
|
713 |
iFile.Read (iData);
|
|
714 |
iDataToSend -= iData.Length ();
|
|
715 |
aDataPart.Set (iData);
|
|
716 |
return iDataToSend == 0;
|
|
717 |
}
|
|
718 |
|
|
719 |
void CHttpDataTransmitter::ReleaseData()
|
|
720 |
{
|
|
721 |
__FLOG_0 ( _T8 ( "CHttpDataTransmitter::ReleaseData"));
|
|
722 |
iData.SetLength (0);
|
|
723 |
if (iDataToSend > 0)
|
|
724 |
iTransaction.NotifyNewRequestBodyPartL ();
|
|
725 |
else
|
|
726 |
iFile.Close ();
|
|
727 |
}
|
|
728 |
|
|
729 |
TInt CHttpDataTransmitter::OverallDataSize()
|
|
730 |
{
|
|
731 |
__FLOG_0 ( _T8 ( "CHttpDataTransmitter::OverallDataSize"));
|
|
732 |
TInt size;
|
|
733 |
iFile.Size (size);
|
|
734 |
return size;
|
|
735 |
}
|
|
736 |
|
|
737 |
TInt CHttpDataTransmitter::Reset()
|
|
738 |
{
|
|
739 |
__FLOG_0 ( _T8 ( "CHttpDataTransmitter::Reset"));
|
|
740 |
return KErrNone;
|
|
741 |
}
|
|
742 |
|
|
743 |
|
|
744 |
|
|
745 |
/*
|
|
746 |
// ------------------------------------------------------------
|
|
747 |
|
|
748 |
LOCAL_D void TestL()
|
|
749 |
// Create a test object, invoke the tests using it and remove
|
|
750 |
{
|
|
751 |
|
|
752 |
//TRAPD(err,CHttpExampleUtils::InitCommsL());
|
|
753 |
// create an active scheduler to use
|
|
754 |
CActiveScheduler* scheduler = new(ELeave) CActiveScheduler();
|
|
755 |
CleanupStack::PushL(scheduler);
|
|
756 |
CActiveScheduler::Install(scheduler);
|
|
757 |
|
|
758 |
// Create and start the client
|
|
759 |
CHttpServer* httpCli = CHttpServer::NewL();
|
|
760 |
|
|
761 |
CZeroconfClient* browser = CZeroconfClient::NewL(*httpCli);
|
|
762 |
browser->ConnectL();
|
|
763 |
|
|
764 |
CActiveScheduler::Start();
|
|
765 |
//
|
|
766 |
CleanupStack::PopAndDestroy(1); // scheduler
|
|
767 |
delete httpCli;
|
|
768 |
delete browser;
|
|
769 |
}
|
|
770 |
|
|
771 |
|
|
772 |
GLDEF_C TInt E32Main()
|
|
773 |
// Main program - run the tests within a TRAP harness, reporting any errors that
|
|
774 |
// occur via the panic mechanism. Test for memory leaks using heap marking.
|
|
775 |
{
|
|
776 |
|
|
777 |
__UHEAP_MARK;
|
|
778 |
CTrapCleanup* tc=CTrapCleanup::New();
|
|
779 |
|
|
780 |
TRAPD(err,TestL());
|
|
781 |
|
|
782 |
if (err!=KErrNone)
|
|
783 |
User::Panic(_L("Test failed with error code: %i"), err);
|
|
784 |
delete tc;
|
|
785 |
__UHEAP_MARKEND;
|
|
786 |
return KErrNone;
|
|
787 |
}
|
|
788 |
*/
|
|
789 |
|