summaryrefslogtreecommitdiffstats
path: root/netwerk/streamconv/converters/nsHTTPCompressConv.h
diff options
context:
space:
mode:
Diffstat (limited to 'netwerk/streamconv/converters/nsHTTPCompressConv.h')
-rw-r--r--netwerk/streamconv/converters/nsHTTPCompressConv.h136
1 files changed, 72 insertions, 64 deletions
diff --git a/netwerk/streamconv/converters/nsHTTPCompressConv.h b/netwerk/streamconv/converters/nsHTTPCompressConv.h
index 38889a8f7..6721a1e34 100644
--- a/netwerk/streamconv/converters/nsHTTPCompressConv.h
+++ b/netwerk/streamconv/converters/nsHTTPCompressConv.h
@@ -4,13 +4,16 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-#if !defined (__nsHTTPCompressConv__h__)
-#define __nsHTTPCompressConv__h__ 1
+#if !defined(__nsHTTPCompressConv__h__)
+#define __nsHTTPCompressConv__h__ 1
#include "nsIStreamConverter.h"
#include "nsICompressConvStats.h"
+#include "nsIThreadRetargetableStreamListener.h"
#include "nsCOMPtr.h"
#include "nsAutoPtr.h"
+#include "mozilla/Atomics.h"
+#include "mozilla/Mutex.h"
#include "zlib.h"
@@ -30,20 +33,19 @@ class nsIStringInputStream;
{0xab, 0xf4, 0x07, 0x98, 0x61, 0x51, 0x02, 0x2d} \
}
-
-#define HTTP_DEFLATE_TYPE "deflate"
-#define HTTP_GZIP_TYPE "gzip"
-#define HTTP_X_GZIP_TYPE "x-gzip"
-#define HTTP_COMPRESS_TYPE "compress"
-#define HTTP_X_COMPRESS_TYPE "x-compress"
-#define HTTP_BROTLI_TYPE "br"
-#define HTTP_IDENTITY_TYPE "identity"
-#define HTTP_UNCOMPRESSED_TYPE "uncompressed"
+#define HTTP_DEFLATE_TYPE "deflate"
+#define HTTP_GZIP_TYPE "gzip"
+#define HTTP_X_GZIP_TYPE "x-gzip"
+#define HTTP_COMPRESS_TYPE "compress"
+#define HTTP_X_COMPRESS_TYPE "x-compress"
+#define HTTP_BROTLI_TYPE "br"
+#define HTTP_IDENTITY_TYPE "identity"
+#define HTTP_UNCOMPRESSED_TYPE "uncompressed"
namespace mozilla {
namespace net {
-typedef enum {
+typedef enum {
HTTP_COMPRESS_GZIP,
HTTP_COMPRESS_DEFLATE,
HTTP_COMPRESS_COMPRESS,
@@ -51,82 +53,88 @@ typedef enum {
HTTP_COMPRESS_IDENTITY
} CompressMode;
-class BrotliWrapper
-{
+class BrotliWrapper {
public:
BrotliWrapper()
- : mTotalOut(0)
- , mStatus(NS_OK)
- {
- BrotliStateInit(&mState);
- }
- ~BrotliWrapper()
- {
- BrotliStateCleanup(&mState);
+ : mTotalOut(0),
+ mStatus(NS_OK),
+ mBrotliStateIsStreamEnd(false),
+ mRequest(nullptr),
+ mContext(nullptr),
+ mSourceOffset(0) {
+ BrotliDecoderStateInit(&mState, 0, 0, 0);
}
+ ~BrotliWrapper() { BrotliDecoderStateCleanup(&mState); }
- BrotliState mState;
- size_t mTotalOut;
- nsresult mStatus;
+ BrotliDecoderState mState;
+ Atomic<size_t, Relaxed> mTotalOut;
+ nsresult mStatus;
+ Atomic<bool, Relaxed> mBrotliStateIsStreamEnd;
- nsIRequest *mRequest;
- nsISupports *mContext;
- uint64_t mSourceOffset;
+ nsIRequest* mRequest;
+ nsISupports* mContext;
+ uint64_t mSourceOffset;
};
-class nsHTTPCompressConv
- : public nsIStreamConverter
- , public nsICompressConvStats
-{
- public:
+class nsHTTPCompressConv : public nsIStreamConverter,
+ public nsICompressConvStats,
+ public nsIThreadRetargetableStreamListener {
+public:
// nsISupports methods
- NS_DECL_THREADSAFE_ISUPPORTS
- NS_DECL_NSIREQUESTOBSERVER
- NS_DECL_NSISTREAMLISTENER
- NS_DECL_NSICOMPRESSCONVSTATS
+ NS_DECL_THREADSAFE_ISUPPORTS
+ NS_DECL_NSIREQUESTOBSERVER
+ NS_DECL_NSISTREAMLISTENER
+ NS_DECL_NSICOMPRESSCONVSTATS
+ NS_DECL_NSITHREADRETARGETABLESTREAMLISTENER
// nsIStreamConverter methods
- NS_DECL_NSISTREAMCONVERTER
+ NS_DECL_NSISTREAMCONVERTER
- nsHTTPCompressConv ();
+ nsHTTPCompressConv();
private:
- virtual ~nsHTTPCompressConv ();
+ virtual ~nsHTTPCompressConv();
+
+ nsCOMPtr<nsIStreamListener> mListener; // this guy gets the converted data via his OnDataAvailable ()
+ Atomic<CompressMode, Relaxed> mMode;
- nsCOMPtr<nsIStreamListener> mListener; // this guy gets the converted data via his OnDataAvailable ()
- CompressMode mMode;
+ unsigned char* mOutBuffer;
+ unsigned char* mInpBuffer;
- unsigned char *mOutBuffer;
- unsigned char *mInpBuffer;
+ uint32_t mOutBufferLen;
+ uint32_t mInpBufferLen;
- uint32_t mOutBufferLen;
- uint32_t mInpBufferLen;
+ nsAutoPtr<BrotliWrapper> mBrotli;
- nsAutoPtr<BrotliWrapper> mBrotli;
+ nsCOMPtr<nsIStringInputStream> mStream;
- nsCOMPtr<nsISupports> mAsyncConvContext;
- nsCOMPtr<nsIStringInputStream> mStream;
+ static nsresult BrotliHandler(nsIInputStream* stream,
+ void* closure,
+ const char* dataIn,
+ uint32_t,
+ uint32_t avail,
+ uint32_t* countRead);
- static nsresult
- BrotliHandler(nsIInputStream *stream, void *closure, const char *dataIn,
- uint32_t, uint32_t avail, uint32_t *countRead);
+ nsresult do_OnDataAvailable(nsIRequest* request,
+ nsISupports* aContext,
+ uint64_t aSourceOffset,
+ const char* buffer,
+ uint32_t aCount);
- nsresult do_OnDataAvailable (nsIRequest *request, nsISupports *aContext,
- uint64_t aSourceOffset, const char *buffer,
- uint32_t aCount);
+ bool mCheckHeaderDone;
+ Atomic<bool> mStreamEnded;
+ bool mStreamInitialized;
+ bool mDummyStreamInitialised;
+ bool mFailUncleanStops;
- bool mCheckHeaderDone;
- bool mStreamEnded;
- bool mStreamInitialized;
- bool mDummyStreamInitialised;
- bool mFailUncleanStops;
+ z_stream d_stream;
+ unsigned mLen, hMode, mSkipCount, mFlags;
- z_stream d_stream;
- unsigned mLen, hMode, mSkipCount, mFlags;
+ uint32_t check_header(nsIInputStream* iStr, uint32_t streamLen, nsresult* rv);
- uint32_t check_header (nsIInputStream *iStr, uint32_t streamLen, nsresult *rv);
+ Atomic<uint32_t, Relaxed> mDecodedDataLength;
- uint32_t mDecodedDataLength;
+ mutable mozilla::Mutex mMutex;
};
} // namespace net