OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef NET_SPDY_SPDY_FRAMER_H_ | 5 #ifndef NET_SPDY_SPDY_FRAMER_H_ |
6 #define NET_SPDY_SPDY_FRAMER_H_ | 6 #define NET_SPDY_SPDY_FRAMER_H_ |
7 | 7 |
8 #include <list> | 8 #include <list> |
9 #include <map> | 9 #include <map> |
| 10 #include <memory> |
10 #include <string> | 11 #include <string> |
11 #include <utility> | 12 #include <utility> |
12 #include <vector> | 13 #include <vector> |
13 | 14 |
14 #include "base/basictypes.h" | 15 #include "base/basictypes.h" |
15 #include "base/gtest_prod_util.h" | 16 #include "base/gtest_prod_util.h" |
16 #include "base/memory/scoped_ptr.h" | 17 #include "base/memory/scoped_ptr.h" |
| 18 #include "base/strings/string_piece.h" |
17 #include "base/sys_byteorder.h" | 19 #include "base/sys_byteorder.h" |
18 #include "net/base/net_export.h" | 20 #include "net/base/net_export.h" |
19 #include "net/spdy/hpack_decoder.h" | 21 #include "net/spdy/hpack_decoder.h" |
20 #include "net/spdy/hpack_encoder.h" | 22 #include "net/spdy/hpack_encoder.h" |
21 #include "net/spdy/spdy_header_block.h" | 23 #include "net/spdy/spdy_header_block.h" |
22 #include "net/spdy/spdy_protocol.h" | 24 #include "net/spdy/spdy_protocol.h" |
23 | 25 |
24 // TODO(akalin): Remove support for CREDENTIAL frames. | 26 // TODO(akalin): Remove support for CREDENTIAL frames. |
25 | 27 |
26 typedef struct z_stream_s z_stream; // Forward declaration for zlib. | 28 typedef struct z_stream_s z_stream; // Forward declaration for zlib. |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
94 | 96 |
95 // The amount of the buffer that is filled with valid data. | 97 // The amount of the buffer that is filled with valid data. |
96 size_t setting_buf_len; | 98 size_t setting_buf_len; |
97 | 99 |
98 // The ID of the last setting that was processed in the current SETTINGS | 100 // The ID of the last setting that was processed in the current SETTINGS |
99 // frame. Used for detecting out-of-order or duplicate keys within a settings | 101 // frame. Used for detecting out-of-order or duplicate keys within a settings |
100 // frame. Set to -1 before first key/value pair is processed. | 102 // frame. Set to -1 before first key/value pair is processed. |
101 int last_setting_id; | 103 int last_setting_id; |
102 }; | 104 }; |
103 | 105 |
| 106 // Scratch space necessary for processing ALTSVC frames. |
| 107 struct NET_EXPORT_PRIVATE SpdyAltSvcScratch { |
| 108 SpdyAltSvcScratch(); |
| 109 ~SpdyAltSvcScratch(); |
| 110 |
| 111 void Reset() { |
| 112 max_age = 0; |
| 113 port = 0; |
| 114 pid_len = 0; |
| 115 host_len = 0; |
| 116 origin_len = 0; |
| 117 pid_buf_len = 0; |
| 118 host_buf_len = 0; |
| 119 origin_buf_len = 0; |
| 120 protocol_id.reset(); |
| 121 host.reset(); |
| 122 origin.reset(); |
| 123 } |
| 124 |
| 125 uint32 max_age; |
| 126 uint16 port; |
| 127 uint8 pid_len; |
| 128 uint8 host_len; |
| 129 size_t origin_len; |
| 130 size_t pid_buf_len; |
| 131 size_t host_buf_len; |
| 132 size_t origin_buf_len; |
| 133 scoped_ptr<char[]> protocol_id; |
| 134 scoped_ptr<char[]> host; |
| 135 scoped_ptr<char[]> origin; |
| 136 }; |
| 137 |
104 // SpdyFramerVisitorInterface is a set of callbacks for the SpdyFramer. | 138 // SpdyFramerVisitorInterface is a set of callbacks for the SpdyFramer. |
105 // Implement this interface to receive event callbacks as frames are | 139 // Implement this interface to receive event callbacks as frames are |
106 // decoded from the framer. | 140 // decoded from the framer. |
107 // | 141 // |
108 // Control frames that contain SPDY header blocks (SYN_STREAM, SYN_REPLY, | 142 // Control frames that contain SPDY header blocks (SYN_STREAM, SYN_REPLY, |
109 // HEADER, and PUSH_PROMISE) are processed in fashion that allows the | 143 // HEADER, and PUSH_PROMISE) are processed in fashion that allows the |
110 // decompressed header block to be delivered in chunks to the visitor. | 144 // decompressed header block to be delivered in chunks to the visitor. |
111 // The following steps are followed: | 145 // The following steps are followed: |
112 // 1. OnSynStream, OnSynReply, OnHeaders, or OnPushPromise is called. | 146 // 1. OnSynStream, OnSynReply, OnHeaders, or OnPushPromise is called. |
113 // 2. Repeated: OnControlFrameHeaderData is called with chunks of the | 147 // 2. Repeated: OnControlFrameHeaderData is called with chunks of the |
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
235 // Note that header block data is not included. See | 269 // Note that header block data is not included. See |
236 // OnControlFrameHeaderData(). | 270 // OnControlFrameHeaderData(). |
237 virtual void OnPushPromise(SpdyStreamId stream_id, | 271 virtual void OnPushPromise(SpdyStreamId stream_id, |
238 SpdyStreamId promised_stream_id, | 272 SpdyStreamId promised_stream_id, |
239 bool end) = 0; | 273 bool end) = 0; |
240 | 274 |
241 // Called when a CONTINUATION frame is received. | 275 // Called when a CONTINUATION frame is received. |
242 // Note that header block data is not included. See | 276 // Note that header block data is not included. See |
243 // OnControlFrameHeaderData(). | 277 // OnControlFrameHeaderData(). |
244 virtual void OnContinuation(SpdyStreamId stream_id, bool end) = 0; | 278 virtual void OnContinuation(SpdyStreamId stream_id, bool end) = 0; |
| 279 |
| 280 // Called when an ALTSVC frame has been parsed. |
| 281 virtual void OnAltSvc(SpdyStreamId stream_id, |
| 282 uint32 max_age, |
| 283 uint16 port, |
| 284 base::StringPiece protocol_id, |
| 285 base::StringPiece host, |
| 286 base::StringPiece origin) {} |
245 }; | 287 }; |
246 | 288 |
247 // Optionally, and in addition to SpdyFramerVisitorInterface, a class supporting | 289 // Optionally, and in addition to SpdyFramerVisitorInterface, a class supporting |
248 // SpdyFramerDebugVisitorInterface may be used in conjunction with SpdyFramer in | 290 // SpdyFramerDebugVisitorInterface may be used in conjunction with SpdyFramer in |
249 // order to extract debug/internal information about the SpdyFramer as it | 291 // order to extract debug/internal information about the SpdyFramer as it |
250 // operates. | 292 // operates. |
251 // | 293 // |
252 // Most SPDY implementations need not bother with this interface at all. | 294 // Most SPDY implementations need not bother with this interface at all. |
253 class NET_EXPORT_PRIVATE SpdyFramerDebugVisitorInterface { | 295 class NET_EXPORT_PRIVATE SpdyFramerDebugVisitorInterface { |
254 public: | 296 public: |
(...skipping 29 matching lines...) Expand all Loading... |
284 SPDY_CONTROL_FRAME_PAYLOAD, | 326 SPDY_CONTROL_FRAME_PAYLOAD, |
285 SPDY_READ_PADDING_LENGTH, | 327 SPDY_READ_PADDING_LENGTH, |
286 SPDY_CONSUME_PADDING, | 328 SPDY_CONSUME_PADDING, |
287 SPDY_IGNORE_REMAINING_PAYLOAD, | 329 SPDY_IGNORE_REMAINING_PAYLOAD, |
288 SPDY_FORWARD_STREAM_FRAME, | 330 SPDY_FORWARD_STREAM_FRAME, |
289 SPDY_CONTROL_FRAME_BEFORE_HEADER_BLOCK, | 331 SPDY_CONTROL_FRAME_BEFORE_HEADER_BLOCK, |
290 SPDY_CONTROL_FRAME_HEADER_BLOCK, | 332 SPDY_CONTROL_FRAME_HEADER_BLOCK, |
291 SPDY_GOAWAY_FRAME_PAYLOAD, | 333 SPDY_GOAWAY_FRAME_PAYLOAD, |
292 SPDY_RST_STREAM_FRAME_PAYLOAD, | 334 SPDY_RST_STREAM_FRAME_PAYLOAD, |
293 SPDY_SETTINGS_FRAME_PAYLOAD, | 335 SPDY_SETTINGS_FRAME_PAYLOAD, |
| 336 SPDY_ALTSVC_FRAME_PAYLOAD, |
294 }; | 337 }; |
295 | 338 |
296 // SPDY error codes. | 339 // SPDY error codes. |
297 enum SpdyError { | 340 enum SpdyError { |
298 SPDY_NO_ERROR, | 341 SPDY_NO_ERROR, |
299 SPDY_INVALID_CONTROL_FRAME, // Control frame is mal-formatted. | 342 SPDY_INVALID_CONTROL_FRAME, // Control frame is mal-formatted. |
300 SPDY_CONTROL_PAYLOAD_TOO_LARGE, // Control frame payload was too large. | 343 SPDY_CONTROL_PAYLOAD_TOO_LARGE, // Control frame payload was too large. |
301 SPDY_ZLIB_INIT_FAILURE, // The Zlib library could not initialize. | 344 SPDY_ZLIB_INIT_FAILURE, // The Zlib library could not initialize. |
302 SPDY_UNSUPPORTED_VERSION, // Control frame has unsupported version. | 345 SPDY_UNSUPPORTED_VERSION, // Control frame has unsupported version. |
303 SPDY_DECOMPRESS_FAILURE, // There was an error decompressing. | 346 SPDY_DECOMPRESS_FAILURE, // There was an error decompressing. |
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
424 const SpdyPushPromiseIR& push_promise); | 467 const SpdyPushPromiseIR& push_promise); |
425 | 468 |
426 // Serializes a CONTINUATION frame. The CONTINUATION frame is used | 469 // Serializes a CONTINUATION frame. The CONTINUATION frame is used |
427 // to continue a sequence of header block fragments. | 470 // to continue a sequence of header block fragments. |
428 // TODO(jgraettinger): This implementation is incorrect. The continuation | 471 // TODO(jgraettinger): This implementation is incorrect. The continuation |
429 // frame continues a previously-begun HPACK encoding; it doesn't begin a | 472 // frame continues a previously-begun HPACK encoding; it doesn't begin a |
430 // new one. Figure out whether it makes sense to keep SerializeContinuation(). | 473 // new one. Figure out whether it makes sense to keep SerializeContinuation(). |
431 SpdySerializedFrame* SerializeContinuation( | 474 SpdySerializedFrame* SerializeContinuation( |
432 const SpdyContinuationIR& continuation); | 475 const SpdyContinuationIR& continuation); |
433 | 476 |
| 477 // Serializes an ALTSVC frame. The ALTSVC frame advertises the |
| 478 // availability of an alternative service to the client. |
| 479 SpdySerializedFrame* SerializeAltSvc(const SpdyAltSvcIR& altsvc); |
| 480 |
434 // Serialize a frame of unknown type. | 481 // Serialize a frame of unknown type. |
435 SpdySerializedFrame* SerializeFrame(const SpdyFrameIR& frame); | 482 SpdySerializedFrame* SerializeFrame(const SpdyFrameIR& frame); |
436 | 483 |
437 // NOTES about frame compression. | 484 // NOTES about frame compression. |
438 // We want spdy to compress headers across the entire session. As long as | 485 // We want spdy to compress headers across the entire session. As long as |
439 // the session is over TCP, frames are sent serially. The client & server | 486 // the session is over TCP, frames are sent serially. The client & server |
440 // can each compress frames in the same order and then compress them in that | 487 // can each compress frames in the same order and then compress them in that |
441 // order, and the remote can do the reverse. However, we ultimately want | 488 // order, and the remote can do the reverse. However, we ultimately want |
442 // the creation of frames to be less sensitive to order so that they can be | 489 // the creation of frames to be less sensitive to order so that they can be |
443 // placed over a UDP based protocol and yet still benefit from some | 490 // placed over a UDP based protocol and yet still benefit from some |
(...skipping 25 matching lines...) Expand all Loading... |
469 size_t GetSynReplyMinimumSize() const; | 516 size_t GetSynReplyMinimumSize() const; |
470 size_t GetRstStreamMinimumSize() const; | 517 size_t GetRstStreamMinimumSize() const; |
471 size_t GetSettingsMinimumSize() const; | 518 size_t GetSettingsMinimumSize() const; |
472 size_t GetPingSize() const; | 519 size_t GetPingSize() const; |
473 size_t GetGoAwayMinimumSize() const; | 520 size_t GetGoAwayMinimumSize() const; |
474 size_t GetHeadersMinimumSize() const; | 521 size_t GetHeadersMinimumSize() const; |
475 size_t GetWindowUpdateSize() const; | 522 size_t GetWindowUpdateSize() const; |
476 size_t GetBlockedSize() const; | 523 size_t GetBlockedSize() const; |
477 size_t GetPushPromiseMinimumSize() const; | 524 size_t GetPushPromiseMinimumSize() const; |
478 size_t GetContinuationMinimumSize() const; | 525 size_t GetContinuationMinimumSize() const; |
| 526 size_t GetAltSvcMinimumSize() const; |
479 | 527 |
480 // Returns the minimum size a frame can be (data or control). | 528 // Returns the minimum size a frame can be (data or control). |
481 size_t GetFrameMinimumSize() const; | 529 size_t GetFrameMinimumSize() const; |
482 | 530 |
483 // Returns the maximum size a frame can be (data or control). | 531 // Returns the maximum size a frame can be (data or control). |
484 size_t GetFrameMaximumSize() const; | 532 size_t GetFrameMaximumSize() const; |
485 | 533 |
486 // Returns the maximum size that a control frame can be. | 534 // Returns the maximum size that a control frame can be. |
487 size_t GetControlFrameMaximumSize() const; | 535 size_t GetControlFrameMaximumSize() const; |
488 | 536 |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
563 // whether data is treated as HPACK- vs SPDY3-encoded. | 611 // whether data is treated as HPACK- vs SPDY3-encoded. |
564 size_t ProcessControlFrameHeaderBlock(const char* data, | 612 size_t ProcessControlFrameHeaderBlock(const char* data, |
565 size_t len, | 613 size_t len, |
566 bool is_hpack_header_block); | 614 bool is_hpack_header_block); |
567 size_t ProcessFramePaddingLength(const char* data, size_t len); | 615 size_t ProcessFramePaddingLength(const char* data, size_t len); |
568 size_t ProcessFramePadding(const char* data, size_t len); | 616 size_t ProcessFramePadding(const char* data, size_t len); |
569 size_t ProcessDataFramePayload(const char* data, size_t len); | 617 size_t ProcessDataFramePayload(const char* data, size_t len); |
570 size_t ProcessGoAwayFramePayload(const char* data, size_t len); | 618 size_t ProcessGoAwayFramePayload(const char* data, size_t len); |
571 size_t ProcessRstStreamFramePayload(const char* data, size_t len); | 619 size_t ProcessRstStreamFramePayload(const char* data, size_t len); |
572 size_t ProcessSettingsFramePayload(const char* data, size_t len); | 620 size_t ProcessSettingsFramePayload(const char* data, size_t len); |
| 621 size_t ProcessAltSvcFramePayload(const char* data, size_t len); |
573 size_t ProcessIgnoredControlFramePayload(/*const char* data,*/ size_t len); | 622 size_t ProcessIgnoredControlFramePayload(/*const char* data,*/ size_t len); |
574 | 623 |
575 // TODO(jgraettinger): To be removed with migration to | 624 // TODO(jgraettinger): To be removed with migration to |
576 // SpdyHeadersHandlerInterface. | 625 // SpdyHeadersHandlerInterface. |
577 // Serializes the last-processed header block of |hpack_decoder_| as | 626 // Serializes the last-processed header block of |hpack_decoder_| as |
578 // a SPDY3 format block, and delivers it to the visitor via reentrant | 627 // a SPDY3 format block, and delivers it to the visitor via reentrant |
579 // call to ProcessControlFrameHeaderBlock(). | 628 // call to ProcessControlFrameHeaderBlock(). |
580 void DeliverHpackBlockAsSpdy3Block(); | 629 void DeliverHpackBlockAsSpdy3Block(); |
581 | 630 |
582 // Helpers for above internal breakouts from ProcessInput. | 631 // Helpers for above internal breakouts from ProcessInput. |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
693 uint32 current_frame_length_; | 742 uint32 current_frame_length_; |
694 | 743 |
695 // The stream ID field of the frame currently being read, if applicable. | 744 // The stream ID field of the frame currently being read, if applicable. |
696 SpdyStreamId current_frame_stream_id_; | 745 SpdyStreamId current_frame_stream_id_; |
697 | 746 |
698 // Scratch space for handling SETTINGS frames. | 747 // Scratch space for handling SETTINGS frames. |
699 // TODO(hkhalil): Unify memory for this scratch space with | 748 // TODO(hkhalil): Unify memory for this scratch space with |
700 // current_frame_buffer_. | 749 // current_frame_buffer_. |
701 SpdySettingsScratch settings_scratch_; | 750 SpdySettingsScratch settings_scratch_; |
702 | 751 |
| 752 SpdyAltSvcScratch altsvc_scratch_; |
| 753 |
703 bool enable_compression_; // Controls all compression | 754 bool enable_compression_; // Controls all compression |
704 // SPDY header compressors. | 755 // SPDY header compressors. |
705 scoped_ptr<z_stream> header_compressor_; | 756 scoped_ptr<z_stream> header_compressor_; |
706 scoped_ptr<z_stream> header_decompressor_; | 757 scoped_ptr<z_stream> header_decompressor_; |
707 | 758 |
708 scoped_ptr<HpackEncoder> hpack_encoder_; | 759 scoped_ptr<HpackEncoder> hpack_encoder_; |
709 scoped_ptr<HpackDecoder> hpack_decoder_; | 760 scoped_ptr<HpackDecoder> hpack_decoder_; |
710 | 761 |
711 SpdyFramerVisitorInterface* visitor_; | 762 SpdyFramerVisitorInterface* visitor_; |
712 SpdyFramerDebugVisitorInterface* debug_visitor_; | 763 SpdyFramerDebugVisitorInterface* debug_visitor_; |
(...skipping 27 matching lines...) Expand all Loading... |
740 // If a HEADERS frame is followed by a CONTINUATION frame, the FIN/END_STREAM | 791 // If a HEADERS frame is followed by a CONTINUATION frame, the FIN/END_STREAM |
741 // flag is still carried in the HEADERS frame. If it's set, flip this so that | 792 // flag is still carried in the HEADERS frame. If it's set, flip this so that |
742 // we know to terminate the stream when the entire header block has been | 793 // we know to terminate the stream when the entire header block has been |
743 // processed. | 794 // processed. |
744 bool end_stream_when_done_; | 795 bool end_stream_when_done_; |
745 }; | 796 }; |
746 | 797 |
747 } // namespace net | 798 } // namespace net |
748 | 799 |
749 #endif // NET_SPDY_SPDY_FRAMER_H_ | 800 #endif // NET_SPDY_SPDY_FRAMER_H_ |
OLD | NEW |