Home | History | Annotate | Download | only in websockets
      1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef NET_WEBSOCKETS_WEBSOCKET_FRAME_HANDLER_H_
      6 #define NET_WEBSOCKETS_WEBSOCKET_FRAME_HANDLER_H_
      7 #pragma once
      8 
      9 #include <deque>
     10 #include <vector>
     11 
     12 #include "base/basictypes.h"
     13 #include "base/memory/ref_counted.h"
     14 
     15 namespace net {
     16 
     17 class IOBuffer;
     18 class IOBufferWithSize;
     19 
     20 // Handles WebSocket frame messages.
     21 class WebSocketFrameHandler {
     22  public:
     23   struct FrameInfo {
     24     const char* frame_start;
     25     int frame_length;
     26     const char* message_start;
     27     int message_length;
     28   };
     29 
     30   WebSocketFrameHandler();
     31   ~WebSocketFrameHandler();
     32 
     33   // Appends WebSocket raw data on connection.
     34   // For sending, this is data from WebKit.
     35   // For receiving, this is data from network.
     36   void AppendData(const char* data, int len);
     37 
     38   // Updates current IOBuffer.
     39   // If |buffered| is true, it tries to find WebSocket frames.
     40   // Otherwise, it just picks the first buffer in |pending_buffers_|.
     41   // Returns available size of data, 0 if no more data or current buffer was
     42   // not released, and negative if some error occurred.
     43   int UpdateCurrentBuffer(bool buffered);
     44 
     45   // Gets current IOBuffer.
     46   // For sending, this is data to network.
     47   // For receiving, this is data to WebKit.
     48   // Returns NULL just after ReleaseCurrentBuffer() was called.
     49   IOBuffer* GetCurrentBuffer() { return current_buffer_.get(); }
     50   int GetCurrentBufferSize() const { return current_buffer_size_; }
     51 
     52   // Returns original buffer size of current IOBuffer.
     53   // This might differ from GetCurrentBufferSize() if frame message is
     54   // compressed or decompressed.
     55   int GetOriginalBufferSize() const { return original_current_buffer_size_; }
     56 
     57   // Releases current IOBuffer.
     58   void ReleaseCurrentBuffer();
     59 
     60   // Parses WebSocket frame in [|buffer|, |buffer|+|size|), fills frame
     61   // information in |frame_info|, and returns number of bytes for
     62   // complete WebSocket frames.
     63   static int ParseWebSocketFrame(const char* buffer, int size,
     64                                  std::vector<FrameInfo>* frame_info);
     65 
     66  private:
     67   typedef std::deque< scoped_refptr<IOBufferWithSize> > PendingDataQueue;
     68 
     69   scoped_refptr<IOBuffer> current_buffer_;
     70   int current_buffer_size_;
     71 
     72   int original_current_buffer_size_;
     73 
     74   // Deque of IOBuffers in pending.
     75   PendingDataQueue pending_buffers_;
     76 
     77   DISALLOW_COPY_AND_ASSIGN(WebSocketFrameHandler);
     78 };
     79 
     80 }  // namespace net
     81 
     82 #endif  // NET_WEBSOCKETS_WEBSOCKET_FRAME_HANDLER_H_
     83