| 976 | BAIDU_CASSERT(sizeof(FlushHeaderWithExtras) == 28, must_match); |
| 977 | |
| 978 | bool CouchbaseOperations::CouchbaseResponse::popGet(butil::IOBuf* value, |
| 979 | uint32_t* flags, |
| 980 | uint64_t* cas_value) { |
| 981 | const size_t n = _buf.size(); |
| 982 | policy::CouchbaseResponseHeader header; |
| 983 | if (n < sizeof(header)) { |
| 984 | butil::string_printf(&_err, "buffer is too small to contain a header"); |
| 985 | return false; |
| 986 | } |
| 987 | _buf.copy_to(&header, sizeof(header)); |
| 988 | if (header.command != (uint8_t)policy::CB_BINARY_GET) { |
| 989 | butil::string_printf(&_err, "not a GET response"); |
| 990 | return false; |
| 991 | } |
| 992 | if (n < sizeof(header) + header.total_body_length) { |
| 993 | butil::string_printf(&_err, "response=%u < header=%u + body=%u", |
| 994 | (unsigned)n, (unsigned)sizeof(header), |
| 995 | header.total_body_length); |
| 996 | return false; |
| 997 | } |
| 998 | if (header.status != (uint16_t)STATUS_SUCCESS) { |
| 999 | if (DBUG && header.extras_length != 0) { |
| 1000 | DEBUG_PRINT("GET response must not have flags"); |
| 1001 | } |
| 1002 | if (DBUG && header.key_length != 0) { |
| 1003 | DEBUG_PRINT("GET response must not have key"); |
| 1004 | } |
| 1005 | const int value_size = (int)header.total_body_length - |
| 1006 | (int)header.extras_length - (int)header.key_length; |
| 1007 | _status_code = header.status; |
| 1008 | if (value_size < 0) { |
| 1009 | butil::string_printf(&_err, "value_size=%d is non-negative", value_size); |
| 1010 | return false; |
| 1011 | } |
| 1012 | _buf.pop_front(sizeof(header) + header.extras_length + header.key_length); |
| 1013 | if (value_size > 0) { |
| 1014 | std::string error_msg; |
| 1015 | _buf.cutn(&error_msg, value_size); |
| 1016 | _err = formatErrorMessage(header.status, "GET operation", error_msg); |
| 1017 | } else { |
| 1018 | _err = formatErrorMessage(header.status, "GET operation"); |
| 1019 | } |
| 1020 | return false; |
| 1021 | } |
| 1022 | if (header.extras_length != 4u) { |
| 1023 | butil::string_printf( |
| 1024 | &_err, "GET response must have flags as extras, actual length=%u", |
| 1025 | header.extras_length); |
| 1026 | return false; |
| 1027 | } |
| 1028 | if (header.key_length != 0) { |
| 1029 | butil::string_printf(&_err, "GET response must not have key"); |
| 1030 | return false; |
| 1031 | } |
| 1032 | const int value_size = (int)header.total_body_length - |
| 1033 | (int)header.extras_length - (int)header.key_length; |
| 1034 | if (value_size < 0) { |
| 1035 | butil::string_printf(&_err, "value_size=%d is non-negative", value_size); |
no test coverage detected