applayerpluginsandutils/httpprotocolplugins/httpclient/chttpconnectionmanager.h
changeset 0 b16258d2340f
child 3 5ee1d9ce5878
equal deleted inserted replaced
-1:000000000000 0:b16258d2340f
       
     1 // Copyright (c) 2003-2009 Nokia Corporation and/or its subsidiary(-ies).
       
     2 // All rights reserved.
       
     3 // This component and the accompanying materials are made available
       
     4 // under the terms of "Eclipse Public License v1.0"
       
     5 // which accompanies this distribution, and is available
       
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     7 //
       
     8 // Initial Contributors:
       
     9 // Nokia Corporation - initial contribution.
       
    10 //
       
    11 // Contributors:
       
    12 //
       
    13 // Description:
       
    14 //
       
    15 
       
    16 #ifndef __CHTTPCONNECTIONMANAGER_H__
       
    17 #define __CHTTPCONNECTIONMANAGER_H__
       
    18 
       
    19 #include <e32base.h>
       
    20 #include <babitflags.h>
       
    21 #include <stringpool.h>
       
    22 #include <http/framework/logging.h>
       
    23 
       
    24 #include "msocketconnectobserver.h"
       
    25 #include "minputstreamobserver.h"
       
    26 #include "moutputstreamobserver.h"
       
    27 #include "mhttprequestobserver.h"
       
    28 #include "mhttpresponseobserver.h"
       
    29 #include "mhttpbatchingpropertiescallback.h"
       
    30 #include "chttpclientoptimiser.h"
       
    31 
       
    32 class MSocketFactory;
       
    33 class MSocketConnector;
       
    34 class MOutputStream;
       
    35 class MInputStream;
       
    36 
       
    37 class MHttpRequest;
       
    38 class MHttpResponse;
       
    39 
       
    40 class CHttpConnectionInfo;
       
    41 class CX509Certificate;
       
    42 
       
    43 class CHttpRequestBatcher;
       
    44 class MHttpBatchingPropertiesCallback;
       
    45 
       
    46 
       
    47 class CHttpHostElement : public CBase
       
    48     {
       
    49     public:
       
    50     static CHttpHostElement* New(const TDesC8& aHost);
       
    51     ~CHttpHostElement();
       
    52     inline const TDesC8& Host() const;
       
    53     inline void IncFailedCount();
       
    54     inline TInt FailedCount() const;
       
    55     inline HBufC8* AcquireHost();
       
    56     static inline TInt LinkOffset();
       
    57     
       
    58     private:
       
    59     TBool Construct(const TDesC8& aHost);
       
    60     
       
    61     public:
       
    62     TSglQueLink     iLink;
       
    63     HBufC8*         iHost;
       
    64     };
       
    65 
       
    66 class CHttpPipelineFallback : public CBase
       
    67     {
       
    68     public:
       
    69     static CHttpPipelineFallback* NewL();
       
    70     ~CHttpPipelineFallback();
       
    71     
       
    72     TBool NeedPipelineFallback(const TDesC8& aHost);
       
    73     void  InsertPipelineFailedHost(const TDesC8& aHost);
       
    74     
       
    75      private:
       
    76     CHttpPipelineFallback();
       
    77     
       
    78     private:
       
    79     RPointerArray<HBufC8>       iPipelineFailedHosts;
       
    80     TSglQue<CHttpHostElement>   iProbablePipelineFailedHosts;    
       
    81     };
       
    82 
       
    83 class CHttpConnectionManager : public CBase,
       
    84 							   public MHttpRequestObserver,
       
    85 							   public MHttpResponseObserver, 
       
    86 							   public MSocketConnectObserver,
       
    87 							   public MInputStreamObserver,
       
    88 							   public MOutputStreamObserver
       
    89 	{
       
    90 public:
       
    91 	
       
    92 	enum TConnectionStatus
       
    93 		{
       
    94 		ENotConnected			= 0,
       
    95 		EConnectedAndAvailable,
       
    96 		EConnectedNotAvailable,
       
    97 		EConnectedAndBusy,
       
    98 		EConnectingNotAvailable
       
    99 		};
       
   100 
       
   101 public:
       
   102 
       
   103 	static CHttpConnectionManager* NewL(MSocketFactory& aSocketFactory, MHttpBatchingPropertiesCallback& aCallback,
       
   104                                     CHttpPipelineFallback& aPipelineFallback, TInt aMaxTransactionsToPipeline, TBool aEnableOptimalPipeline);
       
   105 	virtual ~CHttpConnectionManager();
       
   106 	
       
   107 	void SubmitL(CHttpConnectionInfo& aConnectionInfo, MHttpRequest& aRequest, MHttpResponse& aResponse);
       
   108 	TConnectionStatus Status() const;
       
   109 	const CHttpConnectionInfo& ConnectionInfo() const;
       
   110 	void CancelSubmission(MHttpRequest& aRequest, MHttpResponse& aResponse);
       
   111 	const CX509Certificate* ServerCert();
       
   112 	TInt CipherSuite(TDes8& aCipherSuite);
       
   113 	void TunnelConnection(RStringF aHost);
       
   114 	TBool TunnelMatches(RStringF aHost) const;
       
   115 	void MakeConnectionNonPersistent();
       
   116 	void CheckRequestComplete(MHttpRequest& aRequest);
       
   117 	void DisablePipelining();
       
   118 	void InsertPipelineFailedHost(const TDesC8& aHost);
       
   119 	
       
   120 private:	// methods from MHttpRequestObserver
       
   121 
       
   122 	virtual void SendRequestDataL(const TDesC8& aData);
       
   123 	virtual void RequestComplete();
       
   124 	virtual void SendingBodyData(TBool aValue);
       
   125 		
       
   126 private:	// methods from MHttpResponseObserver
       
   127 
       
   128 	virtual void ResponseDataParsed();
       
   129 	virtual void ResponseComplete(const TDesC8& aExcessData);
       
   130 
       
   131 private:	// methods from MSocketConnnectObserver
       
   132 
       
   133 	virtual void ConnectionMadeL(MInputStream& aInputStream, MOutputStream& aOutputStream);
       
   134 	virtual TInt HandleConnectError(TInt aError);
       
   135 
       
   136 	virtual void MSocketConnectObserver_Reserved();
       
   137 
       
   138 private:	// methods from MInputStreamObserver
       
   139 
       
   140 	virtual void ReceivedDataIndL(const TDesC8& aBuffer);
       
   141 	virtual void SecureServerCnf();
       
   142 	virtual void InputStreamCloseInd(TInt aError);
       
   143 	virtual void MInputStreamObserver_Reserved();
       
   144 	virtual MHttpResponse* CurrentResponse();
       
   145     virtual void OnReceiveTimeOut();
       
   146 	
       
   147 private:	// methods from MOutputStreamObserver
       
   148 
       
   149 	virtual void SendDataCnfL();
       
   150 	virtual void SecureClientCnf();
       
   151 	virtual void OutputStreamCloseInd(TInt aError);
       
   152 
       
   153 	virtual void MOutputStreamObserver_Reserved();
       
   154 	virtual void OnSendTimeOut();
       
   155 	virtual TInt SendTimeOutVal();
       
   156 
       
   157 private:
       
   158 	CHttpConnectionManager(MSocketFactory& aSocketFactory, MHttpBatchingPropertiesCallback& aCallback,
       
   159                             CHttpPipelineFallback& aPipelineFallback, TInt aMaxTransactionsToPipeline, TBool aEnableOptimalPipeline);
       
   160 
       
   161 	void HandleSocketError(TInt aError);
       
   162 	void CloseConnection();
       
   163 	void UpgradeConnectionL();
       
   164 	void SetIdleState();
       
   165 
       
   166 	TInt FindRequest(MHttpRequest& aRequest);
       
   167 	TInt FindResponse(MHttpResponse& aResponse);
       
   168 
       
   169 	void NotifyPendingTransactions(TInt aError);
       
   170 	void ReportSocketError(TInt aError);
       
   171 	void ReconnectSocketL();
       
   172 	
       
   173 	void DoResponseCompletion ();
       
   174 
       
   175 	inline TBool CannotPipeline() const;
       
   176 	inline TBool IsFirstTransaction() const;
       
   177 	inline TBool IsPendingWriteInConnectedState() const;
       
   178 	inline TBool DiscardSndDataCnf() const;
       
   179 	void CreateOptimiserL(MHttpDataOptimiser* aDataOptimiser);
       
   180 	void StartRecvTimer();
       
   181 	
       
   182 private:
       
   183 
       
   184 	enum TManagerState
       
   185 		{
       
   186 		EIdle			= 0,
       
   187 		EIdleConnected,
       
   188 		EConnecting,
       
   189 		EUpgrading,
       
   190 		EConnected,
       
   191 		EClosing
       
   192 		};
       
   193 
       
   194 	enum TConnectionFlag
       
   195 		{
       
   196 		// Cannot currently pipeline. 
       
   197 		// So will not queue transactions on this connection Manager.
       
   198 		//
       
   199 		ECannotPipeline = 0,
       
   200 
       
   201 		// Currently sending/receiving the first transaction on this connection, 
       
   202 		// so no other requests are sent out till the response from the server is 
       
   203 		// examined to see of it can handle pipelining. However transactions are 
       
   204 		// still queued on this connection. These will be cancelled with 
       
   205 		// KErrNonPipeliningError should the server be HTTP/1.0.
       
   206 		//
       
   207 		EFirstTransaction = 1,
       
   208 
       
   209 		// Specifies that this transaction is waiting to write its
       
   210 		// request to the supposedly connected connection. Due to timing issues
       
   211 		// the server may have closed the connection, but connection manager has
       
   212 		// not been notified yet.
       
   213 		// 
       
   214 		EPendingWriteInConnectedState = 2,
       
   215 
       
   216 		// The Response completed before notification, that a request was sent, was received.
       
   217 		// So now we know when confirmation arrives (SndDataCnf) can disregard it.
       
   218 		//
       
   219 		EDiscardSndDataCnf = 3
       
   220 		};
       
   221 private:
       
   222 	TBool                   iEnableOptimalPipeline;
       
   223 	TBool					iTunnel;
       
   224 	TInt					iMaxTransactionsToPipeline;
       
   225 	TBitFlags8				iFlags;
       
   226 	MSocketFactory&			iSocketFactory;
       
   227 	TManagerState			iState;
       
   228 
       
   229 	MSocketConnector*		iSocketConnector;
       
   230 	MOutputStream*			iOutputStream;
       
   231 	MInputStream*			iInputStream;
       
   232 	
       
   233 	MHttpRequest*			iCurrentRequest;
       
   234 	MHttpResponse*			iCurrentResponse;
       
   235 	TPtrC8					iExcessData;
       
   236 	RStringF				iTunnelHost;
       
   237 
       
   238 	CHttpConnectionInfo*	iConnectionInfo;
       
   239 
       
   240 	CHttpRequestBatcher*	iRequestBatcher;
       
   241 	MHttpBatchingPropertiesCallback& iCallback;
       
   242 	
       
   243 	CHttpClientOptimiser*				iOptimiser;
       
   244 
       
   245 	RPointerArray<MHttpRequest>		iPendingRequests;
       
   246 	RPointerArray<MHttpResponse>	iPendingResponses;
       
   247 	CHttpPipelineFallback&          iPipelineFallback;
       
   248 public:
       
   249 	
       
   250 	__FLOG_DECLARATION_MEMBER2
       
   251 
       
   252 	};
       
   253 
       
   254 
       
   255 inline TBool CHttpConnectionManager::CannotPipeline() const
       
   256 	{
       
   257 	return iFlags.IsSet(ECannotPipeline);
       
   258 	}
       
   259 
       
   260 inline TBool CHttpConnectionManager::IsFirstTransaction() const
       
   261 	{
       
   262 	return iFlags.IsSet(EFirstTransaction);
       
   263 	}
       
   264 
       
   265 inline TBool CHttpConnectionManager::IsPendingWriteInConnectedState() const
       
   266 	{
       
   267 	return iFlags.IsSet(EPendingWriteInConnectedState);
       
   268 	}
       
   269 
       
   270 inline TBool CHttpConnectionManager::DiscardSndDataCnf() const
       
   271 	{
       
   272 	return iFlags.IsSet(EDiscardSndDataCnf);
       
   273 	}
       
   274 
       
   275 
       
   276 inline const TDesC8& CHttpHostElement::Host() const
       
   277     {
       
   278     return *iHost;
       
   279     }
       
   280 
       
   281 inline HBufC8* CHttpHostElement::AcquireHost()
       
   282     {
       
   283     HBufC8* host = iHost;
       
   284     iHost = NULL;
       
   285     return host;
       
   286     }
       
   287 
       
   288 inline TInt CHttpHostElement::LinkOffset()
       
   289     {
       
   290     return _FOFF(CHttpHostElement, iLink);
       
   291     }
       
   292 
       
   293 #endif	// __CHTTPCONNECTIONMANAGER_H__