webengine/osswebengine/WebCore/platform/network/symbian/HttpConnUtils.cpp
changeset 0 dd21522fd290
child 10 a359256acfc6
equal deleted inserted replaced
-1:000000000000 0:dd21522fd290
       
     1 /*
       
     2 * Copyright (c) 2007 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 the License "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 // INCLUDE FILES
       
    19 #include "HttpConnUtils.h"
       
    20 #include "HttpFilterCommonStringsExt.h"
       
    21 #include <httpstringconstants.h>
       
    22 #include <http/rhttpsession.h>
       
    23 #include <BrCtlDefs.h>
       
    24 #include <flogger.h>
       
    25 #include <sslerr.h>
       
    26 #include <httperr.h>
       
    27 #include <inet6err.h>
       
    28 #include <in_sock.h>
       
    29 
       
    30 // EXTERNAL DATA STRUCTURES
       
    31 
       
    32 // EXTERNAL FUNCTION PROTOTYPES
       
    33 
       
    34 // CONSTANTS
       
    35 
       
    36 // MACROS
       
    37 
       
    38 // LOCAL CONSTANTS AND MACROS
       
    39 
       
    40 // MODULE DATA STRUCTURES
       
    41 
       
    42 // LOCAL FUNCTION PROTOTYPES
       
    43 
       
    44 // FORWARD DECLARATIONS
       
    45 
       
    46 // ============================= LOCAL FUNCTIONS ===============================
       
    47 
       
    48 
       
    49 // ============================ MEMBER FUNCTIONS ===============================
       
    50 
       
    51 
       
    52 // -----------------------------------------------------------------------------
       
    53 // THttpConnUtils::PanicLoader
       
    54 //
       
    55 //
       
    56 // -----------------------------------------------------------------------------
       
    57 //
       
    58 void THttpConnUtils::PanicLoader(
       
    59     TInt aError )
       
    60     {
       
    61     User::Panic( _L( "HTTP Resource Loader" ), aError );
       
    62     }
       
    63 
       
    64 // -----------------------------------------------------------------------------
       
    65 // THttpConnUtils::WriteLog
       
    66 //
       
    67 //
       
    68 // -----------------------------------------------------------------------------
       
    69 //
       
    70 void THttpConnUtils::WriteLog(
       
    71     TPtrC aBuf, TInt aStatus )
       
    72     {
       
    73 #ifdef __WINSCW__
       
    74     RFileLogger::WriteFormat(_L("Browser"), _L("resloader.txt"), EFileLoggingModeAppend,
       
    75             _L("%S %d"), &aBuf, aStatus );
       
    76 #endif //__WINSCW__
       
    77     }
       
    78 
       
    79 // -----------------------------------------------------------------------------
       
    80 // THttpConnUtils::WmlContent
       
    81 //
       
    82 // -----------------------------------------------------------------------------
       
    83 //
       
    84 TBool THttpConnUtils::WmlContent(
       
    85     const TDesC& aContentType )
       
    86     {
       
    87     // very simple check. need something more
       
    88     // sofisticated.
       
    89     return( ( aContentType.Find( _L("wml") ) != KErrNotFound || aContentType.Find( _L("wap") ) != KErrNotFound )
       
    90      && aContentType.Find( _L( "application/vnd.wap.xhtml+xml" ) ) == KErrNotFound );
       
    91     }
       
    92 
       
    93 
       
    94 // -----------------------------------------------------------------------------
       
    95 // THttpConnUtils::MapErrors
       
    96 // Map the Symbian errors to rainbow errors.
       
    97 // -----------------------------------------------------------------------------
       
    98 //
       
    99 TInt THttpConnUtils::MapHttpErrors(
       
   100     TInt aError )
       
   101     {
       
   102     if (aError == KErrSSLAlertUserCanceled)
       
   103         {
       
   104         return KBrowserCancelled;
       
   105         }
       
   106     // All SSL errors are mapped into this one, which gets displayed to the user
       
   107     if (aError <= SSL_ERROR_BASE && aError > SSL_ERROR_BASE - 200 ||
       
   108         aError == KErrHttpCannotEstablishTunnel)
       
   109         {
       
   110         return KErrSSLAlertHandshakeFailure;
       
   111         }
       
   112 
       
   113     // Deal with DNS lookup errors
       
   114     if ((aError <= KErrInet6NoDestination) && (aError > (KErrInet6NoDestination - 200)))
       
   115         {
       
   116         return KBrowserHTTP502;
       
   117         }
       
   118 
       
   119     // Deal with HTTP errors
       
   120     if (aError <= KHttpErrorBase && aError > KHttpErrorBase - 200)
       
   121         {
       
   122         // Encode errors
       
   123         if (aError <= KErrHttpEncodeDefault && aError >= KErrHttpEncodeCookie2)
       
   124             {
       
   125             return KBrowserFailure;
       
   126             }
       
   127         // Auth errors
       
   128         if (aError == KErrHttpDecodeWWWAuthenticate ||
       
   129             aError == KErrHttpDecodeUnknownAuthScheme ||
       
   130             aError == KErrHttpDecodeBasicAuth ||
       
   131             aError == KErrHttpDecodeDigestAuth)
       
   132             {
       
   133             return KBrowserMissingAuthHeader;
       
   134             }
       
   135 
       
   136         // Decode errors
       
   137         if (aError <= KErrHttpDecodeMalformedDate && aError >= KErrHttpDecodeCookie)
       
   138             {
       
   139             return KBrowserBadContent;
       
   140             }
       
   141         switch (aError)
       
   142             {
       
   143             case KErrHttpRedirectExceededLimit:
       
   144                 {
       
   145                 return KBrowserTooManyRedirects;
       
   146                 }
       
   147             case KErrHttpRedirectNoLocationField:
       
   148             case KErrHttpRedirectUseProxy:
       
   149                 {
       
   150                 return KBrowserBadRedirect;
       
   151                 }
       
   152             case KErrHttpInvalidUri:
       
   153                 {
       
   154                 return KBrowserMalformedUrl;
       
   155                 }
       
   156             default:
       
   157                 {
       
   158                 return KBrowserFailure;
       
   159                 }
       
   160             }
       
   161         }
       
   162     switch (aError)
       
   163         {
       
   164         case KErrHostUnreach:
       
   165             {
       
   166             return KBrowserTcpHostUnreachable;
       
   167             }
       
   168         case KErrAbort: //User has interrupted the loading process. We treat it as cancellation so that no error message shown.
       
   169         case KErrCancel:
       
   170             {
       
   171             return KBrowserCancelled;
       
   172             }
       
   173         case KErrBadName:
       
   174         case KErrPathNotFound:
       
   175             {
       
   176             return KBrowserFileNotFound;
       
   177             }
       
   178         case KErrCommsLineFail:
       
   179         case KErrNotReady:
       
   180             {
       
   181             return KBrowserConnFailed;
       
   182             }
       
   183         case KErrDiskFull:
       
   184             {
       
   185             return KBrowserFileDiskFullError;
       
   186             }
       
   187         case KErrTimedOut:
       
   188             {
       
   189             return KBrowserWaitTimeout;
       
   190             }
       
   191         case KErrCouldNotConnect:
       
   192             {
       
   193             return KBrowserMalformedUrl;
       
   194             }
       
   195         case KErrDisconnected:
       
   196             {
       
   197             return KBrowserHTTP504;
       
   198             }
       
   199         default:
       
   200             {
       
   201             return KBrowserFailure;
       
   202             }
       
   203         } // end of switch
       
   204     }
       
   205 
       
   206 // -----------------------------------------------------------------------------
       
   207 // THttpConnUtils::ConvertCharset
       
   208 // Convert the settings characterset from TUint to THTTPHdrVal.
       
   209 // -----------------------------------------------------------------------------
       
   210 //
       
   211 THTTPHdrVal THttpConnUtils::ConvertCharset(
       
   212     RStringPool aStringPool,
       
   213     TUint aCharset )
       
   214     {
       
   215     THTTPHdrVal charsetHdr;
       
   216 
       
   217     switch (aCharset)
       
   218         {
       
   219         case EUTF8:
       
   220             {
       
   221             charsetHdr = aStringPool.StringF(HttpFilterCommonStringsExt::EUtf8,
       
   222                 HttpFilterCommonStringsExt::GetTable());
       
   223             break;
       
   224             }
       
   225         case EISO8859_1:
       
   226             {
       
   227             charsetHdr = aStringPool.StringF(HttpFilterCommonStringsExt::EIso88591,
       
   228                 HttpFilterCommonStringsExt::GetTable());
       
   229             break;
       
   230             }
       
   231         case EGb2312:
       
   232             {
       
   233             charsetHdr = aStringPool.StringF(HttpFilterCommonStringsExt::EGb2312,
       
   234                 HttpFilterCommonStringsExt::GetTable());
       
   235             break;
       
   236             }
       
   237         case EBig5:
       
   238             {
       
   239             charsetHdr = aStringPool.StringF(HttpFilterCommonStringsExt::EBig5,
       
   240                 HttpFilterCommonStringsExt::GetTable());
       
   241             break;
       
   242             }
       
   243         case EISO8859_2:
       
   244             {
       
   245             charsetHdr = aStringPool.StringF(HttpFilterCommonStringsExt::EIso88592,
       
   246                 HttpFilterCommonStringsExt::GetTable());
       
   247             break;
       
   248             }
       
   249         case EISO8859_4:
       
   250             {
       
   251             charsetHdr = aStringPool.StringF(HttpFilterCommonStringsExt::EIso88594,
       
   252                 HttpFilterCommonStringsExt::GetTable());
       
   253             break;
       
   254             }
       
   255         case EISO8859_5:
       
   256             {
       
   257             charsetHdr = aStringPool.StringF(HttpFilterCommonStringsExt::EIso88595,
       
   258                 HttpFilterCommonStringsExt::GetTable());
       
   259             break;
       
   260             }
       
   261         case EISO8859_6:
       
   262             {
       
   263             charsetHdr = aStringPool.StringF(HttpFilterCommonStringsExt::EIso88596,
       
   264                 HttpFilterCommonStringsExt::GetTable());
       
   265             break;
       
   266             }
       
   267         case EISO8859_7:
       
   268             {
       
   269             charsetHdr = aStringPool.StringF(HttpFilterCommonStringsExt::EIso88597,
       
   270                 HttpFilterCommonStringsExt::GetTable());
       
   271             break;
       
   272             }
       
   273         case EISO8859_8:
       
   274             {
       
   275             charsetHdr = aStringPool.StringF(HttpFilterCommonStringsExt::EIso88598,
       
   276                 HttpFilterCommonStringsExt::GetTable());
       
   277             break;
       
   278             }
       
   279         case EISO8859_9:
       
   280             {
       
   281             charsetHdr = aStringPool.StringF(HttpFilterCommonStringsExt::EIso88599,
       
   282                 HttpFilterCommonStringsExt::GetTable());
       
   283             break;
       
   284             }
       
   285         case EISO8859_15:
       
   286             {
       
   287             charsetHdr = aStringPool.StringF(HttpFilterCommonStringsExt::EIso885915,
       
   288                 HttpFilterCommonStringsExt::GetTable());
       
   289             break;
       
   290             }
       
   291         case EISO8859_8i:
       
   292             {
       
   293             charsetHdr = aStringPool.StringF(HttpFilterCommonStringsExt::EWindows1255,
       
   294                 HttpFilterCommonStringsExt::GetTable());
       
   295             break;
       
   296             }
       
   297         case EWindows1255:
       
   298             {
       
   299             charsetHdr = aStringPool.StringF(HttpFilterCommonStringsExt::EWindows1255,
       
   300                 HttpFilterCommonStringsExt::GetTable());
       
   301             break;
       
   302             }
       
   303         case EWindows1256:
       
   304             {
       
   305             charsetHdr = aStringPool.StringF(HttpFilterCommonStringsExt::EWindows1256,
       
   306                 HttpFilterCommonStringsExt::GetTable());
       
   307             break;
       
   308             }
       
   309         case EWindows1250:
       
   310             {
       
   311             charsetHdr = aStringPool.StringF(HttpFilterCommonStringsExt::EWindows1250,
       
   312                 HttpFilterCommonStringsExt::GetTable());
       
   313             break;
       
   314             }
       
   315         case EWindows1251:
       
   316             {
       
   317             charsetHdr = aStringPool.StringF(HttpFilterCommonStringsExt::EWindows1251,
       
   318                 HttpFilterCommonStringsExt::GetTable());
       
   319             break;
       
   320             }
       
   321         case EWindows1252:
       
   322             {
       
   323             charsetHdr = aStringPool.StringF(HttpFilterCommonStringsExt::EWindows1252,
       
   324                 HttpFilterCommonStringsExt::GetTable());
       
   325             break;
       
   326             }
       
   327         case EWindows1253:
       
   328             {
       
   329             charsetHdr = aStringPool.StringF(HttpFilterCommonStringsExt::EWindows1253,
       
   330                 HttpFilterCommonStringsExt::GetTable());
       
   331             break;
       
   332             }
       
   333         case EWindows1254:
       
   334             {
       
   335             charsetHdr = aStringPool.StringF(HttpFilterCommonStringsExt::EWindows1254,
       
   336                 HttpFilterCommonStringsExt::GetTable());
       
   337             break;
       
   338             }
       
   339         case EWindows1257:
       
   340             {
       
   341             charsetHdr = aStringPool.StringF(HttpFilterCommonStringsExt::EWindows1257,
       
   342                 HttpFilterCommonStringsExt::GetTable());
       
   343             break;
       
   344             }
       
   345         case ETis620: // This value can be in the settings only if tis-620 is supported, no variation needed
       
   346             {
       
   347             charsetHdr = aStringPool.StringF(HttpFilterCommonStringsExt::ETis620,
       
   348                 HttpFilterCommonStringsExt::GetTable());
       
   349             break;
       
   350             }
       
   351         case EShiftJis: // This value can be in the settings only if Japanese is supported, no variation needed
       
   352             {
       
   353             charsetHdr = aStringPool.StringF(HttpFilterCommonStringsExt::EShiftJIS,
       
   354                 HttpFilterCommonStringsExt::GetTable());
       
   355             break;
       
   356             }
       
   357         case EJisX0201_1997: // This value can be in the settings only if Japanese is supported, no variation needed
       
   358             {
       
   359             charsetHdr = aStringPool.StringF(HttpFilterCommonStringsExt::EJisX0201_1997,
       
   360                 HttpFilterCommonStringsExt::GetTable());
       
   361             break;
       
   362             }
       
   363         case EJisX0208_1997: // This value can be in the settings only if Japanese is supported, no variation needed
       
   364             {
       
   365             charsetHdr = aStringPool.StringF(HttpFilterCommonStringsExt::EJisX0208_1997,
       
   366                 HttpFilterCommonStringsExt::GetTable());
       
   367             break;
       
   368             }
       
   369         case EEucJp: // This value can be in the settings only if Japanese is supported, no variation needed
       
   370             {
       
   371             charsetHdr = aStringPool.StringF(HttpFilterCommonStringsExt::EEucJp,
       
   372                 HttpFilterCommonStringsExt::GetTable());
       
   373             break;
       
   374             }
       
   375         case EIso2022Jp: // This value can be in the settings only if Japanese is supported, no variation needed
       
   376             {
       
   377             charsetHdr = aStringPool.StringF(HttpFilterCommonStringsExt::EIso2022Jp,
       
   378                 HttpFilterCommonStringsExt::GetTable());
       
   379             break;
       
   380             }
       
   381         case EWindows874:
       
   382             {
       
   383             charsetHdr = aStringPool.StringF(HttpFilterCommonStringsExt::EWindows874,
       
   384                 HttpFilterCommonStringsExt::GetTable());
       
   385             break;
       
   386             }
       
   387         }
       
   388     return charsetHdr;
       
   389     }
       
   390 
       
   391 // -----------------------------------------------------------------------------
       
   392 // THttpConnUtils::OpenStringFromUnicode
       
   393 // Create an RString object from a UCS2 buffer.
       
   394 // -----------------------------------------------------------------------------
       
   395 //
       
   396 TInt THttpConnUtils::OpenStringFromUnicode(
       
   397     RStringPool aStringPool,
       
   398     TUint16* aStr,
       
   399     RString& aString )
       
   400     {
       
   401     __ASSERT_DEBUG( aStr != NULL, THttpConnUtils::PanicLoader( KErrGeneral ) );
       
   402 
       
   403     TInt len = User::StringLength( aStr ) + 1;
       
   404     TPtr16 ptr16( aStr, len - 1, len );
       
   405     TUint8* str8 = new TUint8 [ len ];
       
   406     if( !str8 )
       
   407         {
       
   408         return KErrNoMemory;
       
   409         }
       
   410     TPtr8 ptr8( str8, len );
       
   411     ptr8.Copy( ptr16 );
       
   412     TRAPD( ret, aString = aStringPool.OpenStringL( ptr8 ) );
       
   413     delete[] str8;
       
   414     return ret;
       
   415     }
       
   416 
       
   417 
       
   418 // -----------------------------------------------------------------------------
       
   419 // THttpConnUtils::ConvertPtrUsc2ToAscii
       
   420 // Convert a UCS2 buffer to ascii.
       
   421 // -----------------------------------------------------------------------------
       
   422 //
       
   423 TInt THttpConnUtils::ConvertPtrUsc2ToAscii(
       
   424     const TPtrC& aUsc2Ptr,
       
   425     TPtrC8& aAsciiPtr,
       
   426     TUint8** retPtr )
       
   427     {
       
   428     TUint len = aUsc2Ptr.Length() + 1; // 1 for NULL terminator
       
   429     TUint8* asciiBuf = new TUint8 [len];
       
   430     if (asciiBuf != NULL)
       
   431         {
       
   432         TPtr8 asciiPtr(asciiBuf, 0, len);
       
   433         asciiPtr.Copy(aUsc2Ptr);
       
   434         asciiPtr.ZeroTerminate();
       
   435         aAsciiPtr.Set(asciiPtr);
       
   436         *retPtr = asciiBuf;
       
   437         }
       
   438     else
       
   439         {
       
   440         return KErrNoMemory;
       
   441         }
       
   442     return KErrNone;
       
   443     }
       
   444 
       
   445 // -----------------------------------------------------------------------------
       
   446 // THttpConnUtils::CompareUrls
       
   447 //
       
   448 // -----------------------------------------------------------------------------
       
   449 //
       
   450 TBool THttpConnUtils::IsIntraPageNavigation(
       
   451     const TDesC& aUrl1,
       
   452     const TDesC& aUrl2 )
       
   453     {
       
   454     TBool intranavi( ETrue );
       
   455     // remove '#' frag
       
   456     TInt pos1( aUrl1.LocateReverse('#') );
       
   457     TInt pos2( aUrl2.LocateReverse('#') );
       
   458 
       
   459     // from no fragment to no fragment
       
   460     // www.foo.com -> www.foo.com -load
       
   461     // www.foo.com -> www.fakefoo.com -load
       
   462     // does not matter what the url is. this cannot be
       
   463     // intrapage navigation
       
   464     if( pos1 == KErrNotFound && pos2 == KErrNotFound )
       
   465         {
       
   466         intranavi = EFalse;
       
   467         }
       
   468     // from fragment to fragment
       
   469     else if( pos1 != KErrNotFound && pos2 != KErrNotFound )
       
   470         {
       
   471         //
       
   472         TPtrC url1( aUrl1.Left( pos1 ) );
       
   473         TPtrC url2( aUrl2.Left( pos2 ) );
       
   474 
       
   475         if( url1.Compare( url2 ) != KErrNone )
       
   476             {
       
   477             // urls are different
       
   478             // www.foo.com/index.html#a -> www.fakefoo.com/index.html#a -load
       
   479             // www.foo.com/index.html#a -> www.foo.com/pub/index.html#a -load
       
   480             intranavi = EFalse;
       
   481             }
       
   482         else
       
   483             {
       
   484             // same url. same fragment?
       
   485             // www.foo.com/index.html#a -> www.foo.com/index.html#a -intrapage navi(nothing)
       
   486             // www.foo.com/index.html#a -> www.foo.com/index.html#b -intrapage navi
       
   487             intranavi = ETrue;
       
   488             }
       
   489         }
       
   490     // from fragment to no fragment
       
   491     else if( pos2 == KErrNotFound )
       
   492         {
       
   493         // www.foo.com/index.html#a -> www.foofake.com -load
       
   494         // www.foo.com/index.html#a -> www.foo.com/index.html -load
       
   495         intranavi = EFalse;
       
   496         }
       
   497     // from no fragment to fragment
       
   498     else
       
   499         {
       
   500         TPtrC url1( pos1 == KErrNotFound ? aUrl1 : aUrl1.Left( pos1 ) );
       
   501         TPtrC url2( pos2 == KErrNotFound ? aUrl2 : aUrl2.Left( pos2 ) );
       
   502 
       
   503         // www.foo.com/index.html -> www.foo.com/index.html#a -intrapage navi
       
   504         // www.foo.com/index.html -> www.foofake.com/index.html#a -load
       
   505         intranavi = url1.Compare( url2 ) == KErrNone;
       
   506         }
       
   507     return intranavi;
       
   508     }
       
   509 
       
   510 //  End of File