diff options
author | wolfbeast <mcwerewolf@wolfbeast.com> | 2019-11-14 09:46:28 +0100 |
---|---|---|
committer | wolfbeast <mcwerewolf@wolfbeast.com> | 2019-11-14 09:46:28 +0100 |
commit | 9768733eb7d34fff6f7cdf2e6a8049d4ffb954bb (patch) | |
tree | 002ba972a6feb21e93a67a3f7686465ac908ddad /netwerk/streamconv/converters/nsHTTPCompressConv.h | |
parent | 56de283899bc91f7110aba58a3ca174c10852683 (diff) | |
download | UXP-9768733eb7d34fff6f7cdf2e6a8049d4ffb954bb.tar UXP-9768733eb7d34fff6f7cdf2e6a8049d4ffb954bb.tar.gz UXP-9768733eb7d34fff6f7cdf2e6a8049d4ffb954bb.tar.lz UXP-9768733eb7d34fff6f7cdf2e6a8049d4ffb954bb.tar.xz UXP-9768733eb7d34fff6f7cdf2e6a8049d4ffb954bb.zip |
Issue #1288 - Part 1b: Rewrite nsHTTPCompressConv.
This also includes formatting changes.
Diffstat (limited to 'netwerk/streamconv/converters/nsHTTPCompressConv.h')
-rw-r--r-- | netwerk/streamconv/converters/nsHTTPCompressConv.h | 136 |
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 |