/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 * 
 *     http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
#include "MetadataConstants.h"

ROCKETMQ_NAMESPACE_BEGIN

const char* MetadataConstants::TENANT_ID_KEY = "x-mq-tenant-id";
const char* MetadataConstants::NAMESPACE_KEY = "x-mq-namespace";
const char* MetadataConstants::AUTHORIZATION = "authorization";
const char* MetadataConstants::STS_SESSION_TOKEN = "x-mq-session-token";
const char* MetadataConstants::DATE_TIME_KEY = "x-mq-date-time";
const char* MetadataConstants::ALGORITHM_KEY = "MQv2-HMAC-SHA1";
const char* MetadataConstants::CREDENTIAL_KEY = "Credential";
const char* MetadataConstants::SIGNED_HEADERS_KEY = "SignedHeaders";
const char* MetadataConstants::SIGNATURE_KEY = "Signature";
const char* MetadataConstants::DATE_TIME_FORMAT = "%Y%m%dT%H%M%SZ";
const char* MetadataConstants::LANGUAGE_KEY = "x-mq-language";
const char* MetadataConstants::CLIENT_VERSION_KEY = "x-mq-client-version";
const char* MetadataConstants::PROTOCOL_VERSION_KEY = "x-mq-protocol-version";
const char* MetadataConstants::REQUEST_ID_KEY = "x-mq-request-id";

ROCKETMQ_NAMESPACE_END