1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- 2 * 3 * This Source Code Form is subject to the terms of the Mozilla Public 4 * License, v. 2.0. If a copy of the MPL was not distributed with this 5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 6 7 #ifndef nsNSSCallbacks_h 8 #define nsNSSCallbacks_h 9 10 #include "mozilla/Attributes.h" 11 #include "mozilla/BasePrincipal.h" 12 #include "mozilla/CondVar.h" 13 #include "mozilla/Mutex.h" 14 #include "nsAutoPtr.h" 15 #include "nsCOMPtr.h" 16 #include "nsIStreamLoader.h" 17 #include "nspr.h" 18 #include "nsString.h" 19 #include "pk11func.h" 20 #include "pkix/pkixtypes.h" 21 22 #include "ocspt.h" // Must be included after pk11func.h. 23 24 using mozilla::NeckoOriginAttributes; 25 26 class nsILoadGroup; 27 28 char* 29 PK11PasswordPrompt(PK11SlotInfo *slot, PRBool retry, void* arg); 30 31 void HandshakeCallback(PRFileDesc *fd, void *client_data); 32 SECStatus CanFalseStartCallback(PRFileDesc* fd, void* client_data, 33 PRBool *canFalseStart); 34 35 class nsHTTPListener final : public nsIStreamLoaderObserver 36 { 37 private: 38 // For XPCOM implementations that are not a base class for some other 39 // class, it is good practice to make the destructor non-virtual and 40 // private. Then the only way to delete the object is via Release. 41 #ifdef _MSC_VER 42 // C4265: Class has virtual members but destructor is not virtual 43 __pragma(warning(disable:4265)) 44 #endif 45 ~nsHTTPListener(); 46 47 public: 48 nsHTTPListener(); 49 50 NS_DECL_THREADSAFE_ISUPPORTS 51 NS_DECL_NSISTREAMLOADEROBSERVER 52 53 nsCOMPtr<nsIStreamLoader> mLoader; 54 55 nsresult mResultCode; 56 57 bool mHttpRequestSucceeded; 58 uint16_t mHttpResponseCode; 59 nsCString mHttpResponseContentType; 60 61 const uint8_t* mResultData; // allocated in loader, but owned by listener 62 uint32_t mResultLen; 63 64 mozilla::Mutex mLock; 65 mozilla::CondVar mCondition; 66 volatile bool mWaitFlag; 67 68 bool mResponsibleForDoneSignal; 69 void send_done_signal(); 70 71 // no nsCOMPtr. When I use it, I get assertions about 72 // loadgroup not being thread safe. 73 // So, let's use a raw pointer and ensure we only create and destroy 74 // it on the network thread ourselves. 75 nsILoadGroup *mLoadGroup; 76 PRThread *mLoadGroupOwnerThread; 77 void FreeLoadGroup(bool aCancelLoad); 78 }; 79 80 class nsNSSHttpServerSession 81 { 82 public: 83 typedef mozilla::pkix::Result Result; 84 85 nsCString mHost; 86 uint16_t mPort; 87 88 static Result createSessionFcn(const char* host, 89 uint16_t portnum, 90 /*out*/ nsNSSHttpServerSession** pSession); 91 }; 92 93 class nsNSSHttpRequestSession 94 { 95 protected: 96 mozilla::ThreadSafeAutoRefCnt mRefCount; 97 98 public: 99 typedef mozilla::pkix::Result Result; 100 101 static Result createFcn(const nsNSSHttpServerSession* session, 102 const char* httpProtocolVariant, 103 const char* pathAndQueryString, 104 const char* httpRequestMethod, 105 const NeckoOriginAttributes& originAttributes, 106 const PRIntervalTime timeout, 107 /*out*/ nsNSSHttpRequestSession** pRequest); 108 109 Result setPostDataFcn(const char* httpData, 110 const uint32_t httpDataLen, 111 const char* httpContentType); 112 113 Result trySendAndReceiveFcn(PRPollDesc** pPollDesc, 114 uint16_t* httpResponseCode, 115 const char** httpResponseContentType, 116 const char** httpResponseHeaders, 117 const char** httpResponseData, 118 uint32_t* httpResponseDataLen); 119 120 void AddRef(); 121 void Release(); 122 123 nsCString mURL; 124 nsCString mRequestMethod; 125 126 bool mHasPostData; 127 nsCString mPostData; 128 nsCString mPostContentType; 129 130 NeckoOriginAttributes mOriginAttributes; 131 132 PRIntervalTime mTimeoutInterval; 133 134 RefPtr<nsHTTPListener> mListener; 135 136 protected: 137 nsNSSHttpRequestSession(); 138 ~nsNSSHttpRequestSession(); 139 140 Result internal_send_receive_attempt(bool& retryableError, 141 PRPollDesc** pPollDesc, 142 uint16_t* httpResponseCode, 143 const char** httpResponseContentType, 144 const char** httpResponseHeaders, 145 const char** httpResponseData, 146 uint32_t* httpResponseDataLen); 147 }; 148 149 class nsNSSHttpInterface 150 { 151 public: 152 typedef mozilla::pkix::Result Result; 153 createSessionFcn(const char * host,uint16_t portnum,nsNSSHttpServerSession ** pSession)154 static Result createSessionFcn(const char* host, 155 uint16_t portnum, 156 /*out*/ nsNSSHttpServerSession** pSession) 157 { 158 return nsNSSHttpServerSession::createSessionFcn(host, portnum, pSession); 159 } 160 createFcn(const nsNSSHttpServerSession * session,const char * httpProtocolVariant,const char * pathAndQueryString,const char * httpRequestMethod,const NeckoOriginAttributes & originAttributes,const PRIntervalTime timeout,nsNSSHttpRequestSession ** pRequest)161 static Result createFcn(const nsNSSHttpServerSession* session, 162 const char* httpProtocolVariant, 163 const char* pathAndQueryString, 164 const char* httpRequestMethod, 165 const NeckoOriginAttributes& originAttributes, 166 const PRIntervalTime timeout, 167 /*out*/ nsNSSHttpRequestSession** pRequest) 168 { 169 return nsNSSHttpRequestSession::createFcn(session, httpProtocolVariant, 170 pathAndQueryString, 171 httpRequestMethod, originAttributes, 172 timeout, pRequest); 173 } 174 setPostDataFcn(nsNSSHttpRequestSession * request,const char * httpData,const uint32_t httpDataLen,const char * httpContentType)175 static Result setPostDataFcn(nsNSSHttpRequestSession* request, 176 const char* httpData, 177 const uint32_t httpDataLen, 178 const char* httpContentType) 179 { 180 return request->setPostDataFcn(httpData, httpDataLen, httpContentType); 181 } 182 trySendAndReceiveFcn(nsNSSHttpRequestSession * request,PRPollDesc ** pPollDesc,uint16_t * httpResponseCode,const char ** httpResponseContentType,const char ** httpResponseHeaders,const char ** httpResponseData,uint32_t * httpResponseDataLen)183 static Result trySendAndReceiveFcn(nsNSSHttpRequestSession* request, 184 PRPollDesc** pPollDesc, 185 uint16_t* httpResponseCode, 186 const char** httpResponseContentType, 187 const char** httpResponseHeaders, 188 const char** httpResponseData, 189 uint32_t* httpResponseDataLen) 190 { 191 return request->trySendAndReceiveFcn(pPollDesc, httpResponseCode, 192 httpResponseContentType, 193 httpResponseHeaders, 194 httpResponseData, httpResponseDataLen); 195 } 196 }; 197 198 #endif // nsNSSCallbacks_h 199