buffer for read input data, - header + message data
| 148 | |
| 149 | //buffer for read input data, - header + message data |
| 150 | struct TTcp2Message { |
| 151 | TTcp2Message() |
| 152 | : Loader_(&TTcp2Message::LoadBaseHeader) |
| 153 | , RequireBytesForComplete_(sizeof(TBaseHeader)) |
| 154 | , Header_(sizeof(TBaseHeader)) |
| 155 | { |
| 156 | } |
| 157 | |
| 158 | void Clear() { |
| 159 | Loader_ = &TTcp2Message::LoadBaseHeader; |
| 160 | RequireBytesForComplete_ = sizeof(TBaseHeader); |
| 161 | Header_.Clear(); |
| 162 | Content_.clear(); |
| 163 | } |
| 164 | |
| 165 | TBuffer& Header() noexcept { |
| 166 | return Header_; |
| 167 | } |
| 168 | |
| 169 | const TString& Content() const noexcept { |
| 170 | return Content_; |
| 171 | } |
| 172 | |
| 173 | bool IsComplete() const noexcept { |
| 174 | return RequireBytesForComplete_ == 0; |
| 175 | } |
| 176 | |
| 177 | size_t LoadFrom(const char* buf, size_t len) { |
| 178 | return (this->*Loader_)(buf, len); |
| 179 | } |
| 180 | |
| 181 | const TBaseHeader& BaseHeader() const { |
| 182 | return *reinterpret_cast<const TBaseHeader*>(Header_.Data()); |
| 183 | } |
| 184 | |
| 185 | const TRequestHeader& RequestHeader() const { |
| 186 | return *reinterpret_cast<const TRequestHeader*>(Header_.Data()); |
| 187 | } |
| 188 | |
| 189 | const TResponseHeader& ResponseHeader() const { |
| 190 | return *reinterpret_cast<const TResponseHeader*>(Header_.Data()); |
| 191 | } |
| 192 | |
| 193 | private: |
| 194 | size_t LoadBaseHeader(const char* buf, size_t len) { |
| 195 | size_t useBytes = Min<size_t>(sizeof(TBaseHeader) - Header_.Size(), len); |
| 196 | Header_.Append(buf, useBytes); |
| 197 | if (Y_UNLIKELY(sizeof(TBaseHeader) > Header_.Size())) { |
| 198 | //base header yet not complete |
| 199 | return useBytes; |
| 200 | } |
| 201 | { |
| 202 | const TBaseHeader& hdr = BaseHeader(); |
| 203 | if (BaseHeader().HeaderLength > 32000) { //some heuristic header size limit |
| 204 | throw yexception() << TStringBuf("to large neh/tcp2 header size: ") << BaseHeader().HeaderLength; |
| 205 | } |
| 206 | //header completed |
| 207 | Header_.Reserve(hdr.HeaderLength); |