text: #!/usr/bin/python
  # -*- coding:utf-8 -*-
  # Copyright 2019 Huawei Technologies Co.,Ltd.
  # Licensed 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.
  
  import sys
  import platform
  import os
  
  CONTENT_LENGTH_HEADER = 'Content-Length'
  CONTENT_TYPE_HEADER = 'Content-Type'
  CONTENT_MD5_HEADER = 'Content-MD5'
  CACHE_CONTROL_HEADER = 'Cache-Control'
  CONTENT_DISPOSITION_HEADER = 'Content-Disposition'
  CONTENT_ENCODING_HEADER = 'Content-Encoding'
  CONTENT_LANGUAGE_HEADER = 'Content-Language'
  EXPIRES_HEADER = 'Expires'
  
  DATE_HEADER = 'Date'
  
  CONTENT_LIST = [CONTENT_TYPE_HEADER.lower(), CONTENT_MD5_HEADER.lower(), DATE_HEADER.lower()]
  
  HOST_HEADER = 'Host'
  AUTHORIZATION_HEADER = 'Authorization'
  CONNECTION_HEADER = 'Connection'
  PROXY_CONNECTION_HEADER = 'Proxy-Connection'
  PROXY_AUTHORIZATION_HEADER = 'Proxy-Authorization'
  USER_AGENT_HEADER = 'User-Agent'
  TRANSFER_ENCODING_HEADER = 'Transfer-Encoding'
  TRANSFER_ENCODING_VALUE = 'chunked'
  ORIGIN_HEADER = 'Origin'
  RANGE_HEADER = 'Range'
  IF_MODIFIED_SINCE = 'If-Modified-Since'
  IF_UNMODIFIED_SINCE = 'If-Unmodified-Since'
  IF_MATCH = 'If-Match'
  IF_NONE_MATCH = 'If-None-Match'
  
  CONNECTION_KEEP_ALIVE_VALUE = 'Keep-Alive'
  CONNECTION_CLOSE_VALUE = 'close'
  ACCESS_CONTROL_REQUEST_METHOD_HEADER = 'Access-Control-Request-Method'
  ACCESS_CONTROL_REQUEST_HEADERS_HEADER = 'Access-Control-Request-Headers'
  LOCATION_HEADER = 'Location'
  ETAG_HEADER = 'ETag'
  LAST_MODIFIED_HEADER = 'Last-Modified'
  
  VERSION_ID_PARAM = 'versionId'
  RESPONSE_CACHE_CONTROL_PARAM = 'response-cache-control'
  RESPONSE_CONTENT_DISPOSITION_PARAM = 'response-content-disposition'
  RESPONSE_CONTENT_ENCODING_PARAM = 'response-content-encoding'
  RESPONSE_CONTENT_LANGUAGE_PARAM = 'response-content-language'
  RESPONSE_CONTENT_TYPE_PARAM = 'response-content-type'
  RESPONSE_EXPIRES_PARAM = 'response-expires'
  X_IMAGE_PROCESS_PARAM = 'x-image-process'
  
  HTTP_METHOD_PUT = 'PUT'
  HTTP_METHOD_POST = 'POST'
  HTTP_METHOD_GET = 'GET'
  HTTP_METHOD_DELETE = 'DELETE'
  HTTP_METHOD_HEAD = 'HEAD'
  HTTP_METHOD_OPTIONS = 'OPTIONS'
  
  IS_WINDOWS = platform.system() == 'Windows' or os.name == 'nt'
  IS_PYTHON2 = sys.version_info.major == 2 or sys.version < '3'
  IS_PYTHON35_UP = sys.version >= '3.5'
  BASESTRING = basestring if IS_PYTHON2 else str
  UNICODE = unicode if IS_PYTHON2 else str
  LONG = long if IS_PYTHON2 else int
  
  DEFAULT_SECURE_PORT = 443
  DEFAULT_INSECURE_PORT = 80
  DEFAULT_MINIMUM_SIZE = 100 * 1024
  DEFAULT_MAXIMUM_SIZE = 5 * 1024 * 1024 * 1024
  
  DEFAULT_BYTE_INTTERVAL = 102400
  DEFAULT_TASK_INTTERVAL = 100
  DEFAULT_TASK_NUM = 8
  DEFAULT_TASK_QUEUE_SIZE = 20000
  
  OBS_SDK_VERSION = '3.20.9.1'
  
  V2_META_HEADER_PREFIX = 'x-amz-meta-'
  V2_HEADER_PREFIX = 'x-amz-'
  
  OBS_META_HEADER_PREFIX = 'x-obs-meta-'
  OBS_HEADER_PREFIX = 'x-obs-'
  
  GMT_DATE_FORMAT = '%a, %d %b %Y %H:%M:%S GMT'
  LONG_DATE_FORMAT = '%Y%m%dT%H%M%SZ'
  SHORT_DATE_FORMAT = '%Y%m%d'
  EXPIRATION_DATE_FORMAT = '%Y-%m-%dT%H:%M:%SZ'
  
  CANONICAL_REQUEST = 'CannonicalRequest'
  CANONICAL_STRING = 'CanonicalString'
  
  IPv4_REGEX = '^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$'
  
  V2_SIGNATURE = 'v2'
  OBS_SIGNATURE = 'obs'
  
  FETCH_POLICY_KEY = "v1/extension_policy"
  FETCH_JOB_KEY = "v1/async-fetch/jobs"
  
  WORKFLOW_TEMPLATES = 'workflowtemplates'
  WORKFLOWS = 'workflows'
  WORKFLOW_EXECUTIONS = 'workflowexecutions'
  WORKFLOW_TRIGGERPOLICY = 'obsworkflowtriggerpolicy'
  
  ALLOWED_RESOURCE_PARAMTER_NAMES = (
      'acl',
      'backtosource',
      'policy',
      'torrent',
      'logging',
      'location',
      'storageinfo',
      'quota',
      'storageclass',
      'storagepolicy',
      'requestpayment',
      'versions',
      'versioning',
      'versionid',
      'uploads',
      'uploadid',
      'partnumber',
      'website',
      'notification',
      'lifecycle',
      'deletebucket',
      'delete',
      'cors',
      'restore',
      'tagging',
      'replication',
      'metadata',
      'encryption',
  
      # File System API
      'append',
      'position',
      'truncate',
      'modify',
      'rename',
      'length',
      'name',
      'fileinterface',
  
      'response-content-type',
      'response-content-language',
      'response-expires',
      'response-cache-control',
      'response-content-disposition',
      'response-content-encoding',
      'x-image-save-bucket',
      'x-image-save-object',
      'x-image-process',
      'x-oss-process',
  
      # workflow api
      'x-workflow-prefix',
      'x-workflow-start',
      'x-workflow-limit',
      'x-workflow-template-name',
      'x-workflow-graph-name',
      'x-workflow-execution-state',
      'x-workflow-execution-type',
      'x-workflow-next-marker',
      'obsworkflowtriggerpolicy'
  )
  
  ALLOWED_REQUEST_HTTP_HEADER_METADATA_NAMES = (
      'content-type',
      'content-md5',
      'content-length',
      'content-language',
      'expires',
      'origin',
      'cache-control',
      'content-disposition',
      'content-encoding',
      'access-control-request-method',
      'access-control-request-headers',
      'success-action-redirect',
      'x-default-storage-class',
      'location',
      'date',
      'etag',
      'range',
      'host',
      'if-modified-since',
      'if-unmodified-since',
      'if-match',
      'if-none-match',
      'last-modified',
      'content-range'
  )
  
  ALLOWED_RESPONSE_HTTP_HEADER_METADATA_NAMES = (
      'content-type',
      'content-md5',
      'content-length',
      'content-language',
      'expires',
      'origin',
      'cache-control',
      'content-disposition',
      'content-encoding',
      'x-default-storage-class',
      'location',
      'date',
      'etag',
      'host',
      'last-modified',
      'content-range',
      'x-reserved',
      'access-control-allow-origin',
      'access-control-allow-headers',
      'access-control-max-age',
      'access-control-allow-methods',
      'access-control-expose-headers',
      'connection',
      'x-reserved-indicator',
      'x-oef-request-id'
  )
  
  MIME_TYPES = {
      '7z': 'application/x-7z-compressed',
      'aac': 'audio/x-aac',
      'ai': 'application/postscript',
      'aif': 'audio/x-aiff',
      'asc': 'text/plain',
      'asf': 'video/x-ms-asf',
      'atom': 'application/atom+xml',
      'avi': 'video/x-msvideo',
      'bmp': 'image/bmp',
      'bz2': 'application/x-bzip2',
      'cer': 'application/pkix-cert',
      'crl': 'application/pkix-crl',
      'crt': 'application/x-x509-ca-cert',
      'css': 'text/css',
      'csv': 'text/csv',
      'cu': 'application/cu-seeme',
      'deb': 'application/x-debian-package',
      'doc': 'application/msword',
      'docx': 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
      'dvi': 'application/x-dvi',
      'eot': 'application/vnd.ms-fontobject',
      'eps': 'application/postscript',
      'epub': 'application/epub+zip',
      'etx': 'text/x-setext',
      'flac': 'audio/flac',
      'flv': 'video/x-flv',
      'gif': 'image/gif',
      'gz': 'application/gzip',
      'htm': 'text/html',
      'html': 'text/html',
      'ico': 'image/x-icon',
      'ics': 'text/calendar',
      'ini': 'text/plain',
      'iso': 'application/x-iso9660-image',
      'jar': 'application/java-archive',
      'jpe': 'image/jpeg',
      'jpeg': 'image/jpeg',
      'jpg': 'image/jpeg',
      'js': 'text/javascript',
      'json': 'application/json',
      'latex': 'application/x-latex',
      'log': 'text/plain',
      'm4a': 'audio/mp4',
      'm4v': 'video/mp4',
      'mid': 'audio/midi',
      'midi': 'audio/midi',
      'mov': 'video/quicktime',
      'mp3': 'audio/mpeg',
      'mp4': 'video/mp4',
      'mp4a': 'audio/mp4',
      'mp4v': 'video/mp4',
      'mpe': 'video/mpeg',
      'mpeg': 'video/mpeg',
      'mpg': 'video/mpeg',
      'mpg4': 'video/mp4',
      'oga': 'audio/ogg',
      'ogg': 'audio/ogg',
      'ogv': 'video/ogg',
      'ogx': 'application/ogg',
      'pbm': 'image/x-portable-bitmap',
      'pdf': 'application/pdf',
      'pgm': 'image/x-portable-graymap',
      'png': 'image/png',
      'pnm': 'image/x-portable-anymap',
      'ppm': 'image/x-portable-pixmap',
      'ppt': 'application/vnd.ms-powerpoint',
      'pptx': 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
      'ps': 'application/postscript',
      'qt': 'video/quicktime',
      'rar': 'application/x-rar-compressed',
      'ras': 'image/x-cmu-raster',
      'rss': 'application/rss+xml',
      'rtf': 'application/rtf',
      'sgm': 'text/sgml',
      'sgml': 'text/sgml',
      'svg': 'image/svg+xml',
      'swf': 'application/x-shockwave-flash',
      'tar': 'application/x-tar',
      'tif': 'image/tiff',
      'tiff': 'image/tiff',
      'torrent': 'application/x-bittorrent',
      'ttf': 'application/x-font-ttf',
      'txt': 'text/plain',
      'wav': 'audio/x-wav',
      'webm': 'video/webm',
      'wma': 'audio/x-ms-wma',
      'wmv': 'video/x-ms-wmv',
      'woff': 'application/x-font-woff',
      'wsdl': 'application/wsdl+xml',
      'xbm': 'image/x-xbitmap',
      'xls': 'application/vnd.ms-excel',
      'xlsx': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
      'xml': 'application/xml',
      'xpm': 'image/x-xpixmap',
      'xwd': 'image/x-xwindowdump',
      'yaml': 'text/yaml',
      'yml': 'text/yaml',
      'zip': 'application/zip'
  }
  