nsNSSCallbacks.h 6.5 KB

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