MCPcopy Create free account
hub / github.com/apache/brpc / popGet

Method popGet

src/brpc/couchbase.cpp:978–1053  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

976BAIDU_CASSERT(sizeof(FlushHeaderWithExtras) == 28, must_match);
977
978bool 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);

Callers 3

mainFunction · 0.80
sendRequestFunction · 0.80
executePipelineMethod · 0.80

Calls 7

string_printfFunction · 0.85
NetToHost32Function · 0.85
sizeMethod · 0.45
copy_toMethod · 0.45
pop_frontMethod · 0.45
cutnMethod · 0.45
clearMethod · 0.45

Tested by

no test coverage detected