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 // TODO(rtenhove) clean up frame buffer size calculations so that we aren't | 5 // TODO(rtenhove) clean up frame buffer size calculations so that we aren't |
6 // constantly adding and subtracting header sizes; this is ugly and error- | 6 // constantly adding and subtracting header sizes; this is ugly and error- |
7 // prone. | 7 // prone. |
8 | 8 |
9 #include "net/spdy/spdy_framer.h" | 9 #include "net/spdy/spdy_framer.h" |
10 | 10 |
(...skipping 2013 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2024 << num_headers << ")."; | 2024 << num_headers << ")."; |
2025 return 0; | 2025 return 0; |
2026 } | 2026 } |
2027 | 2027 |
2028 // Store header. | 2028 // Store header. |
2029 (*block)[name] = value; | 2029 (*block)[name] = value; |
2030 } | 2030 } |
2031 return reader.GetBytesConsumed(); | 2031 return reader.GetBytesConsumed(); |
2032 } | 2032 } |
2033 | 2033 |
2034 SpdySerializedFrame* SpdyFramer::SerializeData(const SpdyDataIR& datair) const { | 2034 SpdySerializedFrame* SpdyFramer::SerializeData( |
| 2035 const SpdyDataIR& data_ir) const { |
2035 uint8 flags = DATA_FLAG_NONE; | 2036 uint8 flags = DATA_FLAG_NONE; |
2036 if (datair.fin()) { | 2037 if (data_ir.fin()) { |
2037 flags = DATA_FLAG_FIN; | 2038 flags = DATA_FLAG_FIN; |
2038 } | 2039 } |
2039 | 2040 |
2040 if (protocol_version() > SPDY3) { | 2041 if (protocol_version() > SPDY3) { |
2041 int num_padding_fields = 0; | 2042 int num_padding_fields = 0; |
2042 if (datair.pad_low()) { | 2043 if (data_ir.pad_low()) { |
2043 flags |= DATA_FLAG_PAD_LOW; | 2044 flags |= DATA_FLAG_PAD_LOW; |
2044 ++num_padding_fields; | 2045 ++num_padding_fields; |
2045 } | 2046 } |
2046 if (datair.pad_high()) { | 2047 if (data_ir.pad_high()) { |
2047 flags |= DATA_FLAG_PAD_HIGH; | 2048 flags |= DATA_FLAG_PAD_HIGH; |
2048 ++num_padding_fields; | 2049 ++num_padding_fields; |
2049 } | 2050 } |
2050 | 2051 |
2051 const size_t size_with_padding = num_padding_fields + | 2052 const size_t size_with_padding = num_padding_fields + |
2052 datair.data().length() + datair.padding_payload_len() + | 2053 data_ir.data().length() + data_ir.padding_payload_len() + |
2053 GetDataFrameMinimumSize(); | 2054 GetDataFrameMinimumSize(); |
2054 SpdyFrameBuilder builder(size_with_padding); | 2055 SpdyFrameBuilder builder(size_with_padding); |
2055 builder.WriteDataFrameHeader(*this, datair.stream_id(), flags); | 2056 builder.WriteDataFrameHeader(*this, data_ir.stream_id(), flags); |
2056 if (datair.pad_high()) { | 2057 if (data_ir.pad_high()) { |
2057 builder.WriteUInt8(datair.padding_payload_len() >> 8); | 2058 builder.WriteUInt8(data_ir.padding_payload_len() >> 8); |
2058 } | 2059 } |
2059 if (datair.pad_low()) { | 2060 if (data_ir.pad_low()) { |
2060 builder.WriteUInt8(datair.padding_payload_len() & 0xff); | 2061 builder.WriteUInt8(data_ir.padding_payload_len() & 0xff); |
2061 } | 2062 } |
2062 builder.WriteBytes(datair.data().data(), datair.data().length()); | 2063 builder.WriteBytes(data_ir.data().data(), data_ir.data().length()); |
2063 if (datair.padding_payload_len() > 0) { | 2064 if (data_ir.padding_payload_len() > 0) { |
2064 string padding = string(datair.padding_payload_len(), '0'); | 2065 string padding = string(data_ir.padding_payload_len(), '0'); |
2065 builder.WriteBytes(padding.data(), padding.length()); | 2066 builder.WriteBytes(padding.data(), padding.length()); |
2066 } | 2067 } |
2067 DCHECK_EQ(size_with_padding, builder.length()); | 2068 DCHECK_EQ(size_with_padding, builder.length()); |
2068 return builder.take(); | 2069 return builder.take(); |
2069 } else { | 2070 } else { |
2070 const size_t size = GetDataFrameMinimumSize() + datair.data().length(); | 2071 const size_t size = GetDataFrameMinimumSize() + data_ir.data().length(); |
2071 SpdyFrameBuilder builder(size); | 2072 SpdyFrameBuilder builder(size); |
2072 builder.WriteDataFrameHeader(*this, datair.stream_id(), flags); | 2073 builder.WriteDataFrameHeader(*this, data_ir.stream_id(), flags); |
2073 builder.WriteBytes(datair.data().data(), datair.data().length()); | 2074 builder.WriteBytes(data_ir.data().data(), data_ir.data().length()); |
2074 DCHECK_EQ(size, builder.length()); | 2075 DCHECK_EQ(size, builder.length()); |
2075 return builder.take(); | 2076 return builder.take(); |
2076 } | 2077 } |
2077 } | 2078 } |
2078 | 2079 |
2079 SpdySerializedFrame* SpdyFramer::SerializeDataFrameHeader( | 2080 SpdySerializedFrame* SpdyFramer::SerializeDataFrameHeaderWithPaddingLengthField( |
2080 const SpdyDataIR& data) const { | 2081 const SpdyDataIR& data_ir) const { |
2081 const size_t kSize = GetDataFrameMinimumSize(); | |
2082 | |
2083 uint8 flags = DATA_FLAG_NONE; | 2082 uint8 flags = DATA_FLAG_NONE; |
2084 if (data.fin()) { | 2083 if (data_ir.fin()) { |
2085 flags = DATA_FLAG_FIN; | 2084 flags = DATA_FLAG_FIN; |
2086 } | 2085 } |
| 2086 |
| 2087 size_t frame_size = GetDataFrameMinimumSize(); |
| 2088 size_t num_padding_fields = 0; |
2087 if (protocol_version() > SPDY3) { | 2089 if (protocol_version() > SPDY3) { |
2088 if (data.pad_low()) { | 2090 if (data_ir.pad_low()) { |
2089 flags |= DATA_FLAG_PAD_LOW; | 2091 flags |= DATA_FLAG_PAD_LOW; |
| 2092 ++num_padding_fields; |
2090 } | 2093 } |
2091 if (data.pad_high()) { | 2094 if (data_ir.pad_high()) { |
2092 flags |= DATA_FLAG_PAD_HIGH; | 2095 flags |= DATA_FLAG_PAD_HIGH; |
| 2096 ++num_padding_fields; |
2093 } | 2097 } |
| 2098 frame_size += num_padding_fields; |
2094 } | 2099 } |
2095 | 2100 |
2096 SpdyFrameBuilder builder(kSize); | 2101 SpdyFrameBuilder builder(frame_size); |
2097 builder.WriteDataFrameHeader(*this, data.stream_id(), flags); | 2102 builder.WriteDataFrameHeader(*this, data_ir.stream_id(), flags); |
2098 builder.OverwriteLength(*this, data.data().length()); | 2103 if (protocol_version() > SPDY3) { |
2099 DCHECK_EQ(kSize, builder.length()); | 2104 if (data_ir.pad_high()) { |
| 2105 builder.WriteUInt8(data_ir.padding_payload_len() >> 8); |
| 2106 } |
| 2107 if (data_ir.pad_low()) { |
| 2108 builder.WriteUInt8(data_ir.padding_payload_len() & 0xff); |
| 2109 } |
| 2110 builder.OverwriteLength(*this, num_padding_fields + |
| 2111 data_ir.data().length() + data_ir.padding_payload_len()); |
| 2112 } else { |
| 2113 builder.OverwriteLength(*this, data_ir.data().length()); |
| 2114 } |
| 2115 DCHECK_EQ(frame_size, builder.length()); |
2100 return builder.take(); | 2116 return builder.take(); |
2101 } | 2117 } |
2102 | 2118 |
2103 SpdySerializedFrame* SpdyFramer::SerializeSynStream( | 2119 SpdySerializedFrame* SpdyFramer::SerializeSynStream( |
2104 const SpdySynStreamIR& syn_stream) { | 2120 const SpdySynStreamIR& syn_stream) { |
2105 uint8 flags = 0; | 2121 uint8 flags = 0; |
2106 if (syn_stream.fin()) { | 2122 if (syn_stream.fin()) { |
2107 flags |= CONTROL_FLAG_FIN; | 2123 flags |= CONTROL_FLAG_FIN; |
2108 } | 2124 } |
2109 if (syn_stream.unidirectional()) { | 2125 if (syn_stream.unidirectional()) { |
(...skipping 757 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2867 builder->Seek(compressed_size); | 2883 builder->Seek(compressed_size); |
2868 builder->RewriteLength(*this); | 2884 builder->RewriteLength(*this); |
2869 | 2885 |
2870 pre_compress_bytes.Add(uncompressed_len); | 2886 pre_compress_bytes.Add(uncompressed_len); |
2871 post_compress_bytes.Add(compressed_size); | 2887 post_compress_bytes.Add(compressed_size); |
2872 | 2888 |
2873 compressed_frames.Increment(); | 2889 compressed_frames.Increment(); |
2874 } | 2890 } |
2875 | 2891 |
2876 } // namespace net | 2892 } // namespace net |
OLD | NEW |