Index: net/websockets/websocket_deflate_stream.h |
diff --git a/net/websockets/websocket_deflate_stream.h b/net/websockets/websocket_deflate_stream.h |
index fc2ebf4c4e44879cdf7a81f8181035273eef8e73..a7859446f6a0dda41fd5f84ef16444f20e9c2bec 100644 |
--- a/net/websockets/websocket_deflate_stream.h |
+++ b/net/websockets/websocket_deflate_stream.h |
@@ -21,14 +21,27 @@ class GURL; |
namespace net { |
+class WebSocketDeflatePredictor; |
+ |
// WebSocketDeflateStream is a WebSocketStream subclass. |
// WebSocketDeflateStream is for permessage-deflate WebSocket extension[1]. |
// |
+// WebSocketDeflateStream::ReadFrames and WriteFrames may change frame |
+// boundary. In particular, if a control frame is placed in the middle of |
+// data message frames, the control frame can overtake data frames. |
+// Say there are frames df1, df2 and cf, df1 and df2 are frames of a |
+// data message and cf is a control message frame. cf may arrive first and |
+// data frames may follow cf. |
+// Note that message boundary will be preserved, i.e. if the last frame of |
+// a message m1 is read / written before the last frame of a message m2, |
+// WebSocketDeflateStream will respect the order. |
+// |
// [1]: http://tools.ietf.org/html/draft-ietf-hybi-permessage-compression-12 |
class NET_EXPORT_PRIVATE WebSocketDeflateStream : public WebSocketStream { |
public: |
WebSocketDeflateStream(scoped_ptr<WebSocketStream> stream, |
- WebSocketDeflater::ContextTakeOverMode mode); |
+ WebSocketDeflater::ContextTakeOverMode mode, |
+ scoped_ptr<WebSocketDeflatePredictor> predictor); |
virtual ~WebSocketDeflateStream(); |
// WebSocketStream functions. |
@@ -50,6 +63,7 @@ class NET_EXPORT_PRIVATE WebSocketDeflateStream : public WebSocketStream { |
enum WritingState { |
WRITING_COMPRESSED_MESSAGE, |
WRITING_UNCOMPRESSED_MESSAGE, |
+ WRITING_POSSIBLY_COMPRESSED_MESSAGE, |
NOT_WRITING, |
}; |
@@ -59,6 +73,12 @@ class NET_EXPORT_PRIVATE WebSocketDeflateStream : public WebSocketStream { |
// This function deflates |frames| and stores the result to |frames| itself. |
int Deflate(ScopedVector<WebSocketFrame>* frames); |
+ void OnMessageStart(const ScopedVector<WebSocketFrame>& frames, size_t index); |
+ int AppendCompressedFrame(const WebSocketFrameHeader& header, |
+ ScopedVector<WebSocketFrame>* frames_to_write); |
+ int AppendPossiblyCompressedMessage( |
+ ScopedVector<WebSocketFrame>* frames, |
+ ScopedVector<WebSocketFrame>* frames_to_write); |
// This function inflates |frames| and stores the result to |frames| itself. |
int Inflate(ScopedVector<WebSocketFrame>* frames); |
@@ -73,6 +93,7 @@ class NET_EXPORT_PRIVATE WebSocketDeflateStream : public WebSocketStream { |
WritingState writing_state_; |
WebSocketFrameHeader::OpCode current_reading_opcode_; |
WebSocketFrameHeader::OpCode current_writing_opcode_; |
+ scoped_ptr<WebSocketDeflatePredictor> predictor_; |
DISALLOW_COPY_AND_ASSIGN(WebSocketDeflateStream); |
}; |