|
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__ |