validate the entire rpc header (magic number + flags)
| 186 | |
| 187 | // validate the entire rpc header (magic number + flags) |
| 188 | Status ValidateConnHeader(const Slice& slice) { |
| 189 | DCHECK_EQ(kMagicNumberLength + kHeaderFlagsLength, slice.size()) |
| 190 | << "Invalid RPC header length"; |
| 191 | |
| 192 | // validate actual magic |
| 193 | if (!slice.starts_with(kMagicNumber)) { |
| 194 | if (slice.starts_with("GET ") || |
| 195 | slice.starts_with("POST") || |
| 196 | slice.starts_with("HEAD")) { |
| 197 | return Status::InvalidArgument("invalid negotation, appears to be an HTTP client on " |
| 198 | "the RPC port"); |
| 199 | } |
| 200 | return Status::InvalidArgument("connection must begin with magic number", kMagicNumber); |
| 201 | } |
| 202 | |
| 203 | const uint8_t *data = slice.data(); |
| 204 | data += kMagicNumberLength; |
| 205 | |
| 206 | // validate version |
| 207 | if (data[kHeaderPosVersion] != kCurrentRpcVersion) { |
| 208 | return Status::InvalidArgument("Unsupported RPC version", |
| 209 | StringPrintf("Received: %d, Supported: %d", |
| 210 | data[kHeaderPosVersion], kCurrentRpcVersion)); |
| 211 | } |
| 212 | |
| 213 | // TODO: validate additional header flags: |
| 214 | // RPC_SERVICE_CLASS |
| 215 | // RPC_AUTH_PROTOCOL |
| 216 | |
| 217 | return Status::OK(); |
| 218 | } |
| 219 | |
| 220 | } // namespace serialization |
| 221 | } // namespace rpc |