MemFlushResult::Ptr MemcachedClient::Flush(ServerItem::Ptr server,uint32_t expiry,Callback callback) { int requestId = mNextRequestId.fetch_add(1); MemFlushResult::Ptr result = boost::make_shared<MemFlushResult>("flush",Buffer()); MemResult::Ptr baseResult = result; mRequests.insert(std::make_pair(requestId,RequestItem(callback,baseResult))); size_t requestSize = sizeof(protocol_binary_request_flush); ConstBuffer requestBuf(malloc(requestSize) ,requestSize ,[this](void* pData) { free(pData); }); auto& request = requestBuf.GetHeader<protocol_binary_request_header>(); request.request.magic = PROTOCOL_BINARY_REQ; request.request.opcode = PROTOCOL_BINARY_CMD_FLUSH; request.request.keylen = 0; request.request.extlen = 0; request.request.datatype = 0; request.request.reserved = 0; request.request.bodylen = 0; request.request.opaque = requestId; request.request.cas = 0; AdjustEndian(&request); auto& flushRequest = requestBuf.GetHeader<protocol_binary_request_flush>(); flushRequest.message.body.expiration = htonl(expiry); server->SendRequest(requestId,requestBuf); return result; }
SharedArrayPtr<char> Tracer::getHTTPRequestMessage( const Buffer& requestMessage) { const Uint32 requestSize = requestMessage.size(); // Check if requestMessage contains "application/x-openpegasus" // and if true format the the requestBuf as HexDump for tracing // // Binary is only possible on localConnect and doesn't have Basic // authorization for that reason if (strstr(requestMessage.getData(),"application/x-openpegasus")) { return traceFormatChars(requestMessage,true); } // Make a copy of the request message. SharedArrayPtr<char> requestBuf(new char [requestSize + 1]); strncpy(requestBuf.get(), requestMessage.getData(), requestSize); requestBuf.get()[requestSize] = 0; // // Check if requestBuffer contains a Basic authorization header. // If true, suppress the user/passwd info in the request buffer. // char* sep; const char* line = requestBuf.get(); while ((sep = HTTPMessage::findSeparator(line)) && (line != sep)) { if (HTTPMessage::expectHeaderToken(line, "Authorization") && HTTPMessage::expectHeaderToken(line, ":") && HTTPMessage::expectHeaderToken(line, "Basic")) { // Suppress the user/passwd info HTTPMessage::skipHeaderWhitespace(line); for ( char* userpass = (char*)line ; userpass < sep; *userpass = '******', userpass++) { } break; } line = sep + ((*sep == '\r') ? 2 : 1); } return requestBuf; }