| 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 |