{"version":3,"sources":["webpack:///./node_modules/cos-js-sdk-v5/src/util.js","webpack:///./node_modules/cos-js-sdk-v5/src/event.js","webpack:///./node_modules/cos-js-sdk-v5/src/session.js","webpack:///./node_modules/cos-js-sdk-v5/lib/xml2json.js","webpack:///./node_modules/cos-js-sdk-v5/src/cos.js","webpack:///./node_modules/cos-js-sdk-v5/src/advance.js","webpack:///./node_modules/xmldom/dom-parser.js","webpack:///./node_modules/cos-js-sdk-v5/index.js","webpack:///./src/assets/js/upload.js","webpack:///./node_modules/xmldom/dom.js","webpack:///./node_modules/cos-js-sdk-v5/lib/md5.js","webpack:///./node_modules/cos-js-sdk-v5/src/base.js","webpack:///./node_modules/cos-js-sdk-v5/lib/json2xml.js","webpack:///./node_modules/cos-js-sdk-v5/src/async.js","webpack:///./node_modules/cos-js-sdk-v5/lib/request.js","webpack:///./node_modules/xmldom/sax.js","webpack:///./node_modules/cos-js-sdk-v5/lib/crypto.js","webpack:///./node_modules/cos-js-sdk-v5/src/task.js"],"names":["md5","CryptoJS","xml2json","json2xml","camSafeUrlEncode","str","encodeURIComponent","replace","getAuth","opt","pathname","SecretId","SecretKey","KeyTime","method","Method","toLowerCase","queryParams","clone","Query","params","headers","Headers","Key","UseRawKey","Pathname","indexOf","Error","getObjectKeys","obj","forKey","list","key","hasOwnProperty","push","sort","a","b","obj2str","i","val","keyList","length","undefined","join","now","Math","round","getSkewTime","SystemClockOffset","exp","Expires","expires","qSignAlgorithm","qAk","qSignTime","qKeyTime","qHeaderList","qUrlParamList","signKey","HmacSHA1","toString","formatString","stringToSign","SHA1","qSignature","authorization","readIntBE","chunk","size","offset","bytes","buf","slice","Uint8Array","reverse","8","16","Uint16Array","32","Uint32Array","buf2str","start","end","isUtf8","forEach","charCode","String","fromCharCode","decodeURIComponent","escape","parseSelectPayload","header","body","result","records","byteLength","content","totalLength","headerLength","payloadRestLength","headerNameLength","headerName","headerValueLength","headerValue","stats","util","Stats","errCode","errMessage","err","message","name","code","error","includes","payload","noop","clearKey","retObj","readAsBinaryString","blob","callback","readFun","fr","FileReader","prototype","onload","this","readAsArrayBuffer","fileData","binary","reader","e","console","call","fileSliceNeedCopy","compareVersion","split","parseInt","check","ua","ChromeVersion","match","QBCoreVersion","QQBrowserVersion","need","navigator","userAgent","fileSlice","file","isUseToUpload","mozSlice","webkitSlice","Blob","getBodyMd5","UploadCheckContentMd5","Body","onProgress","getFileMd5","md5ChunkSize","loaded","md5ctx","getCtx","next","hash","digest","min","update","total","percent","map","v","attr","defaultValue","extend","target","source","each","isArray","arr","Array","isInArray","item","flag","makeArray","fn","o","filter","iaArr","binaryBase64","len","char","res","btoa","uuid","S4","random","substring","hasMissingParams","apiName","Bucket","Region","formatParams","headerMap","paramKey","headerKey","apiWrapper","apiFn","self","formatResult","RequestId","VersionId","DeleteMarker","_callback","data","checkParams","missingResult","test","options","CompatibilityMode","warn","AppId","substr","errMsg","isSync","Promise","resolve","reject","throttleOnProgress","time1","timer","size0","size1","time0","Date","speed","max","floor","info","immediately","clearTimeout","setTimeout","ProgressInterval","getFileSize","api","type","ArrayBuffer","ContentLength","sourceErr","stack","Object","defineProperty","writable","enumerable","isBrowser","module","exports","initEvent","cos","listeners","getList","action","on","off","splice","emit","cb","EventProxy","init","cache","cacheKey","getCache","JSON","parse","localStorage","getItem","setCache","setItem","stringify","changed","mtime","save","mod","using","setUsing","removeUsing","getFileId","ChunkSize","lastModifiedDate","getUploadIdList","saveUploadId","UploadId","limit","unshift","removeUploadId","DOMParser","xmlToJSON","version","mergeCDATA","normalize","stripElemPrefix","prefixMatch","RegExp","grokType","sValue","isFinite","parseFloat","parseString","xmlString","xml","stringToXML","getElementsByTagName","parseXML","oXMLParent","vResult","nLength","sCollectedTxt","childNum","childNodes","oNode","sProp","vContent","nItem","nodeType","nodeValue","nodeName","constructor","keys","xmlToString","xmlDoc","XMLSerializer","serializeToString","window","parser","parseFromString","ActiveXObject","async","loadXML","event","task","base","advance","defaultOptions","SecurityToken","ChunkRetryTimes","FileParallelLimit","ChunkParallelLimit","SliceSize","CopyChunkParallelLimit","CopyChunkSize","CopySliceSize","MaxPartNumber","Domain","ServiceDomain","Protocol","ForcePathStyle","Timeout","CorrectClockSkew","UploadQueueSize","UploadAddMetaMd5","UploadIdCacheLimit","COS","getAuthorization","session","Async","sliceUploadFile","FileSize","ep","TaskId","AsyncLimit","StorageClass","ServerSideEncryption","onHashProgress","_isRunningTask","UploadCompleteData","UploadData","metaHeaders","k","shortKey","uploadSliceComplete","SliceList","uploadSliceList","_params","getUploadIdAndPartList","PartList","SIZE","AutoChunkSize","SkipTask","putObject","ETagMap","SliceCount","ceil","FinishSize","getChunkETag","PartNumber","ETag","Size","chunkItem","isAvailableUploadList","PartCount","PartSliceSize","index","Part","errData","Uploaded","multipartInit","UploadIdList","eachLimit","asyncCallback","wholeMultipartListPart","PartListData","isAvailable","AvailableUploadData","RemoteUploadIdList","LocalUploadIdList","wholeMultipartList","UploadList","toUpperCase","UploadID","sendParams","Prefix","multipartList","apply","Upload","IsTruncated","KeyMarker","NextKeyMarker","UploadIdMarker","NextUploadIdMarker","multipartListPart","PartNumberMarker","NextPartNumberMarker","ChunkParallel","needUploadSlices","SliceItem","currentSize","preAddSize","uploadSliceItem","FileBody","PartItem","retry","tryCallback","multipartUpload","Parts","multipartComplete","abortUploadTask","Level","AbortArray","abortUploadTaskArray","resultList","AbortItem","nextItem","eachIndex","KeyNotMatch","multipartAbort","successList","errorList","uploadFiles","TotalSize","TotalFinish","onTotalProgress","unFinishCount","files","_onTotalFileFinish","onFileFinish","onTotalFileFinish","Index","taskList","fileParams","fileInfo","_onTaskReady","onTaskReady","tid","PreAddSize","_onProgress","_onFileFinish","_addTasks","sliceCopyFile","CopySource","m","SourceBucket","SourceRegion","SourceKey","CopySourceRange","copySliceItem","SourceHeaders","TargetHeader","ChunkCount","partNumber","restoreHeader","headObject","statusCode","ErrorStatus","putObjectCopy","resHeaders","metaPrefix","uploadPartCopy","API_MAP","transferToTaskMethod","locator","buildErrorHandler","errorImpl","domBuilder","DOMHandler","errorHandler","isCallback","Function","build","msg","_locator","cdata","position","node","lineNumber","columnNumber","l","systemId","_toString","chars","java","lang","appendElement","hander","currentElement","appendChild","doc","mimeType","sax","XMLReader","defaultNSMap","xmlns","entityMap","setDocumentLocator","nbsp","copy","startDocument","DOMImplementation","createDocument","documentURI","startElement","namespaceURI","localName","qName","attrs","el","createElementNS","getURI","value","getValue","getQName","createAttributeNS","getLocator","setAttributeNode","endElement","current","tagName","parentNode","startPrefixMapping","prefix","uri","endPrefixMapping","processingInstruction","ins","createProcessingInstruction","ignorableWhitespace","ch","characters","arguments","charNode","createCDATASection","createTextNode","skippedEntity","endDocument","comment","comm","createComment","startCDATA","endCDATA","startDTD","publicId","impl","implementation","createDocumentType","dt","warning","fatalError","require","config","upload","option","_data","_fileName","_key","taskKey","_file","taskId","Notification","title","fileName","progressData","getTaskList","onError","_url","getObjectUrl","onSuccess","url","getBucket","deleteObject","_allTaskList","_uploading","_taskList","state","store","dispatch","uploading","btnVisible","getBucketCors","log","putBucketCors","CORSRules","AllowedOrigin","AllowedMethod","AllowedHeader","ExposeHeader","pauseTask","id","restartTask","cancelTask","src","dest","p","_extends","Class","Super","pt","create","ppt","__proto__","t","htmlns","NodeType","ELEMENT_NODE","ATTRIBUTE_NODE","TEXT_NODE","CDATA_SECTION_NODE","ENTITY_REFERENCE_NODE","ENTITY_NODE","PROCESSING_INSTRUCTION_NODE","COMMENT_NODE","DOCUMENT_NODE","DOCUMENT_TYPE_NODE","DOCUMENT_FRAGMENT_NODE","NOTATION_NODE","ExceptionCode","ExceptionMessage","HIERARCHY_REQUEST_ERR","INDEX_SIZE_ERR","DOMSTRING_SIZE_ERR","NOT_FOUND_ERR","WRONG_DOCUMENT_ERR","INVALID_CHARACTER_ERR","NO_DATA_ALLOWED_ERR","NO_MODIFICATION_ALLOWED_ERR","INUSE_ATTRIBUTE_ERR","NOT_SUPPORTED_ERR","INVALID_STATE_ERR","SYNTAX_ERR","INVALID_MODIFICATION_ERR","NAMESPACE_ERR","INVALID_ACCESS_ERR","DOMException","captureStackTrace","NodeList","LiveNodeList","refresh","_node","_refresh","_updateLiveList","inc","_inc","ownerDocument","ls","__set__","NamedNodeMap","_findNodeIndex","_addNamedNode","newAttr","oldAttr","ownerElement","_onRemoveAttribute","_onAddAttribute","_removeNamedNode","lastIndex","features","_features","feature","Node","_xmlEncoder","c","charCodeAt","_visitNode","firstChild","nextSibling","Document","ns","_nsMap","remove","_onUpdateChild","newChild","cs","child","_removeChild","previous","previousSibling","lastChild","_insertBefore","nextChild","cp","removeChild","newFirst","newLast","pre","_appendSingleChild","Element","Attr","CharacterData","Text","Comment","CDATASection","DocumentType","Notation","Entity","EntityReference","DocumentFragment","ProcessingInstruction","nodeSerializeToString","isHtml","nodeFilter","refNode","documentElement","lookupPrefix","visibleNamespaces","namespace","needNamespaceDefine","isHTML","attributes","pubid","sysid","sub","internalSubset","importNode","deep","node2","cloneNode","n","attrs2","_ownerElement","object","getNamedItem","setNamedItem","setNamedItemNS","getNamedItemNS","removeNamedItem","removeNamedItemNS","hasFeature","versions","qualifiedName","doctype","root","insertBefore","refChild","replaceChild","oldChild","hasChildNodes","appendData","isSupported","hasAttributes","lookupNamespaceURI","isDefaultNamespace","importedNode","getElementById","rtv","getAttribute","createElement","createDocumentFragment","createAttribute","specified","createEntityReference","pl","hasAttribute","getAttributeNode","setAttribute","removeAttribute","removeAttributeNode","setAttributeNodeNS","removeAttributeNS","old","getAttributeNodeNS","hasAttributeNS","getAttributeNS","setAttributeNS","getElementsByTagNameNS","substringData","count","text","insertData","replaceData","deleteData","splitText","newText","newNode","getTextContent","get","$$length","set","ERROR","WINDOW","JS_MD5_NO_WINDOW","WEB_WORKER","NODE_JS","JS_MD5_NO_NODE_JS","process","global","COMMON_JS","JS_MD5_NO_COMMON_JS","AMD","ARRAY_BUFFER","JS_MD5_NO_ARRAY_BUFFER","HEX_CHARS","EXTRA","SHIFT","OUTPUT_TYPES","BASE64_ENCODE_CHAR","blocks","buffer8","buffer","JS_MD5_NO_ARRAY_BUFFER_IS_VIEW","isView","createOutputMethod","outputType","isBinStr","Md5","createMethod","nodeWrap","crypto","eval","Buffer","nodeMethod","createHash","sharedMemory","h0","h1","h2","h3","hBytes","finalized","hashed","first","lastByteIndex","finalize","d","bc","da","hex","format","array","arrayBuffer","base64","v1","v2","v3","base64Str","REQUEST","getService","protocol","location","domain","appId","region","submitRequest","Action","buckets","ListAllMyBucketsResult","Buckets","owner","Owner","putBucket","CreateBucketConfiguration","BucketAZConfig","getUrl","bucket","isLocation","Location","headBucket","reqParams","ResourceKey","qs","ListBucketResult","Contents","CommonPrefixes","deleteBucket","putBucketAcl","AccessControlPolicy","Grants","Grant","AccessControlList","uniqGrant","getBucketAcl","decodeAcl","ACL","CORSConfiguration","rule","sKey","CORSRule","Code","deleteBucketCors","getBucketLocation","putBucketPolicy","Policy","PolicyStr","getBucketPolicy","rawBody","deleteBucketPolicy","putBucketTagging","Tagging","Tags","TagSet","Tag","getBucketTagging","deleteBucketTagging","putBucketLifecycle","LifecycleConfiguration","Rules","Rule","getBucketLifecycle","deleteBucketLifecycle","putBucketVersioning","VersioningConfiguration","getBucketVersioning","putBucketReplication","ReplicationConfiguration","getBucketReplication","deleteBucketReplication","putBucketWebsite","WebsiteConfiguration","RoutingRules","RoutingRule","getBucketWebsite","deleteBucketWebsite","putBucketReferer","RefererConfiguration","DomainList","Domains","getBucketReferer","putBucketDomain","DomainConfiguration","DomainRule","getBucketDomain","deleteBucketDomain","putBucketOrigin","OriginConfiguration","OriginRule","getBucketOrigin","deleteBucketOrigin","putBucketLogging","BucketLoggingStatus","getBucketLogging","putBucketInventory","InventoryConfiguration","OptionalFields","Field","Destination","COSBucketDestination","Encryption","getBucketInventory","listBucketInventory","ListInventoryConfigurationResult","InventoryConfigurations","deleteBucketInventory","putBucketAccelerate","configuration","AccelerateConfiguration","getBucketAccelerate","putBucketEncryption","conf","ServerSideEncryptionConfiguration","getBucketEncryption","EncryptionConfiguration","deleteBucketEncryption","NotModified","listObjectVersions","ListVersionsResult","DeleteMarkers","Versions","Version","getObject","DataType","onDownloadProgress","needCalcMd5","BucketNotFound","getObjectAcl","GrantWrite","putObjectAcl","optionsObject","OptionsForbidden","AccessControlAllowOrigin","AccessControlAllowMethods","AccessControlAllowHeaders","AccessControlExposeHeaders","AccessControlMaxAge","Scope","CopyObjectResult","uploadId","CopyPartResult","deleteMultipleObject","Objects","Quiet","Delete","DeleteResult","Deleted","Errors","restoreObject","RestoreRequest","putObjectTagging","getObjectTagging","deleteObjectTagging","selectObjectContent","SelectType","SelectRequest","Payload","InitiateMultipartUploadResult","CompleteMultipartUpload","CompleteMultipartUploadResult","ProcessResults","UploadResult","OriginalInfo","ImageInfo","ListMultipartUploadsResult","ListPartsResult","request","Sign","Url","AuthData","getAuthorizationAsync","signUrl","Authorization","ClientIP","ClientUA","Token","GrantFullControl","GrantRead","GrantReadAcp","GrantWriteAcp","GrantMap","PublicAcl","READ","WRITE","FULL_CONTROL","Grantee","ID","URI","Permission","exist","trim","longBucket","shortBucket","lastIndexOf","cbDone","XCosSecurityToken","KeyName","StsData","ScopeKey","_StsCache","compareTime","StartTime","ExpiredTime","ScopeLimit","calcAuthByTmpKey","TmpSecretId","TmpSecretKey","checkAuthError","formatAllow","auth","atob","AuthError","getSTS","allowRetry","isTimeError","serverDate","date","ServerTime","errorCode","errorMessage","Message","serverTime","abs","versionId","tryTimes","oldClockOffset","_submitRequest","contentLength","dataType","timeout","pathStyle","sender","Request","r","hasReturned","response","statusMessage","killTask","json","statusSuccess","xmlError","abort","warnOldApi","proto","suffix","oldName","warned","element_start_char","element_non_start_char","element_replace","not_safe_in_xml","objKeys","process_to_xml","node_data","makeNode","level","hasSubNodes","indent_value","indent","prettyPrint","removeIllegalNameCharacters","node_descriptor","ret","toJSON","nodes","j","esc","xml_header","standalone","xmlHeader","xmlheader","docType","iterator","completed","started","running","replenish","times","stringifyPrimitive","queryStringify","sep","eq","ks","Boolean","xhrRes","xhr","getAllResponseHeaders","status","statusText","xhrBody","responseText","qsStr","XMLHttpRequest","open","responseType","setRequestHeader","onprogress","onerror","send","nameStartChar","nameChar","tagNamePattern","S_TAG","S_ATTR","S_ATTR_SPACE","S_EQ","S_ATTR_NOQUOT_VALUE","S_ATTR_END","S_TAG_SPACE","S_TAG_CLOSE","defaultNSMapCopy","fixedFromCharCode","surrogate1","surrogate2","entityReplacer","charAt","appendText","xt","lineEnd","linePattern","exec","lineStart","parseStack","currentNSMap","closeMap","tagStart","pop","localNSMap","endMatch","endIgnoreCaseMach","parseInstruction","parseDCC","ElementAttributes","parseElementStartPart","closed","fixSelfClosed","locator2","copyLocator","parseHtmlSpecialContent","f","attrName","s","add","setTagName","nsp","nsPrefix","_copy","elStartEnd","elEndStart","pos","matchs","lastMatch","endDTD","_set_proto_","thiz","parent","reg","getLocalName","g","lib","Base","mixIn","$super","WordArray","words","sigBytes","concat","q","clamp","enc","Hex","Latin1","h","Utf8","unescape","BufferedBlockAlgorithm","reset","_nDataBytes","_append","_process","blockSize","_minBufferSize","_doProcessBlock","Hasher","cfg","_doReset","_doFinalize","_createHelper","_createHmacHelper","HMAC","algo","_hash","_hasher","_oKey","_iKey","C","C_lib","C_enc","Base64","wordArray","_map","base64Chars","byte1","byte2","byte3","triplet","paddingChar","base64StrLength","paddingIndex","nBytes","bits1","bits2","originApiMap","apiMap","_addTask","initTask","queue","tasks","uploadingFileCount","nextUploadIndex","formatTask","FilePath","hashPercent","_custom","emitListUpdate","clearQueue","isActive","startNextTask","onTaskStart","apiParams","switchToState","waiting","pipe","toState","isTaskReadyWarning","ignoreAddEvent","TaskReady","isUploadRunning"],"mappings":"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","file":"fbStatic/js/chunk-3920ae98.0e7039dc.js","sourcesContent":["'use strict';\r\n\r\nvar md5 = require('../lib/md5');\r\nvar CryptoJS = require('../lib/crypto');\r\nvar xml2json = require('../lib/xml2json');\r\nvar json2xml = require('../lib/json2xml');\r\n\r\nfunction camSafeUrlEncode(str) {\r\n return encodeURIComponent(str)\r\n .replace(/!/g, '%21')\r\n .replace(/'/g, '%27')\r\n .replace(/\\(/g, '%28')\r\n .replace(/\\)/g, '%29')\r\n .replace(/\\*/g, '%2A');\r\n}\r\n\r\n//测试用的key后面可以去掉\r\nvar getAuth = function (opt) {\r\n opt = opt || {};\r\n\r\n var SecretId = opt.SecretId;\r\n var SecretKey = opt.SecretKey;\r\n var KeyTime = opt.KeyTime;\r\n var method = (opt.method || opt.Method || 'get').toLowerCase();\r\n var queryParams = clone(opt.Query || opt.params || {});\r\n var headers = clone(opt.Headers || opt.headers || {});\r\n\r\n var Key = opt.Key || '';\r\n var pathname;\r\n if (opt.UseRawKey) {\r\n pathname = opt.Pathname || opt.pathname || '/' + Key;\r\n } else {\r\n pathname = opt.Pathname || opt.pathname || Key;\r\n pathname.indexOf('/') !== 0 && (pathname = '/' + pathname);\r\n }\r\n\r\n if (!SecretId) throw new Error('missing param SecretId');\r\n if (!SecretKey) throw new Error('missing param SecretKey');\r\n\r\n var getObjectKeys = function (obj, forKey) {\r\n var list = [];\r\n for (var key in obj) {\r\n if (obj.hasOwnProperty(key)) {\r\n list.push(forKey ? camSafeUrlEncode(key).toLowerCase() : key);\r\n }\r\n }\r\n return list.sort(function (a, b) {\r\n a = a.toLowerCase();\r\n b = b.toLowerCase();\r\n return a === b ? 0 : (a > b ? 1 : -1);\r\n });\r\n };\r\n\r\n var obj2str = function (obj) {\r\n var i, key, val;\r\n var list = [];\r\n var keyList = getObjectKeys(obj);\r\n for (i = 0; i < keyList.length; i++) {\r\n key = keyList[i];\r\n val = (obj[key] === undefined || obj[key] === null) ? '' : ('' + obj[key]);\r\n key = camSafeUrlEncode(key).toLowerCase();\r\n val = camSafeUrlEncode(val) || '';\r\n list.push(key + '=' + val)\r\n }\r\n return list.join('&');\r\n };\r\n\r\n // 签名有效起止时间\r\n var now = Math.round(getSkewTime(opt.SystemClockOffset) / 1000) - 1;\r\n var exp = now;\r\n\r\n var Expires = opt.Expires || opt.expires;\r\n if (Expires === undefined) {\r\n exp += 900; // 签名过期时间为当前 + 900s\r\n } else {\r\n exp += (Expires * 1) || 0;\r\n }\r\n\r\n // 要用到的 Authorization 参数列表\r\n var qSignAlgorithm = 'sha1';\r\n var qAk = SecretId;\r\n var qSignTime = KeyTime || now + ';' + exp;\r\n var qKeyTime = KeyTime || now + ';' + exp;\r\n var qHeaderList = getObjectKeys(headers).join(';').toLowerCase();\r\n var qUrlParamList = getObjectKeys(queryParams).join(';').toLowerCase();\r\n\r\n // 签名算法说明文档:https://www.qcloud.com/document/product/436/7778\r\n // 步骤一:计算 SignKey\r\n var signKey = CryptoJS.HmacSHA1(qKeyTime, SecretKey).toString();\r\n\r\n // 步骤二:构成 FormatString\r\n var formatString = [method, pathname, obj2str(queryParams), obj2str(headers), ''].join('\\n');\r\n\r\n // 步骤三:计算 StringToSign\r\n var stringToSign = ['sha1', qSignTime, CryptoJS.SHA1(formatString).toString(), ''].join('\\n');\r\n\r\n // 步骤四:计算 Signature\r\n var qSignature = CryptoJS.HmacSHA1(stringToSign, signKey).toString();\r\n\r\n // 步骤五:构造 Authorization\r\n var authorization = [\r\n 'q-sign-algorithm=' + qSignAlgorithm,\r\n 'q-ak=' + qAk,\r\n 'q-sign-time=' + qSignTime,\r\n 'q-key-time=' + qKeyTime,\r\n 'q-header-list=' + qHeaderList,\r\n 'q-url-param-list=' + qUrlParamList,\r\n 'q-signature=' + qSignature\r\n ].join('&');\r\n\r\n return authorization;\r\n\r\n};\r\n\r\nvar readIntBE = function (chunk, size, offset) {\r\n var bytes = size / 8;\r\n var buf = chunk.slice(offset, offset + bytes);\r\n new Uint8Array(buf).reverse();\r\n return new ({8: Uint8Array, 16: Uint16Array, 32: Uint32Array})[size](buf)[0];\r\n};\r\nvar buf2str = function (chunk, start, end, isUtf8) {\r\n var buf = chunk.slice(start, end);\r\n var str = '';\r\n new Uint8Array(buf).forEach(function (charCode) {\r\n str += String.fromCharCode(charCode)\r\n });\r\n if (isUtf8) str = decodeURIComponent(escape(str));\r\n return str;\r\n};\r\nvar parseSelectPayload = function (chunk) {\r\n var header = {};\r\n var body = buf2str(chunk);\r\n var result = {records:[]};\r\n while (chunk.byteLength) {\r\n var totalLength = readIntBE(chunk, 32, 0);\r\n var headerLength = readIntBE(chunk, 32, 4);\r\n var payloadRestLength = totalLength - headerLength - 16;\r\n var offset = 0;\r\n var content;\r\n chunk = chunk.slice(12);\r\n // 获取 Message 的 header 信息\r\n while (offset < headerLength) {\r\n var headerNameLength = readIntBE(chunk, 8, offset);\r\n var headerName = buf2str(chunk, offset + 1, offset + 1 + headerNameLength);\r\n var headerValueLength = readIntBE(chunk, 16, offset + headerNameLength + 2);\r\n var headerValue = buf2str(chunk, offset + headerNameLength + 4, offset + headerNameLength + 4 + headerValueLength);\r\n header[headerName] = headerValue;\r\n offset += headerNameLength + 4 + headerValueLength;\r\n }\r\n if (header[':event-type'] === 'Records') {\r\n content = buf2str(chunk, offset, offset + payloadRestLength, true);\r\n result.records.push(content);\r\n } else if (header[':event-type'] === 'Stats') {\r\n content = buf2str(chunk, offset, offset + payloadRestLength, true);\r\n result.stats = util.xml2json(content).Stats;\r\n } else if (header[':event-type'] === 'error') {\r\n var errCode = header[':error-code'];\r\n var errMessage = header[':error-message'];\r\n var err = new Error(errMessage);\r\n err.message = errMessage;\r\n err.name = err.code = errCode;\r\n result.error = err;\r\n } else if (['Progress', 'Continuation', 'End'].includes(header[':event-type'])) {\r\n // do nothing\r\n }\r\n chunk = chunk.slice(offset + payloadRestLength + 4);\r\n }\r\n return {\r\n payload: result.records.join(''),\r\n body: body,\r\n };\r\n};\r\n\r\nvar noop = function () {\r\n\r\n};\r\n\r\n// 清除对象里值为的 undefined 或 null 的属性\r\nvar clearKey = function (obj) {\r\n var retObj = {};\r\n for (var key in obj) {\r\n if (obj.hasOwnProperty(key) && obj[key] !== undefined && obj[key] !== null) {\r\n retObj[key] = obj[key];\r\n }\r\n }\r\n return retObj;\r\n};\r\n\r\nvar readAsBinaryString = function (blob, callback) {\r\n var readFun;\r\n var fr = new FileReader();\r\n if (FileReader.prototype.readAsBinaryString) {\r\n readFun = FileReader.prototype.readAsBinaryString;\r\n fr.onload = function () {\r\n callback(this.result);\r\n };\r\n } else if (FileReader.prototype.readAsArrayBuffer) { // 在 ie11 添加 readAsBinaryString 兼容\r\n readFun = function (fileData) {\r\n var binary = \"\";\r\n var pt = this;\r\n var reader = new FileReader();\r\n reader.onload = function (e) {\r\n var bytes = new Uint8Array(reader.result);\r\n var length = bytes.byteLength;\r\n for (var i = 0; i < length; i++) {\r\n binary += String.fromCharCode(bytes[i]);\r\n }\r\n callback(binary);\r\n };\r\n reader.readAsArrayBuffer(fileData);\r\n };\r\n } else {\r\n console.error('FileReader not support readAsBinaryString');\r\n }\r\n readFun.call(fr, blob);\r\n};\r\n\r\nvar fileSliceNeedCopy = (function () {\r\n var compareVersion = function(a, b) {\r\n a = a.split('.');\r\n b = b.split('.');\r\n for (var i = 0; i < b.length; i++) {\r\n if (a[i] !== b[i]) {\r\n return parseInt(a[i]) > parseInt(b[i]) ? 1 : -1;\r\n }\r\n }\r\n return 0;\r\n };\r\n var check = function (ua) {\r\n var ChromeVersion = (ua.match(/Chrome\\/([.\\d]+)/) || [])[1];\r\n var QBCoreVersion = (ua.match(/QBCore\\/([.\\d]+)/) || [])[1];\r\n var QQBrowserVersion = (ua.match(/QQBrowser\\/([.\\d]+)/) || [])[1];\r\n var need = ChromeVersion && compareVersion(ChromeVersion, '53.0.2785.116') < 0\r\n && QBCoreVersion && compareVersion(QBCoreVersion, '3.53.991.400') < 0\r\n && QQBrowserVersion && compareVersion(QQBrowserVersion, '9.0.2524.400') <= 0 || false;\r\n return need;\r\n };\r\n return check(navigator && navigator.userAgent);\r\n})();\r\n\r\n// 获取文件分片\r\nvar fileSlice = function (file, start, end, isUseToUpload, callback) {\r\n var blob;\r\n if (file.slice) {\r\n blob = file.slice(start, end);\r\n } else if (file.mozSlice) {\r\n blob = file.mozSlice(start, end);\r\n } else if (file.webkitSlice) {\r\n blob = file.webkitSlice(start, end);\r\n }\r\n if (isUseToUpload && fileSliceNeedCopy) {\r\n var reader = new FileReader();\r\n reader.onload = function (e) {\r\n blob = null;\r\n callback(new Blob([reader.result]));\r\n };\r\n reader.readAsArrayBuffer(blob);\r\n } else {\r\n callback(blob);\r\n }\r\n};\r\n\r\n// 获取文件内容的 MD5\r\nvar getBodyMd5 = function (UploadCheckContentMd5, Body, callback, onProgress) {\r\n callback = callback || noop;\r\n if (UploadCheckContentMd5) {\r\n if (typeof Body === 'string') {\r\n callback(util.md5(Body, true));\r\n } else if (Blob && Body instanceof Blob) {\r\n util.getFileMd5(Body, function (err, md5) {\r\n callback(md5);\r\n }, onProgress);\r\n } else {\r\n callback();\r\n }\r\n } else {\r\n callback();\r\n }\r\n};\r\n\r\n// 获取文件 md5 值\r\nvar md5ChunkSize = 1024 * 1024;\r\nvar getFileMd5 = function (blob, callback, onProgress) {\r\n var size = blob.size;\r\n var loaded = 0;\r\n var md5ctx = md5.getCtx();\r\n var next = function (start) {\r\n if (start >= size) {\r\n var hash = md5ctx.digest('hex');\r\n callback(null, hash);\r\n return;\r\n }\r\n var end = Math.min(size, start + md5ChunkSize);\r\n util.fileSlice(blob, start, end, false, function (chunk) {\r\n readAsBinaryString(chunk, function (content) {\r\n chunk = null;\r\n md5ctx = md5ctx.update(content, true);\r\n loaded += content.length;\r\n content = null;\r\n if (onProgress) onProgress({loaded: loaded, total: size, percent: Math.round(loaded / size * 10000) / 10000});\r\n next(start + md5ChunkSize);\r\n });\r\n });\r\n };\r\n next(0);\r\n};\r\n\r\nfunction clone(obj) {\r\n return map(obj, function (v) {\r\n return typeof v === 'object' && v !== null ? clone(v) : v;\r\n });\r\n}\r\n\r\nfunction attr(obj, name, defaultValue) {\r\n return obj && name in obj ? obj[name] : defaultValue;\r\n}\r\n\r\nfunction extend(target, source) {\r\n each(source, function (val, key) {\r\n target[key] = source[key];\r\n });\r\n return target;\r\n}\r\n\r\nfunction isArray(arr) {\r\n return arr instanceof Array;\r\n}\r\n\r\nfunction isInArray(arr, item) {\r\n var flag = false;\r\n for (var i = 0; i < arr.length; i++) {\r\n if (item === arr[i]) {\r\n flag = true;\r\n break;\r\n }\r\n }\r\n return flag;\r\n}\r\n\r\nfunction makeArray(arr) {\r\n return isArray(arr) ? arr : [arr];\r\n}\r\n\r\nfunction each(obj, fn) {\r\n for (var i in obj) {\r\n if (obj.hasOwnProperty(i)) {\r\n fn(obj[i], i);\r\n }\r\n }\r\n}\r\n\r\nfunction map(obj, fn) {\r\n var o = isArray(obj) ? [] : {};\r\n for (var i in obj) {\r\n if (obj.hasOwnProperty(i)) {\r\n o[i] = fn(obj[i], i);\r\n }\r\n }\r\n return o;\r\n}\r\n\r\nfunction filter(obj, fn) {\r\n var iaArr = isArray(obj);\r\n var o = iaArr ? [] : {};\r\n for (var i in obj) {\r\n if (obj.hasOwnProperty(i)) {\r\n if (fn(obj[i], i)) {\r\n if (iaArr) {\r\n o.push(obj[i]);\r\n } else {\r\n o[i] = obj[i];\r\n }\r\n }\r\n }\r\n }\r\n return o;\r\n}\r\n\r\nvar binaryBase64 = function (str) {\r\n var i, len, char, res = '';\r\n for (i = 0, len = str.length / 2; i < len; i++) {\r\n char = parseInt(str[i * 2] + str[i * 2 + 1], 16);\r\n res += String.fromCharCode(char);\r\n }\r\n return btoa(res);\r\n};\r\nvar uuid = function () {\r\n var S4 = function () {\r\n return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);\r\n };\r\n return (S4() + S4() + \"-\" + S4() + \"-\" + S4() + \"-\" + S4() + \"-\" + S4() + S4() + S4());\r\n};\r\n\r\nvar hasMissingParams = function (apiName, params) {\r\n var Bucket = params.Bucket;\r\n var Region = params.Region;\r\n var Key = params.Key;\r\n if (apiName.indexOf('Bucket') > -1 || apiName === 'deleteMultipleObject' || apiName === 'multipartList' || apiName === 'listObjectVersions') {\r\n if (!Bucket) return 'Bucket';\r\n if (!Region) return 'Region';\r\n } else if (apiName.indexOf('Object') > -1 || apiName.indexOf('multipart') > -1 || apiName === 'sliceUploadFile' || apiName === 'abortUploadTask') {\r\n if (!Bucket) return 'Bucket';\r\n if (!Region) return 'Region';\r\n if (!Key) return 'Key';\r\n }\r\n return false;\r\n};\r\n\r\nvar formatParams = function (apiName, params) {\r\n\r\n // 复制参数对象\r\n params = extend({}, params);\r\n\r\n // 统一处理 Headers\r\n if (apiName !== 'getAuth' && apiName !== 'getV4Auth' && apiName !== 'getObjectUrl') {\r\n var Headers = params.Headers || {};\r\n if (params && typeof params === 'object') {\r\n (function () {\r\n for (var key in params) {\r\n if (params.hasOwnProperty(key) && key.indexOf('x-cos-') > -1) {\r\n Headers[key] = params[key];\r\n }\r\n }\r\n })();\r\n\r\n var headerMap = {\r\n // params headers\r\n 'x-cos-mfa': 'MFA',\r\n 'Content-MD5': 'ContentMD5',\r\n 'Content-Length': 'ContentLength',\r\n 'Content-Type': 'ContentType',\r\n 'Expect': 'Expect',\r\n 'Expires': 'Expires',\r\n 'Cache-Control': 'CacheControl',\r\n 'Content-Disposition': 'ContentDisposition',\r\n 'Content-Encoding': 'ContentEncoding',\r\n 'Range': 'Range',\r\n 'If-Modified-Since': 'IfModifiedSince',\r\n 'If-Unmodified-Since': 'IfUnmodifiedSince',\r\n 'If-Match': 'IfMatch',\r\n 'If-None-Match': 'IfNoneMatch',\r\n 'x-cos-copy-source': 'CopySource',\r\n 'x-cos-copy-source-Range': 'CopySourceRange',\r\n 'x-cos-metadata-directive': 'MetadataDirective',\r\n 'x-cos-copy-source-If-Modified-Since': 'CopySourceIfModifiedSince',\r\n 'x-cos-copy-source-If-Unmodified-Since': 'CopySourceIfUnmodifiedSince',\r\n 'x-cos-copy-source-If-Match': 'CopySourceIfMatch',\r\n 'x-cos-copy-source-If-None-Match': 'CopySourceIfNoneMatch',\r\n 'x-cos-acl': 'ACL',\r\n 'x-cos-grant-read': 'GrantRead',\r\n 'x-cos-grant-write': 'GrantWrite',\r\n 'x-cos-grant-full-control': 'GrantFullControl',\r\n 'x-cos-grant-read-acp': 'GrantReadAcp',\r\n 'x-cos-grant-write-acp': 'GrantWriteAcp',\r\n 'x-cos-storage-class': 'StorageClass',\r\n 'x-cos-traffic-limit': 'TrafficLimit',\r\n // SSE-C\r\n 'x-cos-server-side-encryption-customer-algorithm': 'SSECustomerAlgorithm',\r\n 'x-cos-server-side-encryption-customer-key': 'SSECustomerKey',\r\n 'x-cos-server-side-encryption-customer-key-MD5': 'SSECustomerKeyMD5',\r\n // SSE-COS、SSE-KMS\r\n 'x-cos-server-side-encryption': 'ServerSideEncryption',\r\n 'x-cos-server-side-encryption-cos-kms-key-id': 'SSEKMSKeyId',\r\n 'x-cos-server-side-encryption-context': 'SSEContext',\r\n };\r\n util.each(headerMap, function (paramKey, headerKey) {\r\n if (params[paramKey] !== undefined) {\r\n Headers[headerKey] = params[paramKey];\r\n }\r\n });\r\n\r\n params.Headers = clearKey(Headers);\r\n }\r\n }\r\n\r\n return params;\r\n};\r\n\r\nvar apiWrapper = function (apiName, apiFn) {\r\n return function (params, callback) {\r\n\r\n var self = this;\r\n\r\n // 处理参数\r\n if (typeof params === 'function') {\r\n callback = params;\r\n params = {};\r\n }\r\n\r\n // 整理参数格式\r\n params = formatParams(apiName, params);\r\n\r\n // 代理回调函数\r\n var formatResult = function (result) {\r\n if (result && result.headers) {\r\n result.headers['x-cos-request-id'] && (result.RequestId = result.headers['x-cos-request-id']);\r\n result.headers['x-cos-version-id'] && (result.VersionId = result.headers['x-cos-version-id']);\r\n result.headers['x-cos-delete-marker'] && (result.DeleteMarker = result.headers['x-cos-delete-marker']);\r\n }\r\n return result;\r\n };\r\n var _callback = function (err, data) {\r\n callback && callback(formatResult(err), formatResult(data));\r\n };\r\n\r\n var checkParams = function () {\r\n if (apiName !== 'getService' && apiName !== 'abortUploadTask') {\r\n // 判断参数是否完整\r\n var missingResult = hasMissingParams(apiName, params)\r\n if (missingResult) {\r\n return 'missing param ' + missingResult;\r\n }\r\n // 判断 region 格式\r\n if (params.Region) {\r\n if (params.Region.indexOf('cos.') > -1) {\r\n return 'param Region should not be start with \"cos.\"';\r\n } else if (!/^([a-z\\d-]+)$/.test(params.Region)) {\r\n return 'Region format error.';\r\n }\r\n // 判断 region 格式\r\n if (!self.options.CompatibilityMode && params.Region.indexOf('-') === -1 && params.Region !== 'yfb' && params.Region !== 'default') {\r\n console.warn('warning: param Region format error, find help here: https://cloud.tencent.com/document/product/436/6224');\r\n }\r\n }\r\n // 兼容不带 AppId 的 Bucket\r\n if (params.Bucket) {\r\n if (!/^([a-z\\d-]+)-(\\d+)$/.test(params.Bucket)) {\r\n if (params.AppId) {\r\n params.Bucket = params.Bucket + '-' + params.AppId;\r\n } else if (self.options.AppId) {\r\n params.Bucket = params.Bucket + '-' + self.options.AppId;\r\n } else {\r\n return 'Bucket should format as \"test-1250000000\".';\r\n }\r\n }\r\n if (params.AppId) {\r\n console.warn('warning: AppId has been deprecated, Please put it at the end of parameter Bucket(E.g Bucket:\"test-1250000000\" ).');\r\n delete params.AppId;\r\n }\r\n }\r\n // 如果 Key 是 / 开头,强制去掉第一个 /\r\n if (!self.options.UseRawKey && params.Key && params.Key.substr(0, 1) === '/') {\r\n params.Key = params.Key.substr(1);\r\n }\r\n }\r\n };\r\n\r\n var errMsg = checkParams();\r\n var isSync = apiName === 'getAuth' || apiName === 'getObjectUrl';\r\n if (Promise && !isSync && !callback) {\r\n return new Promise(function (resolve, reject) {\r\n callback = function (err, data) {\r\n err ? reject(err) : resolve(data);\r\n };\r\n if (errMsg) return _callback(util.error(new Error(errMsg)));\r\n apiFn.call(self, params, _callback);\r\n });\r\n } else {\r\n if (errMsg) return _callback(util.error(new Error(errMsg)));\r\n var res = apiFn.call(self, params, _callback);\r\n if (isSync) return res;\r\n }\r\n }\r\n};\r\n\r\nvar throttleOnProgress = function (total, onProgress) {\r\n var self = this;\r\n var size0 = 0;\r\n var size1 = 0;\r\n var time0 = Date.now();\r\n var time1;\r\n var timer;\r\n\r\n function update() {\r\n timer = 0;\r\n if (onProgress && (typeof onProgress === 'function')) {\r\n time1 = Date.now();\r\n var speed = Math.max(0, Math.round((size1 - size0) / ((time1 - time0) / 1000) * 100) / 100) || 0;\r\n var percent;\r\n if (size1 === 0 && total === 0) {\r\n percent = 1;\r\n } else {\r\n percent = Math.floor(size1 / total * 100) / 100 || 0;\r\n }\r\n time0 = time1;\r\n size0 = size1;\r\n try {\r\n onProgress({loaded: size1, total: total, speed: speed, percent: percent});\r\n } catch (e) {\r\n }\r\n }\r\n }\r\n\r\n return function (info, immediately) {\r\n if (info) {\r\n size1 = info.loaded;\r\n total = info.total;\r\n }\r\n if (immediately) {\r\n clearTimeout(timer);\r\n update();\r\n } else {\r\n if (timer) return;\r\n timer = setTimeout(update, self.options.ProgressInterval);\r\n }\r\n };\r\n};\r\n\r\nvar getFileSize = function (api, params, callback) {\r\n var size;\r\n if (typeof params.Body === 'string') {\r\n params.Body = new Blob([params.Body], {type: 'text/plain'});\r\n } else if (params.Body instanceof ArrayBuffer) {\r\n params.Body = new Blob([params.Body]);\r\n }\r\n if ((params.Body && (params.Body instanceof Blob || params.Body.toString() === '[object File]' || params.Body.toString() === '[object Blob]'))) {\r\n size = params.Body.size;\r\n } else {\r\n callback(util.error(new Error('params body format error, Only allow File|Blob|String.')));\r\n return;\r\n }\r\n params.ContentLength = size;\r\n callback(null, size);\r\n};\r\n\r\n// 获取调正的时间戳\r\nvar getSkewTime = function (offset) {\r\n return Date.now() + (offset || 0);\r\n};\r\n\r\n\r\nvar error = function (err, opt) {\r\n var sourceErr = err;\r\n err.message = err.message || null;\r\n\r\n if (typeof opt === 'string') {\r\n err.error = opt;\r\n err.message = opt;\r\n } else if (typeof opt === 'object' && opt !== null) {\r\n extend(err, opt);\r\n if (opt.code || opt.name) err.code = opt.code || opt.name;\r\n if (opt.message) err.message = opt.message;\r\n if (opt.stack) err.stack = opt.stack;\r\n }\r\n\r\n if (typeof Object.defineProperty === 'function') {\r\n Object.defineProperty(err, 'name', {writable: true, enumerable: false});\r\n Object.defineProperty(err, 'message', {enumerable: true});\r\n }\r\n\r\n err.name = opt && opt.name || err.name || err.code || 'Error';\r\n if (!err.code) err.code = err.name;\r\n if (!err.error) err.error = clone(sourceErr); // 兼容老的错误格式\r\n\r\n return err;\r\n}\r\n\r\nvar util = {\r\n noop: noop,\r\n formatParams: formatParams,\r\n apiWrapper: apiWrapper,\r\n xml2json: xml2json,\r\n json2xml: json2xml,\r\n md5: md5,\r\n clearKey: clearKey,\r\n fileSlice: fileSlice,\r\n getBodyMd5: getBodyMd5,\r\n getFileMd5: getFileMd5,\r\n binaryBase64: binaryBase64,\r\n extend: extend,\r\n isArray: isArray,\r\n isInArray: isInArray,\r\n makeArray: makeArray,\r\n each: each,\r\n map: map,\r\n filter: filter,\r\n clone: clone,\r\n attr: attr,\r\n uuid: uuid,\r\n camSafeUrlEncode: camSafeUrlEncode,\r\n throttleOnProgress: throttleOnProgress,\r\n getFileSize: getFileSize,\r\n getSkewTime: getSkewTime,\r\n error: error,\r\n getAuth: getAuth,\r\n parseSelectPayload: parseSelectPayload,\r\n isBrowser: true,\r\n};\r\n\r\nmodule.exports = util;\r\n","var initEvent = function (cos) {\r\n var listeners = {};\r\n var getList = function (action) {\r\n !listeners[action] && (listeners[action] = []);\r\n return listeners[action];\r\n };\r\n cos.on = function (action, callback) {\r\n if (action === 'task-list-update') {\r\n console.warn('warning: Event \"' + action + '\" has been deprecated. Please use \"list-update\" instead.');\r\n }\r\n getList(action).push(callback);\r\n };\r\n cos.off = function (action, callback) {\r\n var list = getList(action);\r\n for (var i = list.length - 1; i >= 0; i--) {\r\n callback === list[i] && list.splice(i, 1);\r\n }\r\n };\r\n cos.emit = function (action, data) {\r\n var list = getList(action).map(function (cb) {\r\n return cb;\r\n });\r\n for (var i = 0; i < list.length; i++) {\r\n list[i](data);\r\n }\r\n };\r\n};\r\n\r\nvar EventProxy = function () {\r\n initEvent(this);\r\n};\r\n\r\nmodule.exports.init = initEvent;\r\nmodule.exports.EventProxy = EventProxy;","var util = require('./util');\r\n\r\n// 按照文件特征值,缓存 UploadId\r\nvar cacheKey = 'cos_sdk_upload_cache';\r\nvar expires = 30 * 24 * 3600;\r\nvar cache;\r\nvar timer;\r\n\r\nvar getCache = function () {\r\n try {\r\n var val = JSON.parse(localStorage.getItem(cacheKey));\r\n } catch (e) {\r\n }\r\n if (!val) val = [];\r\n cache = val;\r\n};\r\nvar setCache = function () {\r\n try {\r\n localStorage.setItem(cacheKey, JSON.stringify(cache))\r\n } catch (e) {\r\n }\r\n};\r\n\r\nvar init = function () {\r\n if (cache) return;\r\n getCache.call(this);\r\n // 清理太老旧的数据\r\n var changed = false;\r\n var now = Math.round(Date.now() / 1000);\r\n for (var i = cache.length - 1; i >= 0; i--) {\r\n var mtime = cache[i][2];\r\n if (!mtime || mtime + expires < now) {\r\n cache.splice(i, 1);\r\n changed = true;\r\n }\r\n }\r\n changed && setCache();\r\n};\r\n\r\n// 把缓存存到本地\r\nvar save = function () {\r\n if (timer) return;\r\n timer = setTimeout(function () {\r\n setCache();\r\n timer = null;\r\n }, 400);\r\n};\r\n\r\nvar mod = {\r\n using: {},\r\n // 标记 UploadId 正在使用\r\n setUsing: function (uuid) {\r\n mod.using[uuid] = true;\r\n },\r\n // 标记 UploadId 已经没在使用\r\n removeUsing: function (uuid) {\r\n delete mod.using[uuid];\r\n },\r\n // 用上传参数生成哈希值\r\n getFileId: function (file, ChunkSize, Bucket, Key) {\r\n if (file.name && file.size && file.lastModifiedDate && ChunkSize) {\r\n return util.md5([file.name, file.size, file.lastModifiedDate, ChunkSize, Bucket, Key].join('::'));\r\n } else {\r\n return null;\r\n }\r\n },\r\n // 获取文件对应的 UploadId 列表\r\n getUploadIdList: function (uuid) {\r\n if (!uuid) return null;\r\n init.call(this);\r\n var list = [];\r\n for (var i = 0; i < cache.length; i++) {\r\n if (cache[i][0] === uuid)\r\n list.push(cache[i][1]);\r\n }\r\n return list.length ? list : null;\r\n },\r\n // 缓存 UploadId\r\n saveUploadId: function (uuid, UploadId, limit) {\r\n init.call(this);\r\n if (!uuid) return;\r\n // 清理没用的 UploadId,js 文件没有 FilePath ,只清理相同记录\r\n for (var i = cache.length - 1; i >= 0; i--) {\r\n var item = cache[i];\r\n if (item[0] === uuid && item[1] === UploadId) {\r\n cache.splice(i, 1);\r\n }\r\n }\r\n cache.unshift([uuid, UploadId, Math.round(Date.now() / 1000)]);\r\n if (cache.length > limit) cache.splice(limit);\r\n save();\r\n },\r\n // UploadId 已用完,移除掉\r\n removeUploadId: function (UploadId) {\r\n init.call(this);\r\n delete mod.using[UploadId];\r\n for (var i = cache.length - 1; i >= 0; i--) {\r\n if (cache[i][1] === UploadId) cache.splice(i, 1)\r\n }\r\n save();\r\n },\r\n};\r\n\r\nmodule.exports = mod;\r\n","/* Copyright 2015 William Summers, MetaTribal LLC\r\n * adapted from https://developer.mozilla.org/en-US/docs/JXON\r\n *\r\n * Licensed under the MIT License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * https://opensource.org/licenses/MIT\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * @author William Summers\r\n * https://github.com/metatribal/xmlToJSON\r\n */\r\nvar DOMParser = require('xmldom').DOMParser;\r\n\r\nvar xmlToJSON = (function () {\r\n\r\n this.version = \"1.3.5\";\r\n\r\n var options = { // set up the default options\r\n mergeCDATA: true, // extract cdata and merge with text\r\n normalize: true, // collapse multiple spaces to single space\r\n stripElemPrefix: true, // for elements of same name in diff namespaces, you can enable namespaces and access the nskey property\r\n };\r\n\r\n var prefixMatch = new RegExp(/(?!xmlns)^.*:/);\r\n var trimMatch = new RegExp(/^\\s+|\\s+$/g);\r\n\r\n this.grokType = function (sValue) {\r\n if (/^\\s*$/.test(sValue)) {\r\n return null;\r\n }\r\n if (/^(?:true|false)$/i.test(sValue)) {\r\n return sValue.toLowerCase() === \"true\";\r\n }\r\n if (isFinite(sValue)) {\r\n return parseFloat(sValue);\r\n }\r\n return sValue;\r\n };\r\n\r\n this.parseString = function (xmlString, opt) {\r\n if (xmlString) {\r\n var xml = this.stringToXML(xmlString);\r\n if (xml.getElementsByTagName('parsererror').length) {\r\n return null;\r\n } else {\r\n return this.parseXML(xml, opt);\r\n }\r\n } else {\r\n return null;\r\n }\r\n };\r\n\r\n this.parseXML = function (oXMLParent, opt) {\r\n\r\n // initialize options\r\n for (var key in opt) {\r\n options[key] = opt[key];\r\n }\r\n\r\n var vResult = {},\r\n nLength = 0,\r\n sCollectedTxt = \"\";\r\n\r\n // iterate over the children\r\n var childNum = oXMLParent.childNodes.length;\r\n if (childNum) {\r\n for (var oNode, sProp, vContent, nItem = 0; nItem < oXMLParent.childNodes.length; nItem++) {\r\n oNode = oXMLParent.childNodes.item(nItem);\r\n\r\n if (oNode.nodeType === 4) {\r\n if (options.mergeCDATA) {\r\n sCollectedTxt += oNode.nodeValue;\r\n }\r\n } /* nodeType is \"CDATASection\" (4) */\r\n else if (oNode.nodeType === 3) {\r\n sCollectedTxt += oNode.nodeValue;\r\n } /* nodeType is \"Text\" (3) */\r\n else if (oNode.nodeType === 1) { /* nodeType is \"Element\" (1) */\r\n\r\n if (nLength === 0) {\r\n vResult = {};\r\n }\r\n\r\n // using nodeName to support browser (IE) implementation with no 'localName' property\r\n if (options.stripElemPrefix) {\r\n sProp = oNode.nodeName.replace(prefixMatch, '');\r\n } else {\r\n sProp = oNode.nodeName;\r\n }\r\n\r\n vContent = xmlToJSON.parseXML(oNode);\r\n\r\n if (vResult.hasOwnProperty(sProp)) {\r\n if (vResult[sProp].constructor !== Array) {\r\n vResult[sProp] = [vResult[sProp]];\r\n }\r\n vResult[sProp].push(vContent);\r\n\r\n } else {\r\n vResult[sProp] = vContent;\r\n nLength++;\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (!Object.keys(vResult).length) {\r\n // vResult = sCollectedTxt.replace(trimMatch, '') || ''; // by carsonxu 修复 getBucket返回的 Key 是 \" /\" 这种场景\r\n vResult = sCollectedTxt || '';\r\n }\r\n\r\n return vResult;\r\n };\r\n\r\n // Convert xmlDocument to a string\r\n // Returns null on failure\r\n this.xmlToString = function (xmlDoc) {\r\n try {\r\n var xmlString = xmlDoc.xml ? xmlDoc.xml : (new XMLSerializer()).serializeToString(xmlDoc);\r\n return xmlString;\r\n } catch (err) {\r\n return null;\r\n }\r\n };\r\n\r\n // Convert a string to XML Node Structure\r\n // Returns null on failure\r\n this.stringToXML = function (xmlString) {\r\n try {\r\n var xmlDoc = null;\r\n\r\n if (window.DOMParser) {\r\n\r\n var parser = new DOMParser();\r\n xmlDoc = parser.parseFromString(xmlString, \"text/xml\");\r\n\r\n return xmlDoc;\r\n } else {\r\n xmlDoc = new ActiveXObject(\"Microsoft.XMLDOM\");\r\n xmlDoc.async = false;\r\n xmlDoc.loadXML(xmlString);\r\n\r\n return xmlDoc;\r\n }\r\n } catch (e) {\r\n return null;\r\n }\r\n };\r\n\r\n return this;\r\n\r\n}).call({});\r\n\r\nvar xml2json = function (xmlString) {\r\n return xmlToJSON.parseString(xmlString);\r\n};\r\n\r\nmodule.exports = xml2json;\r\n","'use strict';\r\n\r\nvar util = require('./util');\r\nvar event = require('./event');\r\nvar task = require('./task');\r\nvar base = require('./base');\r\nvar advance = require('./advance');\r\n\r\nvar defaultOptions = {\r\n AppId: '', // AppId 已废弃,请拼接到 Bucket 后传入,例如:test-1250000000\r\n SecretId: '',\r\n SecretKey: '',\r\n SecurityToken: '', // 使用临时密钥需要注意自行刷新 Token\r\n ChunkRetryTimes: 2,\r\n FileParallelLimit: 3,\r\n ChunkParallelLimit: 3,\r\n ChunkSize: 1024 * 1024,\r\n SliceSize: 1024 * 1024,\r\n CopyChunkParallelLimit: 20,\r\n CopyChunkSize: 1024 * 1024 * 10,\r\n CopySliceSize: 1024 * 1024 * 10,\r\n MaxPartNumber: 10000,\r\n ProgressInterval: 1000,\r\n Domain: '',\r\n ServiceDomain: '',\r\n Protocol: '',\r\n CompatibilityMode: false,\r\n ForcePathStyle: false,\r\n UseRawKey: false,\r\n Timeout: 0, // 单位毫秒,0 代表不设置超时时间\r\n CorrectClockSkew: true,\r\n SystemClockOffset: 0, // 单位毫秒,ms\r\n UploadCheckContentMd5: false,\r\n UploadQueueSize: 10000,\r\n UploadAddMetaMd5: false,\r\n UploadIdCacheLimit: 50,\r\n};\r\n\r\n// 对外暴露的类\r\nvar COS = function (options) {\r\n this.options = util.extend(util.clone(defaultOptions), options || {});\r\n this.options.FileParallelLimit = Math.max(1, this.options.FileParallelLimit);\r\n this.options.ChunkParallelLimit = Math.max(1, this.options.ChunkParallelLimit);\r\n this.options.ChunkRetryTimes = Math.max(0, this.options.ChunkRetryTimes);\r\n this.options.ChunkSize = Math.max(1024 * 1024, this.options.ChunkSize);\r\n this.options.CopyChunkParallelLimit = Math.max(1, this.options.CopyChunkParallelLimit);\r\n this.options.CopyChunkSize = Math.max(1024 * 1024, this.options.CopyChunkSize);\r\n this.options.CopySliceSize = Math.max(0, this.options.CopySliceSize);\r\n this.options.MaxPartNumber = Math.max(1024, Math.min(10000, this.options.MaxPartNumber));\r\n this.options.Timeout = Math.max(0, this.options.Timeout);\r\n if (this.options.AppId) {\r\n console.warn('warning: AppId has been deprecated, Please put it at the end of parameter Bucket(E.g: \"test-1250000000\").');\r\n }\r\n event.init(this);\r\n task.init(this);\r\n};\r\n\r\nbase.init(COS, task);\r\nadvance.init(COS, task);\r\n\r\nCOS.getAuthorization = util.getAuth;\r\nCOS.version = '1.2.8';\r\n\r\nmodule.exports = COS;\r\n","var session = require('./session');\r\nvar Async = require('./async');\r\nvar EventProxy = require('./event').EventProxy;\r\nvar util = require('./util');\r\n\r\n// 文件分块上传全过程,暴露的分块上传接口\r\nfunction sliceUploadFile(params, callback) {\r\n var self = this;\r\n var ep = new EventProxy();\r\n var TaskId = params.TaskId;\r\n var Bucket = params.Bucket;\r\n var Region = params.Region;\r\n var Key = params.Key;\r\n var Body = params.Body;\r\n var ChunkSize = params.ChunkSize || params.SliceSize || self.options.ChunkSize;\r\n var AsyncLimit = params.AsyncLimit;\r\n var StorageClass = params.StorageClass;\r\n var ServerSideEncryption = params.ServerSideEncryption;\r\n var FileSize;\r\n\r\n var onProgress;\r\n var onHashProgress = params.onHashProgress;\r\n\r\n // 上传过程中出现错误,返回错误\r\n ep.on('error', function (err) {\r\n if (!self._isRunningTask(TaskId)) return;\r\n return callback(err);\r\n });\r\n\r\n // 上传分块完成,开始 uploadSliceComplete 操作\r\n ep.on('upload_complete', function (UploadCompleteData) {\r\n callback(null, UploadCompleteData);\r\n });\r\n\r\n // 上传分块完成,开始 uploadSliceComplete 操作\r\n ep.on('upload_slice_complete', function (UploadData) {\r\n var metaHeaders = {};\r\n util.each(params.Headers, function (val, k) {\r\n var shortKey = k.toLowerCase();\r\n if (shortKey.indexOf('x-cos-meta-') === 0 || shortKey === 'pic-operations') metaHeaders[k] = val;\r\n });\r\n uploadSliceComplete.call(self, {\r\n Bucket: Bucket,\r\n Region: Region,\r\n Key: Key,\r\n UploadId: UploadData.UploadId,\r\n SliceList: UploadData.SliceList,\r\n Headers: metaHeaders,\r\n }, function (err, data) {\r\n if (!self._isRunningTask(TaskId)) return;\r\n session.removeUsing(UploadData.UploadId);\r\n if (err) {\r\n onProgress(null, true);\r\n return ep.emit('error', err);\r\n }\r\n session.removeUploadId.call(self, UploadData.UploadId);\r\n onProgress({loaded: FileSize, total: FileSize}, true);\r\n ep.emit('upload_complete', data);\r\n });\r\n });\r\n\r\n // 获取 UploadId 完成,开始上传每个分片\r\n ep.on('get_upload_data_finish', function (UploadData) {\r\n\r\n // 处理 UploadId 缓存\r\n var uuid = session.getFileId(Body, params.ChunkSize, Bucket, Key);\r\n uuid && session.saveUploadId.call(self, uuid, UploadData.UploadId, self.options.UploadIdCacheLimit); // 缓存 UploadId\r\n session.setUsing(UploadData.UploadId); // 标记 UploadId 为正在使用\r\n\r\n // 获取 UploadId\r\n onProgress(null, true); // 任务状态开始 uploading\r\n uploadSliceList.call(self, {\r\n TaskId: TaskId,\r\n Bucket: Bucket,\r\n Region: Region,\r\n Key: Key,\r\n Body: Body,\r\n FileSize: FileSize,\r\n SliceSize: ChunkSize,\r\n AsyncLimit: AsyncLimit,\r\n ServerSideEncryption: ServerSideEncryption,\r\n UploadData: UploadData,\r\n onProgress: onProgress\r\n }, function (err, data) {\r\n if (!self._isRunningTask(TaskId)) return;\r\n if (err) {\r\n onProgress(null, true);\r\n return ep.emit('error', err);\r\n }\r\n ep.emit('upload_slice_complete', data);\r\n });\r\n });\r\n\r\n // 开始获取文件 UploadId,里面会视情况计算 ETag,并比对,保证文件一致性,也优化上传\r\n ep.on('get_file_size_finish', function () {\r\n\r\n onProgress = util.throttleOnProgress.call(self, FileSize, params.onProgress);\r\n\r\n if (params.UploadData.UploadId) {\r\n ep.emit('get_upload_data_finish', params.UploadData);\r\n } else {\r\n var _params = util.extend({\r\n TaskId: TaskId,\r\n Bucket: Bucket,\r\n Region: Region,\r\n Key: Key,\r\n Headers: params.Headers,\r\n StorageClass: StorageClass,\r\n Body: Body,\r\n FileSize: FileSize,\r\n SliceSize: ChunkSize,\r\n onHashProgress: onHashProgress,\r\n }, params);\r\n getUploadIdAndPartList.call(self, _params, function (err, UploadData) {\r\n if (!self._isRunningTask(TaskId)) return;\r\n if (err) return ep.emit('error', err);\r\n params.UploadData.UploadId = UploadData.UploadId;\r\n params.UploadData.PartList = UploadData.PartList;\r\n ep.emit('get_upload_data_finish', params.UploadData);\r\n });\r\n }\r\n });\r\n\r\n // 获取上传文件大小\r\n FileSize = params.ContentLength;\r\n delete params.ContentLength;\r\n !params.Headers && (params.Headers = {});\r\n util.each(params.Headers, function (item, key) {\r\n if (key.toLowerCase() === 'content-length') {\r\n delete params.Headers[key];\r\n }\r\n });\r\n\r\n // 控制分片大小\r\n (function () {\r\n var SIZE = [1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 1024 * 2, 1024 * 4, 1024 * 5];\r\n var AutoChunkSize = 1024 * 1024;\r\n for (var i = 0; i < SIZE.length; i++) {\r\n AutoChunkSize = SIZE[i] * 1024 * 1024;\r\n if (FileSize / AutoChunkSize <= self.options.MaxPartNumber) break;\r\n }\r\n params.ChunkSize = params.SliceSize = ChunkSize = Math.max(ChunkSize, AutoChunkSize);\r\n })();\r\n\r\n // 开始上传\r\n if (FileSize === 0) {\r\n params.Body = '';\r\n params.ContentLength = 0;\r\n params.SkipTask = true;\r\n self.putObject(params, callback);\r\n } else {\r\n ep.emit('get_file_size_finish');\r\n }\r\n\r\n}\r\n\r\n// 获取上传任务的 UploadId\r\nfunction getUploadIdAndPartList(params, callback) {\r\n var TaskId = params.TaskId;\r\n var Bucket = params.Bucket;\r\n var Region = params.Region;\r\n var Key = params.Key;\r\n var StorageClass = params.StorageClass;\r\n var self = this;\r\n\r\n // 计算 ETag\r\n var ETagMap = {};\r\n var FileSize = params.FileSize;\r\n var SliceSize = params.SliceSize;\r\n var SliceCount = Math.ceil(FileSize / SliceSize);\r\n var FinishSliceCount = 0;\r\n var FinishSize = 0;\r\n var onHashProgress = util.throttleOnProgress.call(self, FileSize, params.onHashProgress);\r\n var getChunkETag = function (PartNumber, callback) {\r\n var start = SliceSize * (PartNumber - 1);\r\n var end = Math.min(start + SliceSize, FileSize);\r\n var ChunkSize = end - start;\r\n\r\n if (ETagMap[PartNumber]) {\r\n callback(null, {\r\n PartNumber: PartNumber,\r\n ETag: ETagMap[PartNumber],\r\n Size: ChunkSize\r\n });\r\n } else {\r\n util.fileSlice(params.Body, start, end, false, function (chunkItem) {\r\n util.getFileMd5(chunkItem, function (err, md5) {\r\n if (err) return callback(util.error(err));\r\n var ETag = '\"' + md5 + '\"';\r\n ETagMap[PartNumber] = ETag;\r\n FinishSliceCount += 1;\r\n FinishSize += ChunkSize;\r\n onHashProgress({loaded: FinishSize, total: FileSize});\r\n callback(null, {\r\n PartNumber: PartNumber,\r\n ETag: ETag,\r\n Size: ChunkSize\r\n });\r\n });\r\n });\r\n }\r\n };\r\n\r\n // 通过和文件的 md5 对比,判断 UploadId 是否可用\r\n var isAvailableUploadList = function (PartList, callback) {\r\n var PartCount = PartList.length;\r\n // 如果没有分片,通过\r\n if (PartCount === 0) {\r\n return callback(null, true);\r\n }\r\n // 检查分片数量\r\n if (PartCount > SliceCount) {\r\n return callback(null, false);\r\n }\r\n // 检查分片大小\r\n if (PartCount > 1) {\r\n var PartSliceSize = Math.max(PartList[0].Size, PartList[1].Size);\r\n if (PartSliceSize !== SliceSize) {\r\n return callback(null, false);\r\n }\r\n }\r\n // 逐个分片计算并检查 ETag 是否一致\r\n var next = function (index) {\r\n if (index < PartCount) {\r\n var Part = PartList[index];\r\n getChunkETag(Part.PartNumber, function (err, chunk) {\r\n if (chunk && chunk.ETag === Part.ETag && chunk.Size === Part.Size) {\r\n next(index + 1);\r\n } else {\r\n callback(null, false);\r\n }\r\n });\r\n } else {\r\n callback(null, true);\r\n }\r\n };\r\n next(0);\r\n };\r\n\r\n var ep = new EventProxy();\r\n ep.on('error', function (errData) {\r\n if (!self._isRunningTask(TaskId)) return;\r\n return callback(errData);\r\n });\r\n\r\n // 存在 UploadId\r\n ep.on('upload_id_available', function (UploadData) {\r\n // 转换成 map\r\n var map = {};\r\n var list = [];\r\n util.each(UploadData.PartList, function (item) {\r\n map[item.PartNumber] = item;\r\n });\r\n for (var PartNumber = 1; PartNumber <= SliceCount; PartNumber++) {\r\n var item = map[PartNumber];\r\n if (item) {\r\n item.PartNumber = PartNumber;\r\n item.Uploaded = true;\r\n } else {\r\n item = {\r\n PartNumber: PartNumber,\r\n ETag: null,\r\n Uploaded: false\r\n };\r\n }\r\n list.push(item);\r\n }\r\n UploadData.PartList = list;\r\n callback(null, UploadData);\r\n });\r\n\r\n // 不存在 UploadId, 初始化生成 UploadId\r\n ep.on('no_available_upload_id', function () {\r\n if (!self._isRunningTask(TaskId)) return;\r\n var _params = util.extend({\r\n Bucket: Bucket,\r\n Region: Region,\r\n Key: Key,\r\n Headers: util.clone(params.Headers),\r\n Query: util.clone(params.Query),\r\n StorageClass: StorageClass,\r\n Body: params.Body,\r\n }, params);\r\n self.multipartInit(_params, function (err, data) {\r\n if (!self._isRunningTask(TaskId)) return;\r\n if (err) return ep.emit('error', err);\r\n var UploadId = data.UploadId;\r\n if (!UploadId) {\r\n return callback(util.error(new Error('no such upload id')));\r\n }\r\n ep.emit('upload_id_available', {UploadId: UploadId, PartList: []});\r\n });\r\n });\r\n\r\n // 如果已存在 UploadId,找一个可以用的 UploadId\r\n ep.on('has_and_check_upload_id', function (UploadIdList) {\r\n // 串行地,找一个内容一致的 UploadId\r\n UploadIdList = UploadIdList.reverse();\r\n Async.eachLimit(UploadIdList, 1, function (UploadId, asyncCallback) {\r\n if (!self._isRunningTask(TaskId)) return;\r\n // 如果正在上传,跳过\r\n if (session.using[UploadId]) {\r\n asyncCallback(); // 检查下一个 UploadId\r\n return;\r\n }\r\n // 判断 UploadId 是否可用\r\n wholeMultipartListPart.call(self, {\r\n Bucket: Bucket,\r\n Region: Region,\r\n Key: Key,\r\n UploadId: UploadId,\r\n }, function (err, PartListData) {\r\n if (!self._isRunningTask(TaskId)) return;\r\n if (err) {\r\n session.removeUsing(UploadId);\r\n return ep.emit('error', err);\r\n }\r\n var PartList = PartListData.PartList;\r\n PartList.forEach(function (item) {\r\n item.PartNumber *= 1;\r\n item.Size *= 1;\r\n item.ETag = item.ETag || '';\r\n });\r\n isAvailableUploadList(PartList, function (err, isAvailable) {\r\n if (!self._isRunningTask(TaskId)) return;\r\n if (err) return ep.emit('error', err);\r\n if (isAvailable) {\r\n asyncCallback({\r\n UploadId: UploadId,\r\n PartList: PartList\r\n }); // 马上结束\r\n } else {\r\n asyncCallback(); // 检查下一个 UploadId\r\n }\r\n });\r\n });\r\n }, function (AvailableUploadData) {\r\n if (!self._isRunningTask(TaskId)) return;\r\n onHashProgress(null, true);\r\n if (AvailableUploadData && AvailableUploadData.UploadId) {\r\n ep.emit('upload_id_available', AvailableUploadData);\r\n } else {\r\n ep.emit('no_available_upload_id');\r\n }\r\n });\r\n });\r\n\r\n // 在本地缓存找可用的 UploadId\r\n ep.on('seek_local_avail_upload_id', function (RemoteUploadIdList) {\r\n // 在本地找可用的 UploadId\r\n var uuid = session.getFileId(params.Body, params.ChunkSize, Bucket, Key);\r\n var LocalUploadIdList = session.getUploadIdList.call(self, uuid);\r\n if (!uuid || !LocalUploadIdList) {\r\n ep.emit('has_and_check_upload_id', RemoteUploadIdList);\r\n return;\r\n }\r\n var next = function (index) {\r\n // 如果本地找不到可用 UploadId,再一个个遍历校验远端\r\n if (index >= LocalUploadIdList.length) {\r\n ep.emit('has_and_check_upload_id', RemoteUploadIdList);\r\n return;\r\n }\r\n var UploadId = LocalUploadIdList[index];\r\n // 如果不在远端 UploadId 列表里,跳过并删除\r\n if (!util.isInArray(RemoteUploadIdList, UploadId)) {\r\n session.removeUploadId.call(self, UploadId);\r\n next(index + 1);\r\n return;\r\n }\r\n // 如果正在上传,跳过\r\n if (session.using[UploadId]) {\r\n next(index + 1);\r\n return;\r\n }\r\n // 判断 UploadId 是否存在线上\r\n wholeMultipartListPart.call(self, {\r\n Bucket: Bucket,\r\n Region: Region,\r\n Key: Key,\r\n UploadId: UploadId,\r\n }, function (err, PartListData) {\r\n if (!self._isRunningTask(TaskId)) return;\r\n if (err) {\r\n // 如果 UploadId 获取会出错,跳过并删除\r\n session.removeUploadId.call(self, UploadId);\r\n next(index + 1);\r\n } else {\r\n // 找到可用 UploadId\r\n ep.emit('upload_id_available', {\r\n UploadId: UploadId,\r\n PartList: PartListData.PartList,\r\n });\r\n }\r\n });\r\n };\r\n next(0);\r\n });\r\n\r\n // 获取线上 UploadId 列表\r\n ep.on('get_remote_upload_id_list', function () {\r\n // 获取符合条件的 UploadId 列表,因为同一个文件可以有多个上传任务。\r\n wholeMultipartList.call(self, {\r\n Bucket: Bucket,\r\n Region: Region,\r\n Key: Key,\r\n }, function (err, data) {\r\n if (!self._isRunningTask(TaskId)) return;\r\n if (err) return ep.emit('error', err);\r\n // 整理远端 UploadId 列表\r\n var RemoteUploadIdList = util.filter(data.UploadList, function (item) {\r\n return item.Key === Key && (!StorageClass || item.StorageClass.toUpperCase() === StorageClass.toUpperCase());\r\n }).reverse().map(function (item) {\r\n return item.UploadId || item.UploadID;\r\n });\r\n if (RemoteUploadIdList.length) {\r\n ep.emit('seek_local_avail_upload_id', RemoteUploadIdList);\r\n } else {\r\n // 远端没有 UploadId,清理缓存的 UploadId\r\n var uuid = session.getFileId(params.Body, params.ChunkSize, Bucket, Key), LocalUploadIdList;\r\n if (uuid && (LocalUploadIdList = session.getUploadIdList.call(self, uuid))) {\r\n util.each(LocalUploadIdList, function (UploadId) {\r\n session.removeUploadId.call(self, UploadId);\r\n });\r\n }\r\n ep.emit('no_available_upload_id');\r\n }\r\n });\r\n });\r\n\r\n // 开始找可用 UploadId\r\n ep.emit('get_remote_upload_id_list');\r\n\r\n}\r\n\r\n// 获取符合条件的全部上传任务 (条件包括 Bucket, Region, Prefix)\r\nfunction wholeMultipartList(params, callback) {\r\n var self = this;\r\n var UploadList = [];\r\n var sendParams = {\r\n Bucket: params.Bucket,\r\n Region: params.Region,\r\n Prefix: params.Key\r\n };\r\n var next = function () {\r\n self.multipartList(sendParams, function (err, data) {\r\n if (err) return callback(err);\r\n UploadList.push.apply(UploadList, data.Upload || []);\r\n if (data.IsTruncated === 'true') { // 列表不完整\r\n sendParams.KeyMarker = data.NextKeyMarker;\r\n sendParams.UploadIdMarker = data.NextUploadIdMarker;\r\n next();\r\n } else {\r\n callback(null, {UploadList: UploadList});\r\n }\r\n });\r\n };\r\n next();\r\n}\r\n\r\n// 获取指定上传任务的分块列表\r\nfunction wholeMultipartListPart(params, callback) {\r\n var self = this;\r\n var PartList = [];\r\n var sendParams = {\r\n Bucket: params.Bucket,\r\n Region: params.Region,\r\n Key: params.Key,\r\n UploadId: params.UploadId\r\n };\r\n var next = function () {\r\n self.multipartListPart(sendParams, function (err, data) {\r\n if (err) return callback(err);\r\n PartList.push.apply(PartList, data.Part || []);\r\n if (data.IsTruncated === 'true') { // 列表不完整\r\n sendParams.PartNumberMarker = data.NextPartNumberMarker;\r\n next();\r\n } else {\r\n callback(null, {PartList: PartList});\r\n }\r\n });\r\n };\r\n next();\r\n}\r\n\r\n// 上传文件分块,包括\r\n/*\r\n UploadId (上传任务编号)\r\n AsyncLimit (并发量),\r\n SliceList (上传的分块数组),\r\n FilePath (本地文件的位置),\r\n SliceSize (文件分块大小)\r\n FileSize (文件大小)\r\n onProgress (上传成功之后的回调函数)\r\n */\r\nfunction uploadSliceList(params, cb) {\r\n var self = this;\r\n var TaskId = params.TaskId;\r\n var Bucket = params.Bucket;\r\n var Region = params.Region;\r\n var Key = params.Key;\r\n var UploadData = params.UploadData;\r\n var FileSize = params.FileSize;\r\n var SliceSize = params.SliceSize;\r\n var ChunkParallel = Math.min(params.AsyncLimit || self.options.ChunkParallelLimit || 1, 256);\r\n var Body = params.Body;\r\n var SliceCount = Math.ceil(FileSize / SliceSize);\r\n var FinishSize = 0;\r\n var ServerSideEncryption = params.ServerSideEncryption;\r\n var needUploadSlices = util.filter(UploadData.PartList, function (SliceItem) {\r\n if (SliceItem['Uploaded']) {\r\n FinishSize += SliceItem['PartNumber'] >= SliceCount ? (FileSize % SliceSize || SliceSize) : SliceSize;\r\n }\r\n return !SliceItem['Uploaded'];\r\n });\r\n var onProgress = params.onProgress;\r\n\r\n Async.eachLimit(needUploadSlices, ChunkParallel, function (SliceItem, asyncCallback) {\r\n if (!self._isRunningTask(TaskId)) return;\r\n var PartNumber = SliceItem['PartNumber'];\r\n var currentSize = Math.min(FileSize, SliceItem['PartNumber'] * SliceSize) - (SliceItem['PartNumber'] - 1) * SliceSize;\r\n var preAddSize = 0;\r\n uploadSliceItem.call(self, {\r\n TaskId: TaskId,\r\n Bucket: Bucket,\r\n Region: Region,\r\n Key: Key,\r\n SliceSize: SliceSize,\r\n FileSize: FileSize,\r\n PartNumber: PartNumber,\r\n ServerSideEncryption: ServerSideEncryption,\r\n Body: Body,\r\n UploadData: UploadData,\r\n onProgress: function (data) {\r\n FinishSize += data.loaded - preAddSize;\r\n preAddSize = data.loaded;\r\n onProgress({loaded: FinishSize, total: FileSize});\r\n },\r\n }, function (err, data) {\r\n if (!self._isRunningTask(TaskId)) return;\r\n if (!err && !data.ETag) err = 'get ETag error, please add \"ETag\" to CORS ExposeHeader setting.';\r\n if (err) {\r\n FinishSize -= preAddSize;\r\n } else {\r\n FinishSize += currentSize - preAddSize;\r\n SliceItem.ETag = data.ETag;\r\n }\r\n onProgress({loaded: FinishSize, total: FileSize});\r\n asyncCallback(err || null, data);\r\n });\r\n }, function (err) {\r\n if (!self._isRunningTask(TaskId)) return;\r\n if (err) return cb(err);\r\n cb(null, {\r\n UploadId: UploadData.UploadId,\r\n SliceList: UploadData.PartList\r\n });\r\n });\r\n}\r\n\r\n// 上传指定分片\r\nfunction uploadSliceItem(params, callback) {\r\n var self = this;\r\n var TaskId = params.TaskId;\r\n var Bucket = params.Bucket;\r\n var Region = params.Region;\r\n var Key = params.Key;\r\n var FileSize = params.FileSize;\r\n var FileBody = params.Body;\r\n var PartNumber = params.PartNumber * 1;\r\n var SliceSize = params.SliceSize;\r\n var ServerSideEncryption = params.ServerSideEncryption;\r\n var UploadData = params.UploadData;\r\n var ChunkRetryTimes = self.options.ChunkRetryTimes + 1;\r\n\r\n var start = SliceSize * (PartNumber - 1);\r\n\r\n var ContentLength = SliceSize;\r\n\r\n var end = start + SliceSize;\r\n\r\n if (end > FileSize) {\r\n end = FileSize;\r\n ContentLength = end - start;\r\n }\r\n\r\n var PartItem = UploadData.PartList[PartNumber - 1];\r\n Async.retry(ChunkRetryTimes, function (tryCallback) {\r\n if (!self._isRunningTask(TaskId)) return;\r\n util.fileSlice(FileBody, start, end, true, function (Body) {\r\n self.multipartUpload({\r\n TaskId: TaskId,\r\n Bucket: Bucket,\r\n Region: Region,\r\n Key: Key,\r\n ContentLength: ContentLength,\r\n PartNumber: PartNumber,\r\n UploadId: UploadData.UploadId,\r\n ServerSideEncryption: ServerSideEncryption,\r\n Body: Body,\r\n onProgress: params.onProgress,\r\n }, function (err, data) {\r\n if (!self._isRunningTask(TaskId)) return;\r\n if (err) return tryCallback(err);\r\n PartItem.Uploaded = true;\r\n return tryCallback(null, data);\r\n });\r\n });\r\n }, function (err, data) {\r\n if (!self._isRunningTask(TaskId)) return;\r\n return callback(err, data);\r\n });\r\n}\r\n\r\n\r\n// 完成分块上传\r\nfunction uploadSliceComplete(params, callback) {\r\n var Bucket = params.Bucket;\r\n var Region = params.Region;\r\n var Key = params.Key;\r\n var UploadId = params.UploadId;\r\n var SliceList = params.SliceList;\r\n var self = this;\r\n var ChunkRetryTimes = this.options.ChunkRetryTimes + 1;\r\n var Headers = params.Headers;\r\n var Parts = SliceList.map(function (item) {\r\n return {\r\n PartNumber: item.PartNumber,\r\n ETag: item.ETag\r\n };\r\n });\r\n // 完成上传的请求也做重试\r\n Async.retry(ChunkRetryTimes, function (tryCallback) {\r\n self.multipartComplete({\r\n Bucket: Bucket,\r\n Region: Region,\r\n Key: Key,\r\n UploadId: UploadId,\r\n Parts: Parts,\r\n Headers: Headers,\r\n }, tryCallback);\r\n }, function (err, data) {\r\n callback(err, data);\r\n });\r\n}\r\n\r\n// 抛弃分块上传任务\r\n/*\r\n AsyncLimit (抛弃上传任务的并发量),\r\n UploadId (上传任务的编号,当 Level 为 task 时候需要)\r\n Level (抛弃分块上传任务的级别,task : 抛弃指定的上传任务,file : 抛弃指定的文件对应的上传任务,其他值 :抛弃指定Bucket 的全部上传任务)\r\n */\r\nfunction abortUploadTask(params, callback) {\r\n var Bucket = params.Bucket;\r\n var Region = params.Region;\r\n var Key = params.Key;\r\n var UploadId = params.UploadId;\r\n var Level = params.Level || 'task';\r\n var AsyncLimit = params.AsyncLimit;\r\n var self = this;\r\n\r\n var ep = new EventProxy();\r\n\r\n ep.on('error', function (errData) {\r\n return callback(errData);\r\n });\r\n\r\n // 已经获取到需要抛弃的任务列表\r\n ep.on('get_abort_array', function (AbortArray) {\r\n abortUploadTaskArray.call(self, {\r\n Bucket: Bucket,\r\n Region: Region,\r\n Key: Key,\r\n Headers: params.Headers,\r\n AsyncLimit: AsyncLimit,\r\n AbortArray: AbortArray\r\n }, callback);\r\n });\r\n\r\n if (Level === 'bucket') {\r\n // Bucket 级别的任务抛弃,抛弃该 Bucket 下的全部上传任务\r\n wholeMultipartList.call(self, {\r\n Bucket: Bucket,\r\n Region: Region\r\n }, function (err, data) {\r\n if (err) return callback(err);\r\n ep.emit('get_abort_array', data.UploadList || []);\r\n });\r\n } else if (Level === 'file') {\r\n // 文件级别的任务抛弃,抛弃该文件的全部上传任务\r\n if (!Key) return callback(util.error(new Error('abort_upload_task_no_key')));\r\n wholeMultipartList.call(self, {\r\n Bucket: Bucket,\r\n Region: Region,\r\n Key: Key\r\n }, function (err, data) {\r\n if (err) return callback(err);\r\n ep.emit('get_abort_array', data.UploadList || []);\r\n });\r\n } else if (Level === 'task') {\r\n // 单个任务级别的任务抛弃,抛弃指定 UploadId 的上传任务\r\n if (!UploadId) return callback(util.error(new Error('abort_upload_task_no_id')));\r\n if (!Key) return callback(util.error(new Error('abort_upload_task_no_key')));\r\n ep.emit('get_abort_array', [{\r\n Key: Key,\r\n UploadId: UploadId\r\n }]);\r\n } else {\r\n return callback(util.error(new Error('abort_unknown_level')));\r\n }\r\n}\r\n\r\n// 批量抛弃分块上传任务\r\nfunction abortUploadTaskArray(params, callback) {\r\n\r\n var Bucket = params.Bucket;\r\n var Region = params.Region;\r\n var Key = params.Key;\r\n var AbortArray = params.AbortArray;\r\n var AsyncLimit = params.AsyncLimit || 1;\r\n var self = this;\r\n\r\n var index = 0;\r\n var resultList = new Array(AbortArray.length);\r\n Async.eachLimit(AbortArray, AsyncLimit, function (AbortItem, nextItem) {\r\n var eachIndex = index;\r\n if (Key && Key !== AbortItem.Key) {\r\n resultList[eachIndex] = {error: {KeyNotMatch: true}};\r\n nextItem(null);\r\n return;\r\n }\r\n var UploadId = AbortItem.UploadId || AbortItem.UploadID;\r\n\r\n self.multipartAbort({\r\n Bucket: Bucket,\r\n Region: Region,\r\n Key: AbortItem.Key,\r\n Headers: params.Headers,\r\n UploadId: UploadId\r\n }, function (err) {\r\n var task = {\r\n Bucket: Bucket,\r\n Region: Region,\r\n Key: AbortItem.Key,\r\n UploadId: UploadId\r\n };\r\n resultList[eachIndex] = {error: err, task: task};\r\n nextItem(null);\r\n });\r\n index++;\r\n\r\n }, function (err) {\r\n if (err) return callback(err);\r\n\r\n var successList = [];\r\n var errorList = [];\r\n\r\n for (var i = 0, len = resultList.length; i < len; i++) {\r\n var item = resultList[i];\r\n if (item['task']) {\r\n if (item['error']) {\r\n errorList.push(item['task']);\r\n } else {\r\n successList.push(item['task']);\r\n }\r\n }\r\n }\r\n\r\n return callback(null, {\r\n successList: successList,\r\n errorList: errorList\r\n });\r\n });\r\n}\r\n\r\n\r\n// 批量上传文件\r\nfunction uploadFiles(params, callback) {\r\n var self = this;\r\n\r\n // 判断多大的文件使用分片上传\r\n var SliceSize = params.SliceSize === undefined ? self.options.SliceSize : params.SliceSize;\r\n\r\n // 汇总返回进度\r\n var TotalSize = 0;\r\n var TotalFinish = 0;\r\n var onTotalProgress = util.throttleOnProgress.call(self, TotalFinish, params.onProgress);\r\n\r\n // 汇总返回回调\r\n var unFinishCount = params.files.length;\r\n var _onTotalFileFinish = params.onFileFinish;\r\n var resultList = Array(unFinishCount);\r\n var onTotalFileFinish = function (err, data, options) {\r\n onTotalProgress(null, true);\r\n _onTotalFileFinish && _onTotalFileFinish(err, data, options);\r\n resultList[options.Index] = {\r\n options: options,\r\n error: err,\r\n data: data\r\n };\r\n if (--unFinishCount <= 0 && callback) {\r\n callback(null, {files: resultList});\r\n }\r\n };\r\n\r\n // 开始处理每个文件\r\n var taskList = [];\r\n util.each(params.files, function (fileParams, index) {\r\n (function () { // 对齐 nodejs 缩进\r\n\r\n var Body = fileParams.Body;\r\n var FileSize = Body.size || Body.length || 0;\r\n var fileInfo = {Index: index, TaskId: ''};\r\n\r\n // 更新文件总大小\r\n TotalSize += FileSize;\r\n\r\n // 整理 option,用于返回给回调\r\n util.each(fileParams, function (v, k) {\r\n if (typeof v !== 'object' && typeof v !== 'function') {\r\n fileInfo[k] = v;\r\n }\r\n });\r\n\r\n // 处理单个文件 TaskReady\r\n var _onTaskReady = fileParams.onTaskReady;\r\n var onTaskReady = function (tid) {\r\n fileInfo.TaskId = tid;\r\n _onTaskReady && _onTaskReady(tid);\r\n };\r\n fileParams.onTaskReady = onTaskReady;\r\n\r\n // 处理单个文件进度\r\n var PreAddSize = 0;\r\n var _onProgress = fileParams.onProgress;\r\n var onProgress = function (info) {\r\n TotalFinish = TotalFinish - PreAddSize + info.loaded;\r\n PreAddSize = info.loaded;\r\n _onProgress && _onProgress(info);\r\n onTotalProgress({loaded: TotalFinish, total: TotalSize});\r\n };\r\n fileParams.onProgress = onProgress;\r\n\r\n // 处理单个文件完成\r\n var _onFileFinish = fileParams.onFileFinish;\r\n var onFileFinish = function (err, data) {\r\n _onFileFinish && _onFileFinish(err, data);\r\n onTotalFileFinish && onTotalFileFinish(err, data, fileInfo);\r\n };\r\n\r\n // 添加上传任务\r\n var api = FileSize > SliceSize ? 'sliceUploadFile' : 'putObject';\r\n taskList.push({\r\n api: api,\r\n params: fileParams,\r\n callback: onFileFinish,\r\n });\r\n })();\r\n });\r\n self._addTasks(taskList);\r\n}\r\n\r\n// 分片复制文件\r\nfunction sliceCopyFile(params, callback) {\r\n var ep = new EventProxy();\r\n\r\n var self = this;\r\n var Bucket = params.Bucket;\r\n var Region = params.Region;\r\n var Key = params.Key;\r\n var CopySource = params.CopySource;\r\n var m = CopySource.match(/^([^.]+-\\d+)\\.cos(v6)?\\.([^.]+)\\.[^/]+\\/(.+)$/);\r\n if (!m) {\r\n callback(util.error(new Error('CopySource format error')));\r\n return;\r\n }\r\n\r\n var SourceBucket = m[1];\r\n var SourceRegion = m[3];\r\n var SourceKey = decodeURIComponent(m[4]);\r\n var CopySliceSize = params.CopySliceSize === undefined ? self.options.CopySliceSize : params.CopySliceSize;\r\n CopySliceSize = Math.max(0, CopySliceSize);\r\n\r\n var ChunkSize = params.CopyChunkSize || this.options.CopyChunkSize;\r\n var ChunkParallel = this.options.CopyChunkParallelLimit;\r\n\r\n var FinishSize = 0;\r\n var FileSize;\r\n var onProgress;\r\n\r\n // 分片复制完成,开始 multipartComplete 操作\r\n ep.on('copy_slice_complete', function (UploadData) {\r\n var metaHeaders = {};\r\n util.each(params.Headers, function (val, k) {\r\n if (k.toLowerCase().indexOf('x-cos-meta-') === 0) metaHeaders[k] = val;\r\n });\r\n var Parts = util.map(UploadData.PartList, function (item) {\r\n return {\r\n PartNumber: item.PartNumber,\r\n ETag: item.ETag,\r\n };\r\n });\r\n self.multipartComplete({\r\n Bucket: Bucket,\r\n Region: Region,\r\n Key: Key,\r\n UploadId: UploadData.UploadId,\r\n Parts: Parts,\r\n },function (err, data) {\r\n if (err) {\r\n onProgress(null, true);\r\n return callback(err);\r\n }\r\n onProgress({loaded: FileSize, total: FileSize}, true);\r\n callback(null, data);\r\n });\r\n });\r\n\r\n ep.on('get_copy_data_finish',function (UploadData) {\r\n Async.eachLimit(UploadData.PartList, ChunkParallel, function (SliceItem, asyncCallback) {\r\n var PartNumber = SliceItem.PartNumber;\r\n var CopySourceRange = SliceItem.CopySourceRange;\r\n var currentSize = SliceItem.end - SliceItem.start;\r\n\r\n copySliceItem.call(self, {\r\n Bucket: Bucket,\r\n Region: Region,\r\n Key: Key,\r\n CopySource: CopySource,\r\n UploadId: UploadData.UploadId,\r\n PartNumber: PartNumber,\r\n CopySourceRange: CopySourceRange,\r\n },function (err,data) {\r\n if (err) return asyncCallback(err);\r\n FinishSize += currentSize;\r\n onProgress({loaded: FinishSize, total: FileSize});\r\n SliceItem.ETag = data.ETag;\r\n asyncCallback(err || null, data);\r\n });\r\n }, function (err) {\r\n if (err) {\r\n onProgress(null, true);\r\n return callback(err);\r\n }\r\n\r\n ep.emit('copy_slice_complete', UploadData);\r\n });\r\n });\r\n\r\n ep.on('get_file_size_finish', function (SourceHeaders) {\r\n // 控制分片大小\r\n (function () {\r\n var SIZE = [1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 1024 * 2, 1024 * 4, 1024 * 5];\r\n var AutoChunkSize = 1024 * 1024;\r\n for (var i = 0; i < SIZE.length; i++) {\r\n AutoChunkSize = SIZE[i] * 1024 * 1024;\r\n if (FileSize / AutoChunkSize <= self.options.MaxPartNumber) break;\r\n }\r\n params.ChunkSize = ChunkSize = Math.max(ChunkSize, AutoChunkSize);\r\n\r\n var ChunkCount = Math.ceil(FileSize / ChunkSize);\r\n\r\n var list = [];\r\n for (var partNumber = 1; partNumber <= ChunkCount; partNumber++) {\r\n var start = (partNumber - 1) * ChunkSize;\r\n var end = partNumber * ChunkSize < FileSize ? (partNumber * ChunkSize - 1) : FileSize - 1;\r\n var item = {\r\n PartNumber: partNumber,\r\n start: start,\r\n end: end,\r\n CopySourceRange: \"bytes=\" + start + \"-\" + end,\r\n };\r\n list.push(item);\r\n }\r\n params.PartList = list;\r\n })();\r\n\r\n var TargetHeader;\r\n if (params.Headers['x-cos-metadata-directive'] === 'Replaced') {\r\n TargetHeader = params.Headers;\r\n } else {\r\n TargetHeader = SourceHeaders;\r\n }\r\n TargetHeader['x-cos-storage-class'] = params.Headers['x-cos-storage-class'] || SourceHeaders['x-cos-storage-class'];\r\n TargetHeader = util.clearKey(TargetHeader);\r\n /**\r\n * 对于归档存储的对象,如果未恢复副本,则不允许 Copy\r\n */\r\n if (SourceHeaders['x-cos-storage-class'] === 'ARCHIVE' || SourceHeaders['x-cos-storage-class'] === 'DEEP_ARCHIVE') {\r\n var restoreHeader = SourceHeaders['x-cos-restore'];\r\n if (!restoreHeader || restoreHeader === 'ongoing-request=\"true\"') {\r\n callback(util.error(new Error('Unrestored archive object is not allowed to be copied')));\r\n return;\r\n }\r\n }\r\n /**\r\n * 去除一些无用的头部,规避 multipartInit 出错\r\n * 这些头部通常是在 putObjectCopy 时才使用\r\n */\r\n delete TargetHeader['x-cos-copy-source'];\r\n delete TargetHeader['x-cos-metadata-directive'];\r\n delete TargetHeader['x-cos-copy-source-If-Modified-Since'];\r\n delete TargetHeader['x-cos-copy-source-If-Unmodified-Since'];\r\n delete TargetHeader['x-cos-copy-source-If-Match'];\r\n delete TargetHeader['x-cos-copy-source-If-None-Match'];\r\n self.multipartInit({\r\n Bucket: Bucket,\r\n Region: Region,\r\n Key: Key,\r\n Headers: TargetHeader,\r\n },function (err,data) {\r\n if (err) return callback(err);\r\n params.UploadId = data.UploadId;\r\n ep.emit('get_copy_data_finish', params);\r\n });\r\n });\r\n\r\n // 获取远端复制源文件的大小\r\n self.headObject({\r\n Bucket: SourceBucket,\r\n Region: SourceRegion,\r\n Key: SourceKey,\r\n },function(err, data) {\r\n if (err) {\r\n if (err.statusCode && err.statusCode === 404) {\r\n callback(util.error(err, {ErrorStatus: SourceKey + ' Not Exist'}));\r\n } else {\r\n callback(err);\r\n }\r\n return;\r\n }\r\n\r\n FileSize = params.FileSize = data.headers['content-length'];\r\n if (FileSize === undefined || !FileSize) {\r\n callback(util.error(new Error('get Content-Length error, please add \"Content-Length\" to CORS ExposeHeader setting.')));\r\n return;\r\n }\r\n\r\n onProgress = util.throttleOnProgress.call(self, FileSize, params.onProgress);\r\n\r\n // 开始上传\r\n if (FileSize <= CopySliceSize) {\r\n if (!params.Headers['x-cos-metadata-directive']) {\r\n params.Headers['x-cos-metadata-directive'] = 'Copy';\r\n }\r\n self.putObjectCopy(params, function (err, data) {\r\n if (err) {\r\n onProgress(null, true);\r\n return callback(err);\r\n }\r\n onProgress({loaded: FileSize, total: FileSize}, true);\r\n callback(err, data);\r\n });\r\n } else {\r\n var resHeaders = data.headers;\r\n var SourceHeaders = {\r\n 'Cache-Control': resHeaders['cache-control'],\r\n 'Content-Disposition': resHeaders['content-disposition'],\r\n 'Content-Encoding': resHeaders['content-encoding'],\r\n 'Content-Type': resHeaders['content-type'],\r\n 'Expires': resHeaders['expires'],\r\n 'x-cos-storage-class': resHeaders['x-cos-storage-class'],\r\n };\r\n util.each(resHeaders, function (v, k) {\r\n var metaPrefix = 'x-cos-meta-';\r\n if (k.indexOf(metaPrefix) === 0 && k.length > metaPrefix.length) {\r\n SourceHeaders[k] = v;\r\n }\r\n });\r\n ep.emit('get_file_size_finish', SourceHeaders);\r\n }\r\n });\r\n}\r\n\r\n// 复制指定分片\r\nfunction copySliceItem(params, callback) {\r\n var TaskId = params.TaskId;\r\n var Bucket = params.Bucket;\r\n var Region = params.Region;\r\n var Key = params.Key;\r\n var CopySource = params.CopySource;\r\n var UploadId = params.UploadId;\r\n var PartNumber = params.PartNumber * 1;\r\n var CopySourceRange = params.CopySourceRange;\r\n\r\n var ChunkRetryTimes = this.options.ChunkRetryTimes + 1;\r\n var self = this;\r\n\r\n Async.retry(ChunkRetryTimes, function (tryCallback) {\r\n self.uploadPartCopy({\r\n TaskId: TaskId,\r\n Bucket: Bucket,\r\n Region: Region,\r\n Key: Key,\r\n CopySource: CopySource,\r\n UploadId: UploadId,\r\n PartNumber:PartNumber,\r\n CopySourceRange:CopySourceRange,\r\n },function (err,data) {\r\n tryCallback(err || null, data);\r\n })\r\n }, function (err, data) {\r\n return callback(err, data);\r\n });\r\n}\r\n\r\n\r\nvar API_MAP = {\r\n sliceUploadFile: sliceUploadFile,\r\n abortUploadTask: abortUploadTask,\r\n uploadFiles: uploadFiles,\r\n sliceCopyFile: sliceCopyFile,\r\n};\r\n\r\nmodule.exports.init = function (COS, task) {\r\n task.transferToTaskMethod(API_MAP, 'sliceUploadFile');\r\n util.each(API_MAP, function (fn, apiName) {\r\n COS.prototype[apiName] = util.apiWrapper(apiName, fn);\r\n });\r\n};\r\n","function DOMParser(options){\r\n\tthis.options = options ||{locator:{}};\r\n\t\r\n}\r\nDOMParser.prototype.parseFromString = function(source,mimeType){\r\n\tvar options = this.options;\r\n\tvar sax = new XMLReader();\r\n\tvar domBuilder = options.domBuilder || new DOMHandler();//contentHandler and LexicalHandler\r\n\tvar errorHandler = options.errorHandler;\r\n\tvar locator = options.locator;\r\n\tvar defaultNSMap = options.xmlns||{};\r\n\tvar entityMap = {'lt':'<','gt':'>','amp':'&','quot':'\"','apos':\"'\"}\r\n\tif(locator){\r\n\t\tdomBuilder.setDocumentLocator(locator)\r\n\t}\r\n\t\r\n\tsax.errorHandler = buildErrorHandler(errorHandler,domBuilder,locator);\r\n\tsax.domBuilder = options.domBuilder || domBuilder;\r\n\tif(/\\/x?html?$/.test(mimeType)){\r\n\t\tentityMap.nbsp = '\\xa0';\r\n\t\tentityMap.copy = '\\xa9';\r\n\t\tdefaultNSMap['']= 'http://www.w3.org/1999/xhtml';\r\n\t}\r\n\tdefaultNSMap.xml = defaultNSMap.xml || 'http://www.w3.org/XML/1998/namespace';\r\n\tif(source){\r\n\t\tsax.parse(source,defaultNSMap,entityMap);\r\n\t}else{\r\n\t\tsax.errorHandler.error(\"invalid doc source\");\r\n\t}\r\n\treturn domBuilder.doc;\r\n}\r\nfunction buildErrorHandler(errorImpl,domBuilder,locator){\r\n\tif(!errorImpl){\r\n\t\tif(domBuilder instanceof DOMHandler){\r\n\t\t\treturn domBuilder;\r\n\t\t}\r\n\t\terrorImpl = domBuilder ;\r\n\t}\r\n\tvar errorHandler = {}\r\n\tvar isCallback = errorImpl instanceof Function;\r\n\tlocator = locator||{}\r\n\tfunction build(key){\r\n\t\tvar fn = errorImpl[key];\r\n\t\tif(!fn && isCallback){\r\n\t\t\tfn = errorImpl.length == 2?function(msg){errorImpl(key,msg)}:errorImpl;\r\n\t\t}\r\n\t\terrorHandler[key] = fn && function(msg){\r\n\t\t\tfn('[xmldom '+key+']\\t'+msg+_locator(locator));\r\n\t\t}||function(){};\r\n\t}\r\n\tbuild('warning');\r\n\tbuild('error');\r\n\tbuild('fatalError');\r\n\treturn errorHandler;\r\n}\r\n\r\n//console.log('#\\n\\n\\n\\n\\n\\n\\n####')\r\n/**\r\n * +ContentHandler+ErrorHandler\r\n * +LexicalHandler+EntityResolver2\r\n * -DeclHandler-DTDHandler \r\n * \r\n * DefaultHandler:EntityResolver, DTDHandler, ContentHandler, ErrorHandler\r\n * DefaultHandler2:DefaultHandler,LexicalHandler, DeclHandler, EntityResolver2\r\n * @link http://www.saxproject.org/apidoc/org/xml/sax/helpers/DefaultHandler.html\r\n */\r\nfunction DOMHandler() {\r\n this.cdata = false;\r\n}\r\nfunction position(locator,node){\r\n\tnode.lineNumber = locator.lineNumber;\r\n\tnode.columnNumber = locator.columnNumber;\r\n}\r\n/**\r\n * @see org.xml.sax.ContentHandler#startDocument\r\n * @link http://www.saxproject.org/apidoc/org/xml/sax/ContentHandler.html\r\n */ \r\nDOMHandler.prototype = {\r\n\tstartDocument : function() {\r\n \tthis.doc = new DOMImplementation().createDocument(null, null, null);\r\n \tif (this.locator) {\r\n \tthis.doc.documentURI = this.locator.systemId;\r\n \t}\r\n\t},\r\n\tstartElement:function(namespaceURI, localName, qName, attrs) {\r\n\t\tvar doc = this.doc;\r\n\t var el = doc.createElementNS(namespaceURI, qName||localName);\r\n\t var len = attrs.length;\r\n\t appendElement(this, el);\r\n\t this.currentElement = el;\r\n\t \r\n\t\tthis.locator && position(this.locator,el)\r\n\t for (var i = 0 ; i < len; i++) {\r\n\t var namespaceURI = attrs.getURI(i);\r\n\t var value = attrs.getValue(i);\r\n\t var qName = attrs.getQName(i);\r\n\t\t\tvar attr = doc.createAttributeNS(namespaceURI, qName);\r\n\t\t\tthis.locator &&position(attrs.getLocator(i),attr);\r\n\t\t\tattr.value = attr.nodeValue = value;\r\n\t\t\tel.setAttributeNode(attr)\r\n\t }\r\n\t},\r\n\tendElement:function(namespaceURI, localName, qName) {\r\n\t\tvar current = this.currentElement\r\n\t\tvar tagName = current.tagName;\r\n\t\tthis.currentElement = current.parentNode;\r\n\t},\r\n\tstartPrefixMapping:function(prefix, uri) {\r\n\t},\r\n\tendPrefixMapping:function(prefix) {\r\n\t},\r\n\tprocessingInstruction:function(target, data) {\r\n\t var ins = this.doc.createProcessingInstruction(target, data);\r\n\t this.locator && position(this.locator,ins)\r\n\t appendElement(this, ins);\r\n\t},\r\n\tignorableWhitespace:function(ch, start, length) {\r\n\t},\r\n\tcharacters:function(chars, start, length) {\r\n\t\tchars = _toString.apply(this,arguments)\r\n\t\t//console.log(chars)\r\n\t\tif(chars){\r\n\t\t\tif (this.cdata) {\r\n\t\t\t\tvar charNode = this.doc.createCDATASection(chars);\r\n\t\t\t} else {\r\n\t\t\t\tvar charNode = this.doc.createTextNode(chars);\r\n\t\t\t}\r\n\t\t\tif(this.currentElement){\r\n\t\t\t\tthis.currentElement.appendChild(charNode);\r\n\t\t\t}else if(/^\\s*$/.test(chars)){\r\n\t\t\t\tthis.doc.appendChild(charNode);\r\n\t\t\t\t//process xml\r\n\t\t\t}\r\n\t\t\tthis.locator && position(this.locator,charNode)\r\n\t\t}\r\n\t},\r\n\tskippedEntity:function(name) {\r\n\t},\r\n\tendDocument:function() {\r\n\t\tthis.doc.normalize();\r\n\t},\r\n\tsetDocumentLocator:function (locator) {\r\n\t if(this.locator = locator){// && !('lineNumber' in locator)){\r\n\t \tlocator.lineNumber = 0;\r\n\t }\r\n\t},\r\n\t//LexicalHandler\r\n\tcomment:function(chars, start, length) {\r\n\t\tchars = _toString.apply(this,arguments)\r\n\t var comm = this.doc.createComment(chars);\r\n\t this.locator && position(this.locator,comm)\r\n\t appendElement(this, comm);\r\n\t},\r\n\t\r\n\tstartCDATA:function() {\r\n\t //used in characters() methods\r\n\t this.cdata = true;\r\n\t},\r\n\tendCDATA:function() {\r\n\t this.cdata = false;\r\n\t},\r\n\t\r\n\tstartDTD:function(name, publicId, systemId) {\r\n\t\tvar impl = this.doc.implementation;\r\n\t if (impl && impl.createDocumentType) {\r\n\t var dt = impl.createDocumentType(name, publicId, systemId);\r\n\t this.locator && position(this.locator,dt)\r\n\t appendElement(this, dt);\r\n\t }\r\n\t},\r\n\t/**\r\n\t * @see org.xml.sax.ErrorHandler\r\n\t * @link http://www.saxproject.org/apidoc/org/xml/sax/ErrorHandler.html\r\n\t */\r\n\twarning:function(error) {\r\n\t\tconsole.warn('[xmldom warning]\\t'+error,_locator(this.locator));\r\n\t},\r\n\terror:function(error) {\r\n\t\tconsole.error('[xmldom error]\\t'+error,_locator(this.locator));\r\n\t},\r\n\tfatalError:function(error) {\r\n\t\tconsole.error('[xmldom fatalError]\\t'+error,_locator(this.locator));\r\n\t throw error;\r\n\t}\r\n}\r\nfunction _locator(l){\r\n\tif(l){\r\n\t\treturn '\\n@'+(l.systemId ||'')+'#[line:'+l.lineNumber+',col:'+l.columnNumber+']'\r\n\t}\r\n}\r\nfunction _toString(chars,start,length){\r\n\tif(typeof chars == 'string'){\r\n\t\treturn chars.substr(start,length)\r\n\t}else{//java sax connect width xmldom on rhino(what about: \"? && !(chars instanceof String)\")\r\n\t\tif(chars.length >= start+length || start){\r\n\t\t\treturn new java.lang.String(chars,start,length)+'';\r\n\t\t}\r\n\t\treturn chars;\r\n\t}\r\n}\r\n\r\n/*\r\n * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/LexicalHandler.html\r\n * used method of org.xml.sax.ext.LexicalHandler:\r\n * #comment(chars, start, length)\r\n * #startCDATA()\r\n * #endCDATA()\r\n * #startDTD(name, publicId, systemId)\r\n *\r\n *\r\n * IGNORED method of org.xml.sax.ext.LexicalHandler:\r\n * #endDTD()\r\n * #startEntity(name)\r\n * #endEntity(name)\r\n *\r\n *\r\n * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/DeclHandler.html\r\n * IGNORED method of org.xml.sax.ext.DeclHandler\r\n * \t#attributeDecl(eName, aName, type, mode, value)\r\n * #elementDecl(name, model)\r\n * #externalEntityDecl(name, publicId, systemId)\r\n * #internalEntityDecl(name, value)\r\n * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/EntityResolver2.html\r\n * IGNORED method of org.xml.sax.EntityResolver2\r\n * #resolveEntity(String name,String publicId,String baseURI,String systemId)\r\n * #resolveEntity(publicId, systemId)\r\n * #getExternalSubset(name, baseURI)\r\n * @link http://www.saxproject.org/apidoc/org/xml/sax/DTDHandler.html\r\n * IGNORED method of org.xml.sax.DTDHandler\r\n * #notationDecl(name, publicId, systemId) {};\r\n * #unparsedEntityDecl(name, publicId, systemId, notationName) {};\r\n */\r\n\"endDTD,startEntity,endEntity,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,resolveEntity,getExternalSubset,notationDecl,unparsedEntityDecl\".replace(/\\w+/g,function(key){\r\n\tDOMHandler.prototype[key] = function(){return null}\r\n})\r\n\r\n/* Private static helpers treated below as private instance methods, so don't need to add these to the public API; we might use a Relator to also get rid of non-standard public properties */\r\nfunction appendElement (hander,node) {\r\n if (!hander.currentElement) {\r\n hander.doc.appendChild(node);\r\n } else {\r\n hander.currentElement.appendChild(node);\r\n }\r\n}//appendChild and setAttributeNS are preformance key\r\n\r\n//if(typeof require == 'function'){\r\n\tvar XMLReader = require('./sax').XMLReader;\r\n\tvar DOMImplementation = exports.DOMImplementation = require('./dom').DOMImplementation;\r\n\texports.XMLSerializer = require('./dom').XMLSerializer ;\r\n\texports.DOMParser = DOMParser;\r\n//}\r\n","var COS = require('./src/cos');\r\nmodule.exports = COS;","import store from '@/store';\nimport {Notification} from 'element-ui';\n\nvar COS = require('cos-js-sdk-v5');\nvar cos = new COS({\n SecretId: 'AKIDw56vXyyH8mHdsv6W7ViZBQWNzObhItkT',\n SecretKey: 'mJTTFnU0H7nFUUI0Uv5rTsLF3e5UlrCC'\n});\n\nconst config = {\n Bucket: 'copyright-pro-temp-1259800220',\n Region: 'ap-beijing'\n};\n\nconst upload = {\n // 分片上传\n /*option:{\n data:event,\n onProgress:function(),\n onError:function(),\n onSuccess:function()\n }*/\n sliceUploadFile: function(option) {\n const _data = option.data;\n // this.getBucketCors();\n if (_data) {\n const _fileName = _data.name;\n const _key = option.taskKey + '-' + _fileName;\n const _file = _data;\n cos.sliceUploadFile(\n {\n Bucket: config.Bucket,\n Region: config.Region,\n Key: _key,\n Body: _file,\n onTaskReady: taskId => {\n Notification({\n title: '提示',\n message: '文件上传过程中不影响其他操作'\n });\n const _data = {\n taskId: taskId,\n fileName: _fileName,\n key: _key\n };\n option.onTaskReady ? option.onTaskReady(_data) : '';\n },\n onProgress: progressData => {\n this.getTaskList();\n option.onProgress ? option.onProgress(progressData) : '';\n }\n },\n (err, data) => {\n if (err) {\n Notification({\n title: '提示',\n message: _fileName + '上传失败',\n type: 'error'\n });\n option.onError ? option.onError(err) : '';\n }\n if (data) {\n Notification({\n title: '提示',\n message: _fileName + '上传成功',\n type: 'success'\n });\n const _url = this.getObjectUrl(_key);\n option.onSuccess ? option.onSuccess({...data, url: _url, fileName: _fileName}) : '';\n }\n this.getTaskList();\n }\n );\n }\n },\n //获取带签名的对象的 Url\n getObjectUrl: function(key) {\n return cos.getObjectUrl({\n Bucket: config.Bucket,\n Region: config.Region,\n Key: key\n });\n },\n //列出目录x的所有文件\n getBucket: function() {\n cos.getBucket(\n {\n Bucket: config.Bucket,\n Region: config.Region\n // Prefix: 'a/', /* 非必须 */\n }\n // function(err, data) {\n // }\n );\n },\n //删除文件\n deleteObject: function(key) {\n cos.deleteObject(\n {\n Bucket: config.Bucket,\n Region: config.Region,\n Key: key\n }\n // function(err, data) {\n // }\n );\n },\n //查看上传队列\n getTaskList: function() {\n const _allTaskList = cos.getTaskList();\n const _uploading = [];\n const _taskList = [];\n _allTaskList.map(item => {\n if (item.state == 'uploading') {\n _uploading.push(item);\n }\n if (item.state != 'canceled') {\n _taskList.push(item);\n }\n });\n store.dispatch('setTaskList', {\n taskList: _taskList,\n uploading: _uploading,\n btnVisible: true\n });\n },\n //查询跨域配置\n getBucketCors: function() {\n cos.getBucketCors(\n {\n Bucket: config.Bucket,\n Region: config.Region\n },\n function(err, data) {\n console.log(data);\n }\n );\n },\n //设置跨域配置\n putBucketCors: function() {\n cos.putBucketCors(\n {\n Bucket: config.Bucket,\n Region: config.Region,\n CORSRules: [\n {\n AllowedOrigin: [\n 'http://localhost:8881',\n 'http://localhost:8882',\n 'http://localhost:8883',\n 'http://localhost:8282',\n 'http://localhost:8383',\n '*.dmhmusic.com',\n '*.th-music.com',\n '*.indieworks.cn',\n '*.submusic.cn',\n '*.showstart.com',\n ],\n AllowedMethod: ['GET', 'POST', 'PUT', 'DELETE', 'HEAD'],\n AllowedHeader: ['*'],\n ExposeHeader: ['ETag', 'x-cos-acl', 'x-cos-version-id', 'x-cos-delete-marker', 'x-cos-server-side-encryption']\n // MaxAgeSeconds: '5'\n }\n ]\n }\n // function(err, data) {\n // }\n );\n },\n //查询对象元数据\n headObject: function(key) {\n cos.headObject(\n {\n Bucket: config.Bucket,\n Region: config.Region,\n Key: key /* 必须 */\n }\n // function(err, data) {\n // }\n );\n },\n //暂停上传任务\n pauseTask: function(id) {\n cos.pauseTask(id);\n this.getTaskList();\n },\n //重启上传任务\n restartTask: function(id) {\n cos.restartTask(id);\n this.getTaskList();\n },\n //取消上传任务\n cancelTask: function(id) {\n cos.cancelTask(id);\n this.getTaskList();\n }\n};\n\nexport default upload;\n","/*\n * DOM Level 2\n * Object DOMException\n * @see http://www.w3.org/TR/REC-DOM-Level-1/ecma-script-language-binding.html\n * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/ecma-script-binding.html\n */\n\nfunction copy(src,dest){\n\tfor(var p in src){\n\t\tdest[p] = src[p];\n\t}\n}\n/**\n^\\w+\\.prototype\\.([_\\w]+)\\s*=\\s*((?:.*\\{\\s*?[\\r\\n][\\s\\S]*?^})|\\S.*?(?=[;\\r\\n]));?\n^\\w+\\.prototype\\.([_\\w]+)\\s*=\\s*(\\S.*?(?=[;\\r\\n]));?\n */\nfunction _extends(Class,Super){\n\tvar pt = Class.prototype;\n\tif(Object.create){\n\t\tvar ppt = Object.create(Super.prototype)\n\t\tpt.__proto__ = ppt;\n\t}\n\tif(!(pt instanceof Super)){\n\t\tfunction t(){};\n\t\tt.prototype = Super.prototype;\n\t\tt = new t();\n\t\tcopy(pt,t);\n\t\tClass.prototype = pt = t;\n\t}\n\tif(pt.constructor != Class){\n\t\tif(typeof Class != 'function'){\n\t\t\tconsole.error(\"unknow Class:\"+Class)\n\t\t}\n\t\tpt.constructor = Class\n\t}\n}\nvar htmlns = 'http://www.w3.org/1999/xhtml' ;\n// Node Types\nvar NodeType = {}\nvar ELEMENT_NODE = NodeType.ELEMENT_NODE = 1;\nvar ATTRIBUTE_NODE = NodeType.ATTRIBUTE_NODE = 2;\nvar TEXT_NODE = NodeType.TEXT_NODE = 3;\nvar CDATA_SECTION_NODE = NodeType.CDATA_SECTION_NODE = 4;\nvar ENTITY_REFERENCE_NODE = NodeType.ENTITY_REFERENCE_NODE = 5;\nvar ENTITY_NODE = NodeType.ENTITY_NODE = 6;\nvar PROCESSING_INSTRUCTION_NODE = NodeType.PROCESSING_INSTRUCTION_NODE = 7;\nvar COMMENT_NODE = NodeType.COMMENT_NODE = 8;\nvar DOCUMENT_NODE = NodeType.DOCUMENT_NODE = 9;\nvar DOCUMENT_TYPE_NODE = NodeType.DOCUMENT_TYPE_NODE = 10;\nvar DOCUMENT_FRAGMENT_NODE = NodeType.DOCUMENT_FRAGMENT_NODE = 11;\nvar NOTATION_NODE = NodeType.NOTATION_NODE = 12;\n\n// ExceptionCode\nvar ExceptionCode = {}\nvar ExceptionMessage = {};\nvar INDEX_SIZE_ERR = ExceptionCode.INDEX_SIZE_ERR = ((ExceptionMessage[1]=\"Index size error\"),1);\nvar DOMSTRING_SIZE_ERR = ExceptionCode.DOMSTRING_SIZE_ERR = ((ExceptionMessage[2]=\"DOMString size error\"),2);\nvar HIERARCHY_REQUEST_ERR = ExceptionCode.HIERARCHY_REQUEST_ERR = ((ExceptionMessage[3]=\"Hierarchy request error\"),3);\nvar WRONG_DOCUMENT_ERR = ExceptionCode.WRONG_DOCUMENT_ERR = ((ExceptionMessage[4]=\"Wrong document\"),4);\nvar INVALID_CHARACTER_ERR = ExceptionCode.INVALID_CHARACTER_ERR = ((ExceptionMessage[5]=\"Invalid character\"),5);\nvar NO_DATA_ALLOWED_ERR = ExceptionCode.NO_DATA_ALLOWED_ERR = ((ExceptionMessage[6]=\"No data allowed\"),6);\nvar NO_MODIFICATION_ALLOWED_ERR = ExceptionCode.NO_MODIFICATION_ALLOWED_ERR = ((ExceptionMessage[7]=\"No modification allowed\"),7);\nvar NOT_FOUND_ERR = ExceptionCode.NOT_FOUND_ERR = ((ExceptionMessage[8]=\"Not found\"),8);\nvar NOT_SUPPORTED_ERR = ExceptionCode.NOT_SUPPORTED_ERR = ((ExceptionMessage[9]=\"Not supported\"),9);\nvar INUSE_ATTRIBUTE_ERR = ExceptionCode.INUSE_ATTRIBUTE_ERR = ((ExceptionMessage[10]=\"Attribute in use\"),10);\n//level2\nvar INVALID_STATE_ERR \t= ExceptionCode.INVALID_STATE_ERR \t= ((ExceptionMessage[11]=\"Invalid state\"),11);\nvar SYNTAX_ERR \t= ExceptionCode.SYNTAX_ERR \t= ((ExceptionMessage[12]=\"Syntax error\"),12);\nvar INVALID_MODIFICATION_ERR \t= ExceptionCode.INVALID_MODIFICATION_ERR \t= ((ExceptionMessage[13]=\"Invalid modification\"),13);\nvar NAMESPACE_ERR \t= ExceptionCode.NAMESPACE_ERR \t= ((ExceptionMessage[14]=\"Invalid namespace\"),14);\nvar INVALID_ACCESS_ERR \t= ExceptionCode.INVALID_ACCESS_ERR \t= ((ExceptionMessage[15]=\"Invalid access\"),15);\n\n\nfunction DOMException(code, message) {\n\tif(message instanceof Error){\n\t\tvar error = message;\n\t}else{\n\t\terror = this;\n\t\tError.call(this, ExceptionMessage[code]);\n\t\tthis.message = ExceptionMessage[code];\n\t\tif(Error.captureStackTrace) Error.captureStackTrace(this, DOMException);\n\t}\n\terror.code = code;\n\tif(message) this.message = this.message + \": \" + message;\n\treturn error;\n};\nDOMException.prototype = Error.prototype;\ncopy(ExceptionCode,DOMException)\n/**\n * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-536297177\n * The NodeList interface provides the abstraction of an ordered collection of nodes, without defining or constraining how this collection is implemented. NodeList objects in the DOM are live.\n * The items in the NodeList are accessible via an integral index, starting from 0.\n */\nfunction NodeList() {\n};\nNodeList.prototype = {\n\t/**\n\t * The number of nodes in the list. The range of valid child node indices is 0 to length-1 inclusive.\n\t * @standard level1\n\t */\n\tlength:0, \n\t/**\n\t * Returns the indexth item in the collection. If index is greater than or equal to the number of nodes in the list, this returns null.\n\t * @standard level1\n\t * @param index unsigned long \n\t * Index into the collection.\n\t * @return Node\n\t * \tThe node at the indexth position in the NodeList, or null if that is not a valid index. \n\t */\n\titem: function(index) {\n\t\treturn this[index] || null;\n\t},\n\ttoString:function(isHTML,nodeFilter){\n\t\tfor(var buf = [], i = 0;i=0){\n\t\tvar lastIndex = list.length-1\n\t\twhile(i0 || key == 'xmlns'){\n//\t\t\treturn null;\n//\t\t}\n\t\t//console.log()\n\t\tvar i = this.length;\n\t\twhile(i--){\n\t\t\tvar attr = this[i];\n\t\t\t//console.log(attr.nodeName,key)\n\t\t\tif(attr.nodeName == key){\n\t\t\t\treturn attr;\n\t\t\t}\n\t\t}\n\t},\n\tsetNamedItem: function(attr) {\n\t\tvar el = attr.ownerElement;\n\t\tif(el && el!=this._ownerElement){\n\t\t\tthrow new DOMException(INUSE_ATTRIBUTE_ERR);\n\t\t}\n\t\tvar oldAttr = this.getNamedItem(attr.nodeName);\n\t\t_addNamedNode(this._ownerElement,this,attr,oldAttr);\n\t\treturn oldAttr;\n\t},\n\t/* returns Node */\n\tsetNamedItemNS: function(attr) {// raises: WRONG_DOCUMENT_ERR,NO_MODIFICATION_ALLOWED_ERR,INUSE_ATTRIBUTE_ERR\n\t\tvar el = attr.ownerElement, oldAttr;\n\t\tif(el && el!=this._ownerElement){\n\t\t\tthrow new DOMException(INUSE_ATTRIBUTE_ERR);\n\t\t}\n\t\toldAttr = this.getNamedItemNS(attr.namespaceURI,attr.localName);\n\t\t_addNamedNode(this._ownerElement,this,attr,oldAttr);\n\t\treturn oldAttr;\n\t},\n\n\t/* returns Node */\n\tremoveNamedItem: function(key) {\n\t\tvar attr = this.getNamedItem(key);\n\t\t_removeNamedNode(this._ownerElement,this,attr);\n\t\treturn attr;\n\t\t\n\t\t\n\t},// raises: NOT_FOUND_ERR,NO_MODIFICATION_ALLOWED_ERR\n\t\n\t//for level2\n\tremoveNamedItemNS:function(namespaceURI,localName){\n\t\tvar attr = this.getNamedItemNS(namespaceURI,localName);\n\t\t_removeNamedNode(this._ownerElement,this,attr);\n\t\treturn attr;\n\t},\n\tgetNamedItemNS: function(namespaceURI, localName) {\n\t\tvar i = this.length;\n\t\twhile(i--){\n\t\t\tvar node = this[i];\n\t\t\tif(node.localName == localName && node.namespaceURI == namespaceURI){\n\t\t\t\treturn node;\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n};\n/**\n * @see http://www.w3.org/TR/REC-DOM-Level-1/level-one-core.html#ID-102161490\n */\nfunction DOMImplementation(/* Object */ features) {\n\tthis._features = {};\n\tif (features) {\n\t\tfor (var feature in features) {\n\t\t\t this._features = features[feature];\n\t\t}\n\t}\n};\n\nDOMImplementation.prototype = {\n\thasFeature: function(/* string */ feature, /* string */ version) {\n\t\tvar versions = this._features[feature.toLowerCase()];\n\t\tif (versions && (!version || version in versions)) {\n\t\t\treturn true;\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t},\n\t// Introduced in DOM Level 2:\n\tcreateDocument:function(namespaceURI, qualifiedName, doctype){// raises:INVALID_CHARACTER_ERR,NAMESPACE_ERR,WRONG_DOCUMENT_ERR\n\t\tvar doc = new Document();\n\t\tdoc.implementation = this;\n\t\tdoc.childNodes = new NodeList();\n\t\tdoc.doctype = doctype;\n\t\tif(doctype){\n\t\t\tdoc.appendChild(doctype);\n\t\t}\n\t\tif(qualifiedName){\n\t\t\tvar root = doc.createElementNS(namespaceURI,qualifiedName);\n\t\t\tdoc.appendChild(root);\n\t\t}\n\t\treturn doc;\n\t},\n\t// Introduced in DOM Level 2:\n\tcreateDocumentType:function(qualifiedName, publicId, systemId){// raises:INVALID_CHARACTER_ERR,NAMESPACE_ERR\n\t\tvar node = new DocumentType();\n\t\tnode.name = qualifiedName;\n\t\tnode.nodeName = qualifiedName;\n\t\tnode.publicId = publicId;\n\t\tnode.systemId = systemId;\n\t\t// Introduced in DOM Level 2:\n\t\t//readonly attribute DOMString internalSubset;\n\t\t\n\t\t//TODO:..\n\t\t// readonly attribute NamedNodeMap entities;\n\t\t// readonly attribute NamedNodeMap notations;\n\t\treturn node;\n\t}\n};\n\n\n/**\n * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1950641247\n */\n\nfunction Node() {\n};\n\nNode.prototype = {\n\tfirstChild : null,\n\tlastChild : null,\n\tpreviousSibling : null,\n\tnextSibling : null,\n\tattributes : null,\n\tparentNode : null,\n\tchildNodes : null,\n\townerDocument : null,\n\tnodeValue : null,\n\tnamespaceURI : null,\n\tprefix : null,\n\tlocalName : null,\n\t// Modified in DOM Level 2:\n\tinsertBefore:function(newChild, refChild){//raises \n\t\treturn _insertBefore(this,newChild,refChild);\n\t},\n\treplaceChild:function(newChild, oldChild){//raises \n\t\tthis.insertBefore(newChild,oldChild);\n\t\tif(oldChild){\n\t\t\tthis.removeChild(oldChild);\n\t\t}\n\t},\n\tremoveChild:function(oldChild){\n\t\treturn _removeChild(this,oldChild);\n\t},\n\tappendChild:function(newChild){\n\t\treturn this.insertBefore(newChild,null);\n\t},\n\thasChildNodes:function(){\n\t\treturn this.firstChild != null;\n\t},\n\tcloneNode:function(deep){\n\t\treturn cloneNode(this.ownerDocument||this,this,deep);\n\t},\n\t// Modified in DOM Level 2:\n\tnormalize:function(){\n\t\tvar child = this.firstChild;\n\t\twhile(child){\n\t\t\tvar next = child.nextSibling;\n\t\t\tif(next && next.nodeType == TEXT_NODE && child.nodeType == TEXT_NODE){\n\t\t\t\tthis.removeChild(next);\n\t\t\t\tchild.appendData(next.data);\n\t\t\t}else{\n\t\t\t\tchild.normalize();\n\t\t\t\tchild = next;\n\t\t\t}\n\t\t}\n\t},\n \t// Introduced in DOM Level 2:\n\tisSupported:function(feature, version){\n\t\treturn this.ownerDocument.implementation.hasFeature(feature,version);\n\t},\n // Introduced in DOM Level 2:\n hasAttributes:function(){\n \treturn this.attributes.length>0;\n },\n lookupPrefix:function(namespaceURI){\n \tvar el = this;\n \twhile(el){\n \t\tvar map = el._nsMap;\n \t\t//console.dir(map)\n \t\tif(map){\n \t\t\tfor(var n in map){\n \t\t\t\tif(map[n] == namespaceURI){\n \t\t\t\t\treturn n;\n \t\t\t\t}\n \t\t\t}\n \t\t}\n \t\tel = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode;\n \t}\n \treturn null;\n },\n // Introduced in DOM Level 3:\n lookupNamespaceURI:function(prefix){\n \tvar el = this;\n \twhile(el){\n \t\tvar map = el._nsMap;\n \t\t//console.dir(map)\n \t\tif(map){\n \t\t\tif(prefix in map){\n \t\t\t\treturn map[prefix] ;\n \t\t\t}\n \t\t}\n \t\tel = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode;\n \t}\n \treturn null;\n },\n // Introduced in DOM Level 3:\n isDefaultNamespace:function(namespaceURI){\n \tvar prefix = this.lookupPrefix(namespaceURI);\n \treturn prefix == null;\n }\n};\n\n\nfunction _xmlEncoder(c){\n\treturn c == '<' && '<' ||\n c == '>' && '>' ||\n c == '&' && '&' ||\n c == '\"' && '"' ||\n '&#'+c.charCodeAt()+';'\n}\n\n\ncopy(NodeType,Node);\ncopy(NodeType,Node.prototype);\n\n/**\n * @param callback return true for continue,false for break\n * @return boolean true: break visit;\n */\nfunction _visitNode(node,callback){\n\tif(callback(node)){\n\t\treturn true;\n\t}\n\tif(node = node.firstChild){\n\t\tdo{\n\t\t\tif(_visitNode(node,callback)){return true}\n }while(node=node.nextSibling)\n }\n}\n\n\n\nfunction Document(){\n}\nfunction _onAddAttribute(doc,el,newAttr){\n\tdoc && doc._inc++;\n\tvar ns = newAttr.namespaceURI ;\n\tif(ns == 'http://www.w3.org/2000/xmlns/'){\n\t\t//update namespace\n\t\tel._nsMap[newAttr.prefix?newAttr.localName:''] = newAttr.value\n\t}\n}\nfunction _onRemoveAttribute(doc,el,newAttr,remove){\n\tdoc && doc._inc++;\n\tvar ns = newAttr.namespaceURI ;\n\tif(ns == 'http://www.w3.org/2000/xmlns/'){\n\t\t//update namespace\n\t\tdelete el._nsMap[newAttr.prefix?newAttr.localName:'']\n\t}\n}\nfunction _onUpdateChild(doc,el,newChild){\n\tif(doc && doc._inc){\n\t\tdoc._inc++;\n\t\t//update childNodes\n\t\tvar cs = el.childNodes;\n\t\tif(newChild){\n\t\t\tcs[cs.length++] = newChild;\n\t\t}else{\n\t\t\t//console.log(1)\n\t\t\tvar child = el.firstChild;\n\t\t\tvar i = 0;\n\t\t\twhile(child){\n\t\t\t\tcs[i++] = child;\n\t\t\t\tchild =child.nextSibling;\n\t\t\t}\n\t\t\tcs.length = i;\n\t\t}\n\t}\n}\n\n/**\n * attributes;\n * children;\n * \n * writeable properties:\n * nodeValue,Attr:value,CharacterData:data\n * prefix\n */\nfunction _removeChild(parentNode,child){\n\tvar previous = child.previousSibling;\n\tvar next = child.nextSibling;\n\tif(previous){\n\t\tprevious.nextSibling = next;\n\t}else{\n\t\tparentNode.firstChild = next\n\t}\n\tif(next){\n\t\tnext.previousSibling = previous;\n\t}else{\n\t\tparentNode.lastChild = previous;\n\t}\n\t_onUpdateChild(parentNode.ownerDocument,parentNode);\n\treturn child;\n}\n/**\n * preformance key(refChild == null)\n */\nfunction _insertBefore(parentNode,newChild,nextChild){\n\tvar cp = newChild.parentNode;\n\tif(cp){\n\t\tcp.removeChild(newChild);//remove and update\n\t}\n\tif(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){\n\t\tvar newFirst = newChild.firstChild;\n\t\tif (newFirst == null) {\n\t\t\treturn newChild;\n\t\t}\n\t\tvar newLast = newChild.lastChild;\n\t}else{\n\t\tnewFirst = newLast = newChild;\n\t}\n\tvar pre = nextChild ? nextChild.previousSibling : parentNode.lastChild;\n\n\tnewFirst.previousSibling = pre;\n\tnewLast.nextSibling = nextChild;\n\t\n\t\n\tif(pre){\n\t\tpre.nextSibling = newFirst;\n\t}else{\n\t\tparentNode.firstChild = newFirst;\n\t}\n\tif(nextChild == null){\n\t\tparentNode.lastChild = newLast;\n\t}else{\n\t\tnextChild.previousSibling = newLast;\n\t}\n\tdo{\n\t\tnewFirst.parentNode = parentNode;\n\t}while(newFirst !== newLast && (newFirst= newFirst.nextSibling))\n\t_onUpdateChild(parentNode.ownerDocument||parentNode,parentNode);\n\t//console.log(parentNode.lastChild.nextSibling == null)\n\tif (newChild.nodeType == DOCUMENT_FRAGMENT_NODE) {\n\t\tnewChild.firstChild = newChild.lastChild = null;\n\t}\n\treturn newChild;\n}\nfunction _appendSingleChild(parentNode,newChild){\n\tvar cp = newChild.parentNode;\n\tif(cp){\n\t\tvar pre = parentNode.lastChild;\n\t\tcp.removeChild(newChild);//remove and update\n\t\tvar pre = parentNode.lastChild;\n\t}\n\tvar pre = parentNode.lastChild;\n\tnewChild.parentNode = parentNode;\n\tnewChild.previousSibling = pre;\n\tnewChild.nextSibling = null;\n\tif(pre){\n\t\tpre.nextSibling = newChild;\n\t}else{\n\t\tparentNode.firstChild = newChild;\n\t}\n\tparentNode.lastChild = newChild;\n\t_onUpdateChild(parentNode.ownerDocument,parentNode,newChild);\n\treturn newChild;\n\t//console.log(\"__aa\",parentNode.lastChild.nextSibling == null)\n}\nDocument.prototype = {\n\t//implementation : null,\n\tnodeName : '#document',\n\tnodeType : DOCUMENT_NODE,\n\tdoctype : null,\n\tdocumentElement : null,\n\t_inc : 1,\n\t\n\tinsertBefore : function(newChild, refChild){//raises \n\t\tif(newChild.nodeType == DOCUMENT_FRAGMENT_NODE){\n\t\t\tvar child = newChild.firstChild;\n\t\t\twhile(child){\n\t\t\t\tvar next = child.nextSibling;\n\t\t\t\tthis.insertBefore(child,refChild);\n\t\t\t\tchild = next;\n\t\t\t}\n\t\t\treturn newChild;\n\t\t}\n\t\tif(this.documentElement == null && newChild.nodeType == ELEMENT_NODE){\n\t\t\tthis.documentElement = newChild;\n\t\t}\n\t\t\n\t\treturn _insertBefore(this,newChild,refChild),(newChild.ownerDocument = this),newChild;\n\t},\n\tremoveChild : function(oldChild){\n\t\tif(this.documentElement == oldChild){\n\t\t\tthis.documentElement = null;\n\t\t}\n\t\treturn _removeChild(this,oldChild);\n\t},\n\t// Introduced in DOM Level 2:\n\timportNode : function(importedNode,deep){\n\t\treturn importNode(this,importedNode,deep);\n\t},\n\t// Introduced in DOM Level 2:\n\tgetElementById :\tfunction(id){\n\t\tvar rtv = null;\n\t\t_visitNode(this.documentElement,function(node){\n\t\t\tif(node.nodeType == ELEMENT_NODE){\n\t\t\t\tif(node.getAttribute('id') == id){\n\t\t\t\t\trtv = node;\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t\treturn rtv;\n\t},\n\t\n\t//document factory method:\n\tcreateElement :\tfunction(tagName){\n\t\tvar node = new Element();\n\t\tnode.ownerDocument = this;\n\t\tnode.nodeName = tagName;\n\t\tnode.tagName = tagName;\n\t\tnode.childNodes = new NodeList();\n\t\tvar attrs\t= node.attributes = new NamedNodeMap();\n\t\tattrs._ownerElement = node;\n\t\treturn node;\n\t},\n\tcreateDocumentFragment :\tfunction(){\n\t\tvar node = new DocumentFragment();\n\t\tnode.ownerDocument = this;\n\t\tnode.childNodes = new NodeList();\n\t\treturn node;\n\t},\n\tcreateTextNode :\tfunction(data){\n\t\tvar node = new Text();\n\t\tnode.ownerDocument = this;\n\t\tnode.appendData(data)\n\t\treturn node;\n\t},\n\tcreateComment :\tfunction(data){\n\t\tvar node = new Comment();\n\t\tnode.ownerDocument = this;\n\t\tnode.appendData(data)\n\t\treturn node;\n\t},\n\tcreateCDATASection :\tfunction(data){\n\t\tvar node = new CDATASection();\n\t\tnode.ownerDocument = this;\n\t\tnode.appendData(data)\n\t\treturn node;\n\t},\n\tcreateProcessingInstruction :\tfunction(target,data){\n\t\tvar node = new ProcessingInstruction();\n\t\tnode.ownerDocument = this;\n\t\tnode.tagName = node.target = target;\n\t\tnode.nodeValue= node.data = data;\n\t\treturn node;\n\t},\n\tcreateAttribute :\tfunction(name){\n\t\tvar node = new Attr();\n\t\tnode.ownerDocument\t= this;\n\t\tnode.name = name;\n\t\tnode.nodeName\t= name;\n\t\tnode.localName = name;\n\t\tnode.specified = true;\n\t\treturn node;\n\t},\n\tcreateEntityReference :\tfunction(name){\n\t\tvar node = new EntityReference();\n\t\tnode.ownerDocument\t= this;\n\t\tnode.nodeName\t= name;\n\t\treturn node;\n\t},\n\t// Introduced in DOM Level 2:\n\tcreateElementNS :\tfunction(namespaceURI,qualifiedName){\n\t\tvar node = new Element();\n\t\tvar pl = qualifiedName.split(':');\n\t\tvar attrs\t= node.attributes = new NamedNodeMap();\n\t\tnode.childNodes = new NodeList();\n\t\tnode.ownerDocument = this;\n\t\tnode.nodeName = qualifiedName;\n\t\tnode.tagName = qualifiedName;\n\t\tnode.namespaceURI = namespaceURI;\n\t\tif(pl.length == 2){\n\t\t\tnode.prefix = pl[0];\n\t\t\tnode.localName = pl[1];\n\t\t}else{\n\t\t\t//el.prefix = null;\n\t\t\tnode.localName = qualifiedName;\n\t\t}\n\t\tattrs._ownerElement = node;\n\t\treturn node;\n\t},\n\t// Introduced in DOM Level 2:\n\tcreateAttributeNS :\tfunction(namespaceURI,qualifiedName){\n\t\tvar node = new Attr();\n\t\tvar pl = qualifiedName.split(':');\n\t\tnode.ownerDocument = this;\n\t\tnode.nodeName = qualifiedName;\n\t\tnode.name = qualifiedName;\n\t\tnode.namespaceURI = namespaceURI;\n\t\tnode.specified = true;\n\t\tif(pl.length == 2){\n\t\t\tnode.prefix = pl[0];\n\t\t\tnode.localName = pl[1];\n\t\t}else{\n\t\t\t//el.prefix = null;\n\t\t\tnode.localName = qualifiedName;\n\t\t}\n\t\treturn node;\n\t}\n};\n_extends(Document,Node);\n\n\nfunction Element() {\n\tthis._nsMap = {};\n};\nElement.prototype = {\n\tnodeType : ELEMENT_NODE,\n\thasAttribute : function(name){\n\t\treturn this.getAttributeNode(name)!=null;\n\t},\n\tgetAttribute : function(name){\n\t\tvar attr = this.getAttributeNode(name);\n\t\treturn attr && attr.value || '';\n\t},\n\tgetAttributeNode : function(name){\n\t\treturn this.attributes.getNamedItem(name);\n\t},\n\tsetAttribute : function(name, value){\n\t\tvar attr = this.ownerDocument.createAttribute(name);\n\t\tattr.value = attr.nodeValue = \"\" + value;\n\t\tthis.setAttributeNode(attr)\n\t},\n\tremoveAttribute : function(name){\n\t\tvar attr = this.getAttributeNode(name)\n\t\tattr && this.removeAttributeNode(attr);\n\t},\n\t\n\t//four real opeartion method\n\tappendChild:function(newChild){\n\t\tif(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){\n\t\t\treturn this.insertBefore(newChild,null);\n\t\t}else{\n\t\t\treturn _appendSingleChild(this,newChild);\n\t\t}\n\t},\n\tsetAttributeNode : function(newAttr){\n\t\treturn this.attributes.setNamedItem(newAttr);\n\t},\n\tsetAttributeNodeNS : function(newAttr){\n\t\treturn this.attributes.setNamedItemNS(newAttr);\n\t},\n\tremoveAttributeNode : function(oldAttr){\n\t\t//console.log(this == oldAttr.ownerElement)\n\t\treturn this.attributes.removeNamedItem(oldAttr.nodeName);\n\t},\n\t//get real attribute name,and remove it by removeAttributeNode\n\tremoveAttributeNS : function(namespaceURI, localName){\n\t\tvar old = this.getAttributeNodeNS(namespaceURI, localName);\n\t\told && this.removeAttributeNode(old);\n\t},\n\t\n\thasAttributeNS : function(namespaceURI, localName){\n\t\treturn this.getAttributeNodeNS(namespaceURI, localName)!=null;\n\t},\n\tgetAttributeNS : function(namespaceURI, localName){\n\t\tvar attr = this.getAttributeNodeNS(namespaceURI, localName);\n\t\treturn attr && attr.value || '';\n\t},\n\tsetAttributeNS : function(namespaceURI, qualifiedName, value){\n\t\tvar attr = this.ownerDocument.createAttributeNS(namespaceURI, qualifiedName);\n\t\tattr.value = attr.nodeValue = \"\" + value;\n\t\tthis.setAttributeNode(attr)\n\t},\n\tgetAttributeNodeNS : function(namespaceURI, localName){\n\t\treturn this.attributes.getNamedItemNS(namespaceURI, localName);\n\t},\n\t\n\tgetElementsByTagName : function(tagName){\n\t\treturn new LiveNodeList(this,function(base){\n\t\t\tvar ls = [];\n\t\t\t_visitNode(base,function(node){\n\t\t\t\tif(node !== base && node.nodeType == ELEMENT_NODE && (tagName === '*' || node.tagName == tagName)){\n\t\t\t\t\tls.push(node);\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn ls;\n\t\t});\n\t},\n\tgetElementsByTagNameNS : function(namespaceURI, localName){\n\t\treturn new LiveNodeList(this,function(base){\n\t\t\tvar ls = [];\n\t\t\t_visitNode(base,function(node){\n\t\t\t\tif(node !== base && node.nodeType === ELEMENT_NODE && (namespaceURI === '*' || node.namespaceURI === namespaceURI) && (localName === '*' || node.localName == localName)){\n\t\t\t\t\tls.push(node);\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn ls;\n\t\t\t\n\t\t});\n\t}\n};\nDocument.prototype.getElementsByTagName = Element.prototype.getElementsByTagName;\nDocument.prototype.getElementsByTagNameNS = Element.prototype.getElementsByTagNameNS;\n\n\n_extends(Element,Node);\nfunction Attr() {\n};\nAttr.prototype.nodeType = ATTRIBUTE_NODE;\n_extends(Attr,Node);\n\n\nfunction CharacterData() {\n};\nCharacterData.prototype = {\n\tdata : '',\n\tsubstringData : function(offset, count) {\n\t\treturn this.data.substring(offset, offset+count);\n\t},\n\tappendData: function(text) {\n\t\ttext = this.data+text;\n\t\tthis.nodeValue = this.data = text;\n\t\tthis.length = text.length;\n\t},\n\tinsertData: function(offset,text) {\n\t\tthis.replaceData(offset,0,text);\n\t\n\t},\n\tappendChild:function(newChild){\n\t\tthrow new Error(ExceptionMessage[HIERARCHY_REQUEST_ERR])\n\t},\n\tdeleteData: function(offset, count) {\n\t\tthis.replaceData(offset,count,\"\");\n\t},\n\treplaceData: function(offset, count, text) {\n\t\tvar start = this.data.substring(0,offset);\n\t\tvar end = this.data.substring(offset+count);\n\t\ttext = start + text + end;\n\t\tthis.nodeValue = this.data = text;\n\t\tthis.length = text.length;\n\t}\n}\n_extends(CharacterData,Node);\nfunction Text() {\n};\nText.prototype = {\n\tnodeName : \"#text\",\n\tnodeType : TEXT_NODE,\n\tsplitText : function(offset) {\n\t\tvar text = this.data;\n\t\tvar newText = text.substring(offset);\n\t\ttext = text.substring(0, offset);\n\t\tthis.data = this.nodeValue = text;\n\t\tthis.length = text.length;\n\t\tvar newNode = this.ownerDocument.createTextNode(newText);\n\t\tif(this.parentNode){\n\t\t\tthis.parentNode.insertBefore(newNode, this.nextSibling);\n\t\t}\n\t\treturn newNode;\n\t}\n}\n_extends(Text,CharacterData);\nfunction Comment() {\n};\nComment.prototype = {\n\tnodeName : \"#comment\",\n\tnodeType : COMMENT_NODE\n}\n_extends(Comment,CharacterData);\n\nfunction CDATASection() {\n};\nCDATASection.prototype = {\n\tnodeName : \"#cdata-section\",\n\tnodeType : CDATA_SECTION_NODE\n}\n_extends(CDATASection,CharacterData);\n\n\nfunction DocumentType() {\n};\nDocumentType.prototype.nodeType = DOCUMENT_TYPE_NODE;\n_extends(DocumentType,Node);\n\nfunction Notation() {\n};\nNotation.prototype.nodeType = NOTATION_NODE;\n_extends(Notation,Node);\n\nfunction Entity() {\n};\nEntity.prototype.nodeType = ENTITY_NODE;\n_extends(Entity,Node);\n\nfunction EntityReference() {\n};\nEntityReference.prototype.nodeType = ENTITY_REFERENCE_NODE;\n_extends(EntityReference,Node);\n\nfunction DocumentFragment() {\n};\nDocumentFragment.prototype.nodeName =\t\"#document-fragment\";\nDocumentFragment.prototype.nodeType =\tDOCUMENT_FRAGMENT_NODE;\n_extends(DocumentFragment,Node);\n\n\nfunction ProcessingInstruction() {\n}\nProcessingInstruction.prototype.nodeType = PROCESSING_INSTRUCTION_NODE;\n_extends(ProcessingInstruction,Node);\nfunction XMLSerializer(){}\nXMLSerializer.prototype.serializeToString = function(node,isHtml,nodeFilter){\n\treturn nodeSerializeToString.call(node,isHtml,nodeFilter);\n}\nNode.prototype.toString = nodeSerializeToString;\nfunction nodeSerializeToString(isHtml,nodeFilter){\n\tvar buf = [];\n\tvar refNode = this.nodeType == 9?this.documentElement:this;\n\tvar prefix = refNode.prefix;\n\tvar uri = refNode.namespaceURI;\n\t\n\tif(uri && prefix == null){\n\t\t//console.log(prefix)\n\t\tvar prefix = refNode.lookupPrefix(uri);\n\t\tif(prefix == null){\n\t\t\t//isHTML = true;\n\t\t\tvar visibleNamespaces=[\n\t\t\t{namespace:uri,prefix:null}\n\t\t\t//{namespace:uri,prefix:''}\n\t\t\t]\n\t\t}\n\t}\n\tserializeToString(this,buf,isHtml,nodeFilter,visibleNamespaces);\n\t//console.log('###',this.nodeType,uri,prefix,buf.join(''))\n\treturn buf.join('');\n}\nfunction needNamespaceDefine(node,isHTML, visibleNamespaces) {\n\tvar prefix = node.prefix||'';\n\tvar uri = node.namespaceURI;\n\tif (!prefix && !uri){\n\t\treturn false;\n\t}\n\tif (prefix === \"xml\" && uri === \"http://www.w3.org/XML/1998/namespace\" \n\t\t|| uri == 'http://www.w3.org/2000/xmlns/'){\n\t\treturn false;\n\t}\n\t\n\tvar i = visibleNamespaces.length \n\t//console.log('@@@@',node.tagName,prefix,uri,visibleNamespaces)\n\twhile (i--) {\n\t\tvar ns = visibleNamespaces[i];\n\t\t// get namespace prefix\n\t\t//console.log(node.nodeType,node.tagName,ns.prefix,prefix)\n\t\tif (ns.prefix == prefix){\n\t\t\treturn ns.namespace != uri;\n\t\t}\n\t}\n\t//console.log(isHTML,uri,prefix=='')\n\t//if(isHTML && prefix ==null && uri == 'http://www.w3.org/1999/xhtml'){\n\t//\treturn false;\n\t//}\n\t//node.flag = '11111'\n\t//console.error(3,true,node.flag,node.prefix,node.namespaceURI)\n\treturn true;\n}\nfunction serializeToString(node,buf,isHTML,nodeFilter,visibleNamespaces){\n\tif(nodeFilter){\n\t\tnode = nodeFilter(node);\n\t\tif(node){\n\t\t\tif(typeof node == 'string'){\n\t\t\t\tbuf.push(node);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}else{\n\t\t\treturn;\n\t\t}\n\t\t//buf.sort.apply(attrs, attributeSorter);\n\t}\n\tswitch(node.nodeType){\n\tcase ELEMENT_NODE:\n\t\tif (!visibleNamespaces) visibleNamespaces = [];\n\t\tvar startVisibleNamespaces = visibleNamespaces.length;\n\t\tvar attrs = node.attributes;\n\t\tvar len = attrs.length;\n\t\tvar child = node.firstChild;\n\t\tvar nodeName = node.tagName;\n\t\t\n\t\tisHTML = (htmlns === node.namespaceURI) ||isHTML \n\t\tbuf.push('<',nodeName);\n\t\t\n\t\t\n\t\t\n\t\tfor(var i=0;i');\n\t\t\t//if is cdata child node\n\t\t\tif(isHTML && /^script$/i.test(nodeName)){\n\t\t\t\twhile(child){\n\t\t\t\t\tif(child.data){\n\t\t\t\t\t\tbuf.push(child.data);\n\t\t\t\t\t}else{\n\t\t\t\t\t\tserializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);\n\t\t\t\t\t}\n\t\t\t\t\tchild = child.nextSibling;\n\t\t\t\t}\n\t\t\t}else\n\t\t\t{\n\t\t\t\twhile(child){\n\t\t\t\t\tserializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);\n\t\t\t\t\tchild = child.nextSibling;\n\t\t\t\t}\n\t\t\t}\n\t\t\tbuf.push('');\n\t\t}else{\n\t\t\tbuf.push('/>');\n\t\t}\n\t\t// remove added visible namespaces\n\t\t//visibleNamespaces.length = startVisibleNamespaces;\n\t\treturn;\n\tcase DOCUMENT_NODE:\n\tcase DOCUMENT_FRAGMENT_NODE:\n\t\tvar child = node.firstChild;\n\t\twhile(child){\n\t\t\tserializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);\n\t\t\tchild = child.nextSibling;\n\t\t}\n\t\treturn;\n\tcase ATTRIBUTE_NODE:\n\t\treturn buf.push(' ',node.name,'=\"',node.value.replace(/[<&\"]/g,_xmlEncoder),'\"');\n\tcase TEXT_NODE:\n\t\treturn buf.push(node.data.replace(/[<&]/g,_xmlEncoder));\n\tcase CDATA_SECTION_NODE:\n\t\treturn buf.push( '');\n\tcase COMMENT_NODE:\n\t\treturn buf.push( \"\");\n\tcase DOCUMENT_TYPE_NODE:\n\t\tvar pubid = node.publicId;\n\t\tvar sysid = node.systemId;\n\t\tbuf.push('');\n\t\t}else if(sysid && sysid!='.'){\n\t\t\tbuf.push(' SYSTEM \"',sysid,'\">');\n\t\t}else{\n\t\t\tvar sub = node.internalSubset;\n\t\t\tif(sub){\n\t\t\t\tbuf.push(\" [\",sub,\"]\");\n\t\t\t}\n\t\t\tbuf.push(\">\");\n\t\t}\n\t\treturn;\n\tcase PROCESSING_INSTRUCTION_NODE:\n\t\treturn buf.push( \"\");\n\tcase ENTITY_REFERENCE_NODE:\n\t\treturn buf.push( '&',node.nodeName,';');\n\t//case ENTITY_NODE:\n\t//case NOTATION_NODE:\n\tdefault:\n\t\tbuf.push('??',node.nodeName);\n\t}\n}\nfunction importNode(doc,node,deep){\n\tvar node2;\n\tswitch (node.nodeType) {\n\tcase ELEMENT_NODE:\n\t\tnode2 = node.cloneNode(false);\n\t\tnode2.ownerDocument = doc;\n\t\t//var attrs = node2.attributes;\n\t\t//var len = attrs.length;\n\t\t//for(var i=0;i> 6);\r\n buffer8[i++] = 0x80 | (code & 0x3f);\r\n } else if (code < 0xd800 || code >= 0xe000) {\r\n buffer8[i++] = 0xe0 | (code >> 12);\r\n buffer8[i++] = 0x80 | ((code >> 6) & 0x3f);\r\n buffer8[i++] = 0x80 | (code & 0x3f);\r\n } else {\r\n code = 0x10000 + (((code & 0x3ff) << 10) | (message.charCodeAt(++index) & 0x3ff));\r\n buffer8[i++] = 0xf0 | (code >> 18);\r\n buffer8[i++] = 0x80 | ((code >> 12) & 0x3f);\r\n buffer8[i++] = 0x80 | ((code >> 6) & 0x3f);\r\n buffer8[i++] = 0x80 | (code & 0x3f);\r\n }\r\n }\r\n } else {\r\n for (i = this.start; index < length && i < 64; ++index) {\r\n code = message.charCodeAt(index);\r\n if (isBinStr || code < 0x80) {\r\n blocks[i >> 2] |= code << SHIFT[i++ & 3];\r\n } else if (code < 0x800) {\r\n blocks[i >> 2] |= (0xc0 | (code >> 6)) << SHIFT[i++ & 3];\r\n blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];\r\n } else if (code < 0xd800 || code >= 0xe000) {\r\n blocks[i >> 2] |= (0xe0 | (code >> 12)) << SHIFT[i++ & 3];\r\n blocks[i >> 2] |= (0x80 | ((code >> 6) & 0x3f)) << SHIFT[i++ & 3];\r\n blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];\r\n } else {\r\n code = 0x10000 + (((code & 0x3ff) << 10) | (message.charCodeAt(++index) & 0x3ff));\r\n blocks[i >> 2] |= (0xf0 | (code >> 18)) << SHIFT[i++ & 3];\r\n blocks[i >> 2] |= (0x80 | ((code >> 12) & 0x3f)) << SHIFT[i++ & 3];\r\n blocks[i >> 2] |= (0x80 | ((code >> 6) & 0x3f)) << SHIFT[i++ & 3];\r\n blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];\r\n }\r\n }\r\n }\r\n this.lastByteIndex = i;\r\n this.bytes += i - this.start;\r\n if (i >= 64) {\r\n this.start = i - 64;\r\n this.hash();\r\n this.hashed = true;\r\n } else {\r\n this.start = i;\r\n }\r\n }\r\n if (this.bytes > 4294967295) {\r\n this.hBytes += this.bytes / 4294967296 << 0;\r\n this.bytes = this.bytes % 4294967296;\r\n }\r\n return this;\r\n };\r\n\r\n Md5.prototype.finalize = function () {\r\n if (this.finalized) {\r\n return;\r\n }\r\n this.finalized = true;\r\n var blocks = this.blocks, i = this.lastByteIndex;\r\n blocks[i >> 2] |= EXTRA[i & 3];\r\n if (i >= 56) {\r\n if (!this.hashed) {\r\n this.hash();\r\n }\r\n blocks[0] = blocks[16];\r\n blocks[16] = blocks[1] = blocks[2] = blocks[3] =\r\n blocks[4] = blocks[5] = blocks[6] = blocks[7] =\r\n blocks[8] = blocks[9] = blocks[10] = blocks[11] =\r\n blocks[12] = blocks[13] = blocks[14] = blocks[15] = 0;\r\n }\r\n blocks[14] = this.bytes << 3;\r\n blocks[15] = this.hBytes << 3 | this.bytes >>> 29;\r\n this.hash();\r\n };\r\n\r\n Md5.prototype.hash = function () {\r\n var a, b, c, d, bc, da, blocks = this.blocks;\r\n\r\n if (this.first) {\r\n a = blocks[0] - 680876937;\r\n a = (a << 7 | a >>> 25) - 271733879 << 0;\r\n d = (-1732584194 ^ a & 2004318071) + blocks[1] - 117830708;\r\n d = (d << 12 | d >>> 20) + a << 0;\r\n c = (-271733879 ^ (d & (a ^ -271733879))) + blocks[2] - 1126478375;\r\n c = (c << 17 | c >>> 15) + d << 0;\r\n b = (a ^ (c & (d ^ a))) + blocks[3] - 1316259209;\r\n b = (b << 22 | b >>> 10) + c << 0;\r\n } else {\r\n a = this.h0;\r\n b = this.h1;\r\n c = this.h2;\r\n d = this.h3;\r\n a += (d ^ (b & (c ^ d))) + blocks[0] - 680876936;\r\n a = (a << 7 | a >>> 25) + b << 0;\r\n d += (c ^ (a & (b ^ c))) + blocks[1] - 389564586;\r\n d = (d << 12 | d >>> 20) + a << 0;\r\n c += (b ^ (d & (a ^ b))) + blocks[2] + 606105819;\r\n c = (c << 17 | c >>> 15) + d << 0;\r\n b += (a ^ (c & (d ^ a))) + blocks[3] - 1044525330;\r\n b = (b << 22 | b >>> 10) + c << 0;\r\n }\r\n\r\n a += (d ^ (b & (c ^ d))) + blocks[4] - 176418897;\r\n a = (a << 7 | a >>> 25) + b << 0;\r\n d += (c ^ (a & (b ^ c))) + blocks[5] + 1200080426;\r\n d = (d << 12 | d >>> 20) + a << 0;\r\n c += (b ^ (d & (a ^ b))) + blocks[6] - 1473231341;\r\n c = (c << 17 | c >>> 15) + d << 0;\r\n b += (a ^ (c & (d ^ a))) + blocks[7] - 45705983;\r\n b = (b << 22 | b >>> 10) + c << 0;\r\n a += (d ^ (b & (c ^ d))) + blocks[8] + 1770035416;\r\n a = (a << 7 | a >>> 25) + b << 0;\r\n d += (c ^ (a & (b ^ c))) + blocks[9] - 1958414417;\r\n d = (d << 12 | d >>> 20) + a << 0;\r\n c += (b ^ (d & (a ^ b))) + blocks[10] - 42063;\r\n c = (c << 17 | c >>> 15) + d << 0;\r\n b += (a ^ (c & (d ^ a))) + blocks[11] - 1990404162;\r\n b = (b << 22 | b >>> 10) + c << 0;\r\n a += (d ^ (b & (c ^ d))) + blocks[12] + 1804603682;\r\n a = (a << 7 | a >>> 25) + b << 0;\r\n d += (c ^ (a & (b ^ c))) + blocks[13] - 40341101;\r\n d = (d << 12 | d >>> 20) + a << 0;\r\n c += (b ^ (d & (a ^ b))) + blocks[14] - 1502002290;\r\n c = (c << 17 | c >>> 15) + d << 0;\r\n b += (a ^ (c & (d ^ a))) + blocks[15] + 1236535329;\r\n b = (b << 22 | b >>> 10) + c << 0;\r\n a += (c ^ (d & (b ^ c))) + blocks[1] - 165796510;\r\n a = (a << 5 | a >>> 27) + b << 0;\r\n d += (b ^ (c & (a ^ b))) + blocks[6] - 1069501632;\r\n d = (d << 9 | d >>> 23) + a << 0;\r\n c += (a ^ (b & (d ^ a))) + blocks[11] + 643717713;\r\n c = (c << 14 | c >>> 18) + d << 0;\r\n b += (d ^ (a & (c ^ d))) + blocks[0] - 373897302;\r\n b = (b << 20 | b >>> 12) + c << 0;\r\n a += (c ^ (d & (b ^ c))) + blocks[5] - 701558691;\r\n a = (a << 5 | a >>> 27) + b << 0;\r\n d += (b ^ (c & (a ^ b))) + blocks[10] + 38016083;\r\n d = (d << 9 | d >>> 23) + a << 0;\r\n c += (a ^ (b & (d ^ a))) + blocks[15] - 660478335;\r\n c = (c << 14 | c >>> 18) + d << 0;\r\n b += (d ^ (a & (c ^ d))) + blocks[4] - 405537848;\r\n b = (b << 20 | b >>> 12) + c << 0;\r\n a += (c ^ (d & (b ^ c))) + blocks[9] + 568446438;\r\n a = (a << 5 | a >>> 27) + b << 0;\r\n d += (b ^ (c & (a ^ b))) + blocks[14] - 1019803690;\r\n d = (d << 9 | d >>> 23) + a << 0;\r\n c += (a ^ (b & (d ^ a))) + blocks[3] - 187363961;\r\n c = (c << 14 | c >>> 18) + d << 0;\r\n b += (d ^ (a & (c ^ d))) + blocks[8] + 1163531501;\r\n b = (b << 20 | b >>> 12) + c << 0;\r\n a += (c ^ (d & (b ^ c))) + blocks[13] - 1444681467;\r\n a = (a << 5 | a >>> 27) + b << 0;\r\n d += (b ^ (c & (a ^ b))) + blocks[2] - 51403784;\r\n d = (d << 9 | d >>> 23) + a << 0;\r\n c += (a ^ (b & (d ^ a))) + blocks[7] + 1735328473;\r\n c = (c << 14 | c >>> 18) + d << 0;\r\n b += (d ^ (a & (c ^ d))) + blocks[12] - 1926607734;\r\n b = (b << 20 | b >>> 12) + c << 0;\r\n bc = b ^ c;\r\n a += (bc ^ d) + blocks[5] - 378558;\r\n a = (a << 4 | a >>> 28) + b << 0;\r\n d += (bc ^ a) + blocks[8] - 2022574463;\r\n d = (d << 11 | d >>> 21) + a << 0;\r\n da = d ^ a;\r\n c += (da ^ b) + blocks[11] + 1839030562;\r\n c = (c << 16 | c >>> 16) + d << 0;\r\n b += (da ^ c) + blocks[14] - 35309556;\r\n b = (b << 23 | b >>> 9) + c << 0;\r\n bc = b ^ c;\r\n a += (bc ^ d) + blocks[1] - 1530992060;\r\n a = (a << 4 | a >>> 28) + b << 0;\r\n d += (bc ^ a) + blocks[4] + 1272893353;\r\n d = (d << 11 | d >>> 21) + a << 0;\r\n da = d ^ a;\r\n c += (da ^ b) + blocks[7] - 155497632;\r\n c = (c << 16 | c >>> 16) + d << 0;\r\n b += (da ^ c) + blocks[10] - 1094730640;\r\n b = (b << 23 | b >>> 9) + c << 0;\r\n bc = b ^ c;\r\n a += (bc ^ d) + blocks[13] + 681279174;\r\n a = (a << 4 | a >>> 28) + b << 0;\r\n d += (bc ^ a) + blocks[0] - 358537222;\r\n d = (d << 11 | d >>> 21) + a << 0;\r\n da = d ^ a;\r\n c += (da ^ b) + blocks[3] - 722521979;\r\n c = (c << 16 | c >>> 16) + d << 0;\r\n b += (da ^ c) + blocks[6] + 76029189;\r\n b = (b << 23 | b >>> 9) + c << 0;\r\n bc = b ^ c;\r\n a += (bc ^ d) + blocks[9] - 640364487;\r\n a = (a << 4 | a >>> 28) + b << 0;\r\n d += (bc ^ a) + blocks[12] - 421815835;\r\n d = (d << 11 | d >>> 21) + a << 0;\r\n da = d ^ a;\r\n c += (da ^ b) + blocks[15] + 530742520;\r\n c = (c << 16 | c >>> 16) + d << 0;\r\n b += (da ^ c) + blocks[2] - 995338651;\r\n b = (b << 23 | b >>> 9) + c << 0;\r\n a += (c ^ (b | ~d)) + blocks[0] - 198630844;\r\n a = (a << 6 | a >>> 26) + b << 0;\r\n d += (b ^ (a | ~c)) + blocks[7] + 1126891415;\r\n d = (d << 10 | d >>> 22) + a << 0;\r\n c += (a ^ (d | ~b)) + blocks[14] - 1416354905;\r\n c = (c << 15 | c >>> 17) + d << 0;\r\n b += (d ^ (c | ~a)) + blocks[5] - 57434055;\r\n b = (b << 21 | b >>> 11) + c << 0;\r\n a += (c ^ (b | ~d)) + blocks[12] + 1700485571;\r\n a = (a << 6 | a >>> 26) + b << 0;\r\n d += (b ^ (a | ~c)) + blocks[3] - 1894986606;\r\n d = (d << 10 | d >>> 22) + a << 0;\r\n c += (a ^ (d | ~b)) + blocks[10] - 1051523;\r\n c = (c << 15 | c >>> 17) + d << 0;\r\n b += (d ^ (c | ~a)) + blocks[1] - 2054922799;\r\n b = (b << 21 | b >>> 11) + c << 0;\r\n a += (c ^ (b | ~d)) + blocks[8] + 1873313359;\r\n a = (a << 6 | a >>> 26) + b << 0;\r\n d += (b ^ (a | ~c)) + blocks[15] - 30611744;\r\n d = (d << 10 | d >>> 22) + a << 0;\r\n c += (a ^ (d | ~b)) + blocks[6] - 1560198380;\r\n c = (c << 15 | c >>> 17) + d << 0;\r\n b += (d ^ (c | ~a)) + blocks[13] + 1309151649;\r\n b = (b << 21 | b >>> 11) + c << 0;\r\n a += (c ^ (b | ~d)) + blocks[4] - 145523070;\r\n a = (a << 6 | a >>> 26) + b << 0;\r\n d += (b ^ (a | ~c)) + blocks[11] - 1120210379;\r\n d = (d << 10 | d >>> 22) + a << 0;\r\n c += (a ^ (d | ~b)) + blocks[2] + 718787259;\r\n c = (c << 15 | c >>> 17) + d << 0;\r\n b += (d ^ (c | ~a)) + blocks[9] - 343485551;\r\n b = (b << 21 | b >>> 11) + c << 0;\r\n\r\n if (this.first) {\r\n this.h0 = a + 1732584193 << 0;\r\n this.h1 = b - 271733879 << 0;\r\n this.h2 = c - 1732584194 << 0;\r\n this.h3 = d + 271733878 << 0;\r\n this.first = false;\r\n } else {\r\n this.h0 = this.h0 + a << 0;\r\n this.h1 = this.h1 + b << 0;\r\n this.h2 = this.h2 + c << 0;\r\n this.h3 = this.h3 + d << 0;\r\n }\r\n };\r\n\r\n /**\r\n * @method hex\r\n * @memberof Md5\r\n * @instance\r\n * @description Output hash as hex string\r\n * @returns {String} Hex string\r\n * @see {@link md5.hex}\r\n * @example\r\n * hash.hex();\r\n */\r\n Md5.prototype.hex = function () {\r\n this.finalize();\r\n\r\n var h0 = this.h0, h1 = this.h1, h2 = this.h2, h3 = this.h3;\r\n\r\n return HEX_CHARS[(h0 >> 4) & 0x0F] + HEX_CHARS[h0 & 0x0F] +\r\n HEX_CHARS[(h0 >> 12) & 0x0F] + HEX_CHARS[(h0 >> 8) & 0x0F] +\r\n HEX_CHARS[(h0 >> 20) & 0x0F] + HEX_CHARS[(h0 >> 16) & 0x0F] +\r\n HEX_CHARS[(h0 >> 28) & 0x0F] + HEX_CHARS[(h0 >> 24) & 0x0F] +\r\n HEX_CHARS[(h1 >> 4) & 0x0F] + HEX_CHARS[h1 & 0x0F] +\r\n HEX_CHARS[(h1 >> 12) & 0x0F] + HEX_CHARS[(h1 >> 8) & 0x0F] +\r\n HEX_CHARS[(h1 >> 20) & 0x0F] + HEX_CHARS[(h1 >> 16) & 0x0F] +\r\n HEX_CHARS[(h1 >> 28) & 0x0F] + HEX_CHARS[(h1 >> 24) & 0x0F] +\r\n HEX_CHARS[(h2 >> 4) & 0x0F] + HEX_CHARS[h2 & 0x0F] +\r\n HEX_CHARS[(h2 >> 12) & 0x0F] + HEX_CHARS[(h2 >> 8) & 0x0F] +\r\n HEX_CHARS[(h2 >> 20) & 0x0F] + HEX_CHARS[(h2 >> 16) & 0x0F] +\r\n HEX_CHARS[(h2 >> 28) & 0x0F] + HEX_CHARS[(h2 >> 24) & 0x0F] +\r\n HEX_CHARS[(h3 >> 4) & 0x0F] + HEX_CHARS[h3 & 0x0F] +\r\n HEX_CHARS[(h3 >> 12) & 0x0F] + HEX_CHARS[(h3 >> 8) & 0x0F] +\r\n HEX_CHARS[(h3 >> 20) & 0x0F] + HEX_CHARS[(h3 >> 16) & 0x0F] +\r\n HEX_CHARS[(h3 >> 28) & 0x0F] + HEX_CHARS[(h3 >> 24) & 0x0F];\r\n };\r\n\r\n /**\r\n * @method toString\r\n * @memberof Md5\r\n * @instance\r\n * @description Output hash as hex string\r\n * @returns {String} Hex string\r\n * @see {@link md5.hex}\r\n * @example\r\n * hash.toString();\r\n */\r\n Md5.prototype.toString = Md5.prototype.hex;\r\n\r\n /**\r\n * @method digest\r\n * @memberof Md5\r\n * @instance\r\n * @description Output hash as bytes array\r\n * @returns {Array} Bytes array\r\n * @see {@link md5.digest}\r\n * @example\r\n * hash.digest();\r\n */\r\n Md5.prototype.digest = function (format) {\r\n if (format === 'hex') return this.hex();\r\n this.finalize();\r\n\r\n var h0 = this.h0, h1 = this.h1, h2 = this.h2, h3 = this.h3;\r\n var res = [\r\n h0 & 0xFF, (h0 >> 8) & 0xFF, (h0 >> 16) & 0xFF, (h0 >> 24) & 0xFF,\r\n h1 & 0xFF, (h1 >> 8) & 0xFF, (h1 >> 16) & 0xFF, (h1 >> 24) & 0xFF,\r\n h2 & 0xFF, (h2 >> 8) & 0xFF, (h2 >> 16) & 0xFF, (h2 >> 24) & 0xFF,\r\n h3 & 0xFF, (h3 >> 8) & 0xFF, (h3 >> 16) & 0xFF, (h3 >> 24) & 0xFF\r\n ];\r\n return res;\r\n };\r\n\r\n /**\r\n * @method array\r\n * @memberof Md5\r\n * @instance\r\n * @description Output hash as bytes array\r\n * @returns {Array} Bytes array\r\n * @see {@link md5.array}\r\n * @example\r\n * hash.array();\r\n */\r\n Md5.prototype.array = Md5.prototype.digest;\r\n\r\n /**\r\n * @method arrayBuffer\r\n * @memberof Md5\r\n * @instance\r\n * @description Output hash as ArrayBuffer\r\n * @returns {ArrayBuffer} ArrayBuffer\r\n * @see {@link md5.arrayBuffer}\r\n * @example\r\n * hash.arrayBuffer();\r\n */\r\n Md5.prototype.arrayBuffer = function () {\r\n this.finalize();\r\n\r\n var buffer = new ArrayBuffer(16);\r\n var blocks = new Uint32Array(buffer);\r\n blocks[0] = this.h0;\r\n blocks[1] = this.h1;\r\n blocks[2] = this.h2;\r\n blocks[3] = this.h3;\r\n return buffer;\r\n };\r\n\r\n /**\r\n * @method buffer\r\n * @deprecated This maybe confuse with Buffer in node.js. Please use arrayBuffer instead.\r\n * @memberof Md5\r\n * @instance\r\n * @description Output hash as ArrayBuffer\r\n * @returns {ArrayBuffer} ArrayBuffer\r\n * @see {@link md5.buffer}\r\n * @example\r\n * hash.buffer();\r\n */\r\n Md5.prototype.buffer = Md5.prototype.arrayBuffer;\r\n\r\n /**\r\n * @method base64\r\n * @memberof Md5\r\n * @instance\r\n * @description Output hash as base64 string\r\n * @returns {String} base64 string\r\n * @see {@link md5.base64}\r\n * @example\r\n * hash.base64();\r\n */\r\n Md5.prototype.base64 = function () {\r\n var v1, v2, v3, base64Str = '', bytes = this.array();\r\n for (var i = 0; i < 15;) {\r\n v1 = bytes[i++];\r\n v2 = bytes[i++];\r\n v3 = bytes[i++];\r\n base64Str += BASE64_ENCODE_CHAR[v1 >>> 2] +\r\n BASE64_ENCODE_CHAR[(v1 << 4 | v2 >>> 4) & 63] +\r\n BASE64_ENCODE_CHAR[(v2 << 2 | v3 >>> 6) & 63] +\r\n BASE64_ENCODE_CHAR[v3 & 63];\r\n }\r\n v1 = bytes[i];\r\n base64Str += BASE64_ENCODE_CHAR[v1 >>> 2] +\r\n BASE64_ENCODE_CHAR[(v1 << 4) & 63] +\r\n '==';\r\n return base64Str;\r\n };\r\n\r\n var exports = createMethod();\r\n\r\n if (COMMON_JS) {\r\n module.exports = exports;\r\n } else {\r\n /**\r\n * @method md5\b\r\n * @description Md5 hash function, export to global in browsers.\r\n * @param {String|Array|Uint8Array|ArrayBuffer} message message to hash\r\n * @returns {String} md5 hashes\r\n * @example\r\n * md5(''); // d41d8cd98f00b204e9800998ecf8427e\r\n * md5('The quick brown fox jumps over the lazy dog'); // 9e107d9d372bb6826bd81d3542a419d6\r\n * md5('The quick brown fox jumps over the lazy dog.'); // e4d909c290d0fb1ca068ffaddf22cbd0\r\n *\r\n * // It also supports UTF-8 encoding\r\n * md5('中文'); // a7bac2239fcdcb3a067903d8077c4a07\r\n *\r\n * // It also supports byte `Array`, `Uint8Array`, `ArrayBuffer`\r\n * md5([]); // d41d8cd98f00b204e9800998ecf8427e\r\n * md5(new Uint8Array([])); // d41d8cd98f00b204e9800998ecf8427e\r\n */\r\n root.md5 = exports;\r\n if (AMD) {\r\n define(function () {\r\n return exports;\r\n });\r\n }\r\n }\r\n})();\r\n","var REQUEST = require('../lib/request');\r\nvar util = require('./util');\r\n\r\n\r\n// Bucket 相关\r\n\r\n/**\r\n * 获取用户的 bucket 列表\r\n * @param {Object} params 回调函数,必须,下面为参数列表\r\n * 无特殊参数\r\n * @param {Function} callback 回调函数,必须\r\n */\r\nfunction getService(params, callback) {\r\n\r\n if (typeof params === 'function') {\r\n callback = params;\r\n params = {};\r\n }\r\n var protocol = this.options.Protocol || (util.isBrowser && location.protocol === 'http:' ? 'http:' : 'https:');\r\n var domain = this.options.ServiceDomain;\r\n var appId = params.AppId || this.options.appId;\r\n var region = params.Region;\r\n if (domain) {\r\n domain = domain.replace(/\\{\\{AppId\\}\\}/ig, appId || '')\r\n .replace(/\\{\\{Region\\}\\}/ig, region || '').replace(/\\{\\{.*?\\}\\}/ig, '');\r\n if (!/^[a-zA-Z]+:\\/\\//.test(domain)) {\r\n domain = protocol + '//' + domain;\r\n }\r\n if (domain.slice(-1) === '/') {\r\n domain = domain.slice(0, -1);\r\n }\r\n } else if (region) {\r\n domain = protocol + '//cos.' + region + '.myqcloud.com';\r\n } else {\r\n domain = protocol + '//service.cos.myqcloud.com';\r\n }\r\n\r\n submitRequest.call(this, {\r\n Action: 'name/cos:GetService',\r\n url: domain,\r\n method: 'GET',\r\n headers: params.Headers,\r\n }, function (err, data) {\r\n if (err) return callback(err);\r\n var buckets = (data && data.ListAllMyBucketsResult && data.ListAllMyBucketsResult.Buckets\r\n && data.ListAllMyBucketsResult.Buckets.Bucket) || [];\r\n buckets = util.isArray(buckets) ? buckets : [buckets];\r\n var owner = (data && data.ListAllMyBucketsResult && data.ListAllMyBucketsResult.Owner) || {};\r\n callback(null, {\r\n Buckets: buckets,\r\n Owner: owner,\r\n statusCode: data.statusCode,\r\n headers: data.headers,\r\n });\r\n });\r\n}\r\n\r\n/**\r\n * 创建 Bucket,并初始化访问权限\r\n * @param {Object} params 参数对象,必须\r\n * @param {String} params.Bucket Bucket名称,必须\r\n * @param {String} params.Region 地域名称,必须\r\n * @param {String} params.ACL 用户自定义文件权限,可以设置:private,public-read;默认值:private,非必须\r\n * @param {String} params.GrantRead 赋予被授权者读的权限,格式x-cos-grant-read: uin=\" \",uin=\" \",非必须\r\n * @param {String} params.GrantWrite 赋予被授权者写的权限,格式x-cos-grant-write: uin=\" \",uin=\" \",非必须\r\n * @param {String} params.GrantFullControl 赋予被授权者读写权限,格式x-cos-grant-full-control: uin=\" \",uin=\" \",非必须\r\n * @param {Function} callback 回调函数,必须\r\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730\r\n * @return {Object} data 返回的数据\r\n * @return {String} data.Location 操作地址\r\n */\r\nfunction putBucket(params, callback) {\r\n\r\n var self = this;\r\n\r\n var xml = '';\r\n if(params['BucketAZConfig']){\r\n var CreateBucketConfiguration = {\r\n BucketAZConfig: params.BucketAZConfig\r\n };\r\n xml = util.json2xml({CreateBucketConfiguration: CreateBucketConfiguration});\r\n }\r\n\r\n submitRequest.call(this, {\r\n Action: 'name/cos:PutBucket',\r\n method: 'PUT',\r\n Bucket: params.Bucket,\r\n Region: params.Region,\r\n headers: params.Headers,\r\n body: xml,\r\n }, function (err, data) {\r\n if (err) return callback(err);\r\n var url = getUrl({\r\n protocol: self.options.Protocol,\r\n domain: self.options.Domain,\r\n bucket: params.Bucket,\r\n region: params.Region,\r\n isLocation: true,\r\n });\r\n callback(null, {\r\n Location: url,\r\n statusCode: data.statusCode,\r\n headers: data.headers,\r\n });\r\n });\r\n}\r\n\r\n/**\r\n * 查看是否存在该Bucket,是否有权限访问\r\n * @param {Object} params 参数对象,必须\r\n * @param {String} params.Bucket Bucket名称,必须\r\n * @param {String} params.Region 地域名称,必须\r\n * @param {Function} callback 回调函数,必须\r\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730\r\n * @return {Object} data 返回的数据\r\n * @return {Boolean} data.BucketExist Bucket是否存在\r\n * @return {Boolean} data.BucketAuth 是否有 Bucket 的访问权限\r\n */\r\nfunction headBucket(params, callback) {\r\n submitRequest.call(this, {\r\n Action: 'name/cos:HeadBucket',\r\n Bucket: params.Bucket,\r\n Region: params.Region,\r\n headers: params.Headers,\r\n method: 'HEAD',\r\n }, callback);\r\n}\r\n\r\n/**\r\n * 获取 Bucket 下的 object 列表\r\n * @param {Object} params 参数对象,必须\r\n * @param {String} params.Bucket Bucket名称,必须\r\n * @param {String} params.Region 地域名称,必须\r\n * @param {String} params.Prefix 前缀匹配,用来规定返回的文件前缀地址,非必须\r\n * @param {String} params.Delimiter 定界符为一个符号,如果有Prefix,则将Prefix到delimiter之间的相同路径归为一类,非必须\r\n * @param {String} params.Marker 默认以UTF-8二进制顺序列出条目,所有列出条目从marker开始,非必须\r\n * @param {String} params.MaxKeys 单次返回最大的条目数量,默认1000,非必须\r\n * @param {String} params.EncodingType 规定返回值的编码方式,非必须\r\n * @param {Function} callback 回调函数,必须\r\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730\r\n * @return {Object} data 返回的数据\r\n * @return {Object} data.ListBucketResult 返回的 object 列表信息\r\n */\r\nfunction getBucket(params, callback) {\r\n var reqParams = {};\r\n reqParams['prefix'] = params['Prefix'] || '';\r\n reqParams['delimiter'] = params['Delimiter'];\r\n reqParams['marker'] = params['Marker'];\r\n reqParams['max-keys'] = params['MaxKeys'];\r\n reqParams['encoding-type'] = params['EncodingType'];\r\n\r\n submitRequest.call(this, {\r\n Action: 'name/cos:GetBucket',\r\n ResourceKey: reqParams['prefix'],\r\n method: 'GET',\r\n Bucket: params.Bucket,\r\n Region: params.Region,\r\n headers: params.Headers,\r\n qs: reqParams,\r\n }, function (err, data) {\r\n if (err) return callback(err);\r\n var ListBucketResult = data.ListBucketResult || {};\r\n var Contents = ListBucketResult.Contents || [];\r\n var CommonPrefixes = ListBucketResult.CommonPrefixes || [];\r\n\r\n Contents = util.isArray(Contents) ? Contents : [Contents];\r\n CommonPrefixes = util.isArray(CommonPrefixes) ? CommonPrefixes : [CommonPrefixes];\r\n\r\n var result = util.clone(ListBucketResult);\r\n util.extend(result, {\r\n Contents: Contents,\r\n CommonPrefixes: CommonPrefixes,\r\n statusCode: data.statusCode,\r\n headers: data.headers,\r\n });\r\n\r\n callback(null, result);\r\n });\r\n}\r\n\r\n/**\r\n * 删除 Bucket\r\n * @param {Object} params 参数对象,必须\r\n * @param {String} params.Bucket Bucket名称,必须\r\n * @param {String} params.Region 地域名称,必须\r\n * @param {Function} callback 回调函数,必须\r\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730\r\n * @return {Object} data 返回的数据\r\n * @return {String} data.Location 操作地址\r\n */\r\nfunction deleteBucket(params, callback) {\r\n submitRequest.call(this, {\r\n Action: 'name/cos:DeleteBucket',\r\n Bucket: params.Bucket,\r\n Region: params.Region,\r\n headers: params.Headers,\r\n method: 'DELETE',\r\n }, function (err, data) {\r\n if (err && err.statusCode === 204) {\r\n return callback(null, {statusCode: err.statusCode});\r\n } else if (err) {\r\n return callback(err);\r\n }\r\n callback(null, {\r\n statusCode: data.statusCode,\r\n headers: data.headers,\r\n });\r\n });\r\n}\r\n\r\n/**\r\n * 设置 Bucket 的 权限列表\r\n * @param {Object} params 参数对象,必须\r\n * @param {String} params.Bucket Bucket名称,必须\r\n * @param {String} params.Region 地域名称,必须\r\n * @param {String} params.ACL 用户自定义文件权限,可以设置:private,public-read;默认值:private,非必须\r\n * @param {String} params.GrantRead 赋予被授权者读的权限,格式x-cos-grant-read: uin=\" \",uin=\" \",非必须\r\n * @param {String} params.GrantWrite 赋予被授权者写的权限,格式x-cos-grant-write: uin=\" \",uin=\" \",非必须\r\n * @param {String} params.GrantFullControl 赋予被授权者读写权限,格式x-cos-grant-full-control: uin=\" \",uin=\" \",非必须\r\n * @param {Function} callback 回调函数,必须\r\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730\r\n * @return {Object} data 返回的数据\r\n */\r\nfunction putBucketAcl(params, callback) {\r\n var headers = params.Headers;\r\n\r\n var xml = '';\r\n if (params['AccessControlPolicy']) {\r\n var AccessControlPolicy = util.clone(params['AccessControlPolicy'] || {});\r\n var Grants = AccessControlPolicy.Grants || AccessControlPolicy.Grant;\r\n Grants = util.isArray(Grants) ? Grants : [Grants];\r\n delete AccessControlPolicy.Grant;\r\n delete AccessControlPolicy.Grants;\r\n AccessControlPolicy.AccessControlList = {Grant: Grants};\r\n xml = util.json2xml({AccessControlPolicy: AccessControlPolicy});\r\n\r\n headers['Content-Type'] = 'application/xml';\r\n headers['Content-MD5'] = util.binaryBase64(util.md5(xml));\r\n }\r\n\r\n // Grant Header 去重\r\n util.each(headers, function (val, key) {\r\n if (key.indexOf('x-cos-grant-') === 0) {\r\n headers[key] = uniqGrant(headers[key]);\r\n }\r\n });\r\n\r\n submitRequest.call(this, {\r\n Action: 'name/cos:PutBucketACL',\r\n method: 'PUT',\r\n Bucket: params.Bucket,\r\n Region: params.Region,\r\n headers: headers,\r\n action: 'acl',\r\n body: xml,\r\n }, function (err, data) {\r\n if (err) return callback(err);\r\n callback(null, {\r\n statusCode: data.statusCode,\r\n headers: data.headers,\r\n });\r\n });\r\n}\r\n\r\n/**\r\n * 获取 Bucket 的 权限列表\r\n * @param {Object} params 参数对象,必须\r\n * @param {String} params.Bucket Bucket名称,必须\r\n * @param {String} params.Region 地域名称,必须\r\n * @param {Function} callback 回调函数,必须\r\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730\r\n * @return {Object} data 返回的数据\r\n * @return {Object} data.AccessControlPolicy 访问权限信息\r\n */\r\nfunction getBucketAcl(params, callback) {\r\n\r\n submitRequest.call(this, {\r\n Action: 'name/cos:GetBucketACL',\r\n method: 'GET',\r\n Bucket: params.Bucket,\r\n Region: params.Region,\r\n headers: params.Headers,\r\n action: 'acl',\r\n }, function (err, data) {\r\n if (err) return callback(err);\r\n var AccessControlPolicy = data.AccessControlPolicy || {};\r\n var Owner = AccessControlPolicy.Owner || {};\r\n var Grant = AccessControlPolicy.AccessControlList.Grant || [];\r\n Grant = util.isArray(Grant) ? Grant : [Grant];\r\n var result = decodeAcl(AccessControlPolicy);\r\n if (data.headers && data.headers['x-cos-acl']) {\r\n result.ACL = data.headers['x-cos-acl'];\r\n }\r\n result = util.extend(result, {\r\n Owner: Owner,\r\n Grants: Grant,\r\n statusCode: data.statusCode,\r\n headers: data.headers,\r\n });\r\n callback(null, result);\r\n });\r\n}\r\n\r\n/**\r\n * 设置 Bucket 的 跨域设置\r\n * @param {Object} params 参数对象,必须\r\n * @param {String} params.Bucket Bucket名称,必须\r\n * @param {String} params.Region 地域名称,必须\r\n * @param {Object} params.CORSConfiguration 相关的跨域设置,必须\r\n * @param {Array} params.CORSConfiguration.CORSRules 对应的跨域规则\r\n * @param {Function} callback 回调函数,必须\r\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730\r\n * @return {Object} data 返回的数据\r\n */\r\nfunction putBucketCors(params, callback) {\r\n\r\n var CORSConfiguration = params['CORSConfiguration'] || {};\r\n var CORSRules = CORSConfiguration['CORSRules'] || params['CORSRules'] || [];\r\n CORSRules = util.clone(util.isArray(CORSRules) ? CORSRules : [CORSRules]);\r\n util.each(CORSRules, function (rule) {\r\n util.each(['AllowedOrigin', 'AllowedHeader', 'AllowedMethod', 'ExposeHeader'], function (key) {\r\n var sKey = key + 's';\r\n var val = rule[sKey] || rule[key] || [];\r\n delete rule[sKey];\r\n rule[key] = util.isArray(val) ? val : [val];\r\n });\r\n });\r\n\r\n var xml = util.json2xml({CORSConfiguration: {CORSRule: CORSRules}});\r\n\r\n var headers = params.Headers;\r\n headers['Content-Type'] = 'application/xml';\r\n headers['Content-MD5'] = util.binaryBase64(util.md5(xml));\r\n\r\n submitRequest.call(this, {\r\n Action: 'name/cos:PutBucketCORS',\r\n method: 'PUT',\r\n Bucket: params.Bucket,\r\n Region: params.Region,\r\n body: xml,\r\n action: 'cors',\r\n headers: headers,\r\n }, function (err, data) {\r\n if (err) return callback(err);\r\n callback(null, {\r\n statusCode: data.statusCode,\r\n headers: data.headers,\r\n });\r\n });\r\n}\r\n\r\n/**\r\n * 获取 Bucket 的 跨域设置\r\n * @param {Object} params 参数对象,必须\r\n * @param {String} params.Bucket Bucket名称,必须\r\n * @param {String} params.Region 地域名称,必须\r\n * @param {Function} callback 回调函数,必须\r\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730\r\n * @return {Object} data 返回的数据\r\n * @return {Object} data.CORSRules Bucket的跨域设置\r\n */\r\nfunction getBucketCors(params, callback) {\r\n submitRequest.call(this, {\r\n Action: 'name/cos:GetBucketCORS',\r\n method: 'GET',\r\n Bucket: params.Bucket,\r\n Region: params.Region,\r\n headers: params.Headers,\r\n action: 'cors',\r\n }, function (err, data) {\r\n if (err) {\r\n if (err.statusCode === 404 && err.error && err.error.Code === 'NoSuchCORSConfiguration') {\r\n var result = {\r\n CORSRules: [],\r\n statusCode: err.statusCode,\r\n };\r\n err.headers && (result.headers = err.headers);\r\n callback(null, result);\r\n } else {\r\n callback(err);\r\n }\r\n return;\r\n }\r\n var CORSConfiguration = data.CORSConfiguration || {};\r\n var CORSRules = CORSConfiguration.CORSRules || CORSConfiguration.CORSRule || [];\r\n CORSRules = util.clone(util.isArray(CORSRules) ? CORSRules : [CORSRules]);\r\n\r\n util.each(CORSRules, function (rule) {\r\n util.each(['AllowedOrigin', 'AllowedHeader', 'AllowedMethod', 'ExposeHeader'], function (key) {\r\n var sKey = key + 's';\r\n var val = rule[sKey] || rule[key] || [];\r\n delete rule[key];\r\n rule[sKey] = util.isArray(val) ? val : [val];\r\n });\r\n });\r\n\r\n callback(null, {\r\n CORSRules: CORSRules,\r\n statusCode: data.statusCode,\r\n headers: data.headers,\r\n });\r\n });\r\n}\r\n\r\n/**\r\n * 删除 Bucket 的 跨域设置\r\n * @param {Object} params 参数对象,必须\r\n * @param {String} params.Bucket Bucket名称,必须\r\n * @param {String} params.Region 地域名称,必须\r\n * @param {Function} callback 回调函数,必须\r\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730\r\n * @return {Object} data 返回的数据\r\n */\r\nfunction deleteBucketCors(params, callback) {\r\n submitRequest.call(this, {\r\n Action: 'name/cos:DeleteBucketCORS',\r\n method: 'DELETE',\r\n Bucket: params.Bucket,\r\n Region: params.Region,\r\n headers: params.Headers,\r\n action: 'cors',\r\n }, function (err, data) {\r\n if (err && err.statusCode === 204) {\r\n return callback(null, {statusCode: err.statusCode});\r\n } else if (err) {\r\n return callback(err);\r\n }\r\n callback(null, {\r\n statusCode: data.statusCode || err.statusCode,\r\n headers: data.headers,\r\n });\r\n });\r\n}\r\n\r\n/**\r\n * 获取 Bucket 的 地域信息\r\n * @param {Object} params 参数对象,必须\r\n * @param {String} params.Bucket Bucket名称,必须\r\n * @param {String} params.Region 地域名称,必须\r\n * @param {Function} callback 回调函数,必须\r\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730\r\n * @return {Object} data 返回数据,包含地域信息 LocationConstraint\r\n */\r\nfunction getBucketLocation(params, callback) {\r\n submitRequest.call(this, {\r\n Action: 'name/cos:GetBucketLocation',\r\n method: 'GET',\r\n Bucket: params.Bucket,\r\n Region: params.Region,\r\n headers: params.Headers,\r\n action: 'location',\r\n }, callback);\r\n}\r\n\r\nfunction putBucketPolicy(params, callback) {\r\n var Policy = params['Policy'];\r\n try {\r\n if (typeof Policy === 'string') Policy = JSON.parse(Policy);\r\n } catch (e) {\r\n }\r\n if (!Policy || typeof Policy === 'string') return callback(util.error(new Error('Policy format error')));\r\n var PolicyStr = JSON.stringify(Policy);\r\n if (!Policy.version) Policy.version = '2.0';\r\n\r\n var headers = params.Headers;\r\n headers['Content-Type'] = 'application/json';\r\n headers['Content-MD5'] = util.binaryBase64(util.md5(PolicyStr));\r\n\r\n submitRequest.call(this, {\r\n Action: 'name/cos:PutBucketPolicy',\r\n method: 'PUT',\r\n Bucket: params.Bucket,\r\n Region: params.Region,\r\n action: 'policy',\r\n body: PolicyStr,\r\n headers: headers,\r\n }, function (err, data) {\r\n if (err && err.statusCode === 204) {\r\n return callback(null, {statusCode: err.statusCode});\r\n } else if (err) {\r\n return callback(err);\r\n }\r\n callback(null, {\r\n statusCode: data.statusCode,\r\n headers: data.headers,\r\n });\r\n });\r\n}\r\n\r\n/**\r\n * 获取 Bucket 的读取权限策略\r\n * @param {Object} params 参数对象,必须\r\n * @param {String} params.Bucket Bucket名称,必须\r\n * @param {String} params.Region 地域名称,必须\r\n * @param {Function} callback 回调函数,必须\r\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730\r\n * @return {Object} data 返回数据\r\n */\r\nfunction getBucketPolicy(params, callback) {\r\n submitRequest.call(this, {\r\n Action: 'name/cos:GetBucketPolicy',\r\n method: 'GET',\r\n Bucket: params.Bucket,\r\n Region: params.Region,\r\n headers: params.Headers,\r\n action: 'policy',\r\n rawBody: true,\r\n }, function (err, data) {\r\n if (err) {\r\n if (err.statusCode && err.statusCode === 403) {\r\n return callback(util.error(err, {ErrorStatus: 'Access Denied'}));\r\n }\r\n if (err.statusCode && err.statusCode === 405) {\r\n return callback(util.error(err, {ErrorStatus: 'Method Not Allowed'}));\r\n }\r\n if (err.statusCode && err.statusCode === 404) {\r\n return callback(util.error(err, {ErrorStatus: 'Policy Not Found'}));\r\n }\r\n return callback(err);\r\n }\r\n var Policy = {};\r\n try {\r\n Policy = JSON.parse(data.body);\r\n } catch (e) {\r\n }\r\n callback(null, {\r\n Policy: Policy,\r\n statusCode: data.statusCode,\r\n headers: data.headers,\r\n });\r\n });\r\n}\r\n\r\n/**\r\n * 删除 Bucket 的 跨域设置\r\n * @param {Object} params 参数对象,必须\r\n * @param {String} params.Bucket Bucket名称,必须\r\n * @param {String} params.Region 地域名称,必须\r\n * @param {Function} callback 回调函数,必须\r\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730\r\n * @return {Object} data 返回的数据\r\n */\r\nfunction deleteBucketPolicy(params, callback) {\r\n submitRequest.call(this, {\r\n Action: 'name/cos:DeleteBucketPolicy',\r\n method: 'DELETE',\r\n Bucket: params.Bucket,\r\n Region: params.Region,\r\n headers: params.Headers,\r\n action: 'policy',\r\n }, function (err, data) {\r\n if (err && err.statusCode === 204) {\r\n return callback(null, {statusCode: err.statusCode});\r\n } else if (err) {\r\n return callback(err);\r\n }\r\n callback(null, {\r\n statusCode: data.statusCode || err.statusCode,\r\n headers: data.headers,\r\n });\r\n });\r\n}\r\n\r\n/**\r\n * 设置 Bucket 的标签\r\n * @param {Object} params 参数对象,必须\r\n * @param {String} params.Bucket Bucket名称,必须\r\n * @param {String} params.Region 地域名称,必须\r\n * @param {Array} params.TagSet 标签设置,必须\r\n * @param {Function} callback 回调函数,必须\r\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730\r\n * @return {Object} data 返回数据\r\n */\r\nfunction putBucketTagging(params, callback) {\r\n\r\n var Tagging = params['Tagging'] || {};\r\n var Tags = Tagging.TagSet || Tagging.Tags || params['Tags'] || [];\r\n Tags = util.clone(util.isArray(Tags) ? Tags : [Tags]);\r\n var xml = util.json2xml({Tagging: {TagSet: {Tag: Tags}}});\r\n\r\n var headers = params.Headers;\r\n headers['Content-Type'] = 'application/xml';\r\n headers['Content-MD5'] = util.binaryBase64(util.md5(xml));\r\n\r\n submitRequest.call(this, {\r\n Action: 'name/cos:PutBucketTagging',\r\n method: 'PUT',\r\n Bucket: params.Bucket,\r\n Region: params.Region,\r\n body: xml,\r\n action: 'tagging',\r\n headers: headers,\r\n }, function (err, data) {\r\n if (err && err.statusCode === 204) {\r\n return callback(null, {statusCode: err.statusCode});\r\n } else if (err) {\r\n return callback(err);\r\n }\r\n callback(null, {\r\n statusCode: data.statusCode,\r\n headers: data.headers,\r\n });\r\n });\r\n}\r\n\r\n/**\r\n * 获取 Bucket 的标签设置\r\n * @param {Object} params 参数对象,必须\r\n * @param {String} params.Bucket Bucket名称,必须\r\n * @param {String} params.Region 地域名称,必须\r\n * @param {Function} callback 回调函数,必须\r\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730\r\n * @return {Object} data 返回数据\r\n */\r\nfunction getBucketTagging(params, callback) {\r\n\r\n submitRequest.call(this, {\r\n Action: 'name/cos:GetBucketTagging',\r\n method: 'GET',\r\n Bucket: params.Bucket,\r\n Region: params.Region,\r\n headers: params.Headers,\r\n action: 'tagging',\r\n }, function (err, data) {\r\n if (err) {\r\n if (err.statusCode === 404 && err.error && (err.error === \"Not Found\" || err.error.Code === 'NoSuchTagSet')) {\r\n var result = {\r\n Tags: [],\r\n statusCode: err.statusCode,\r\n };\r\n err.headers && (result.headers = err.headers);\r\n callback(null, result);\r\n } else {\r\n callback(err);\r\n }\r\n return;\r\n }\r\n var Tags = [];\r\n try {\r\n Tags = data.Tagging.TagSet.Tag || [];\r\n } catch (e) {\r\n }\r\n Tags = util.clone(util.isArray(Tags) ? Tags : [Tags]);\r\n callback(null, {\r\n Tags: Tags,\r\n statusCode: data.statusCode,\r\n headers: data.headers,\r\n });\r\n });\r\n}\r\n\r\n/**\r\n * 删除 Bucket 的 标签设置\r\n * @param {Object} params 参数对象,必须\r\n * @param {String} params.Bucket Bucket名称,必须\r\n * @param {String} params.Region 地域名称,必须\r\n * @param {Function} callback 回调函数,必须\r\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730\r\n * @return {Object} data 返回的数据\r\n */\r\nfunction deleteBucketTagging(params, callback) {\r\n submitRequest.call(this, {\r\n Action: 'name/cos:DeleteBucketTagging',\r\n method: 'DELETE',\r\n Bucket: params.Bucket,\r\n Region: params.Region,\r\n headers: params.Headers,\r\n action: 'tagging',\r\n }, function (err, data) {\r\n if (err && err.statusCode === 204) {\r\n return callback(null, {statusCode: err.statusCode});\r\n } else if (err) {\r\n return callback(err);\r\n }\r\n callback(null, {\r\n statusCode: data.statusCode,\r\n headers: data.headers,\r\n });\r\n });\r\n}\r\n\r\nfunction putBucketLifecycle(params, callback) {\r\n\r\n var LifecycleConfiguration = params['LifecycleConfiguration'] || {};\r\n var Rules = LifecycleConfiguration.Rules || params.Rules || [];\r\n Rules = util.clone(Rules);\r\n var xml = util.json2xml({LifecycleConfiguration: {Rule: Rules}});\r\n\r\n var headers = params.Headers;\r\n headers['Content-Type'] = 'application/xml';\r\n headers['Content-MD5'] = util.binaryBase64(util.md5(xml));\r\n\r\n submitRequest.call(this, {\r\n Action: 'name/cos:PutBucketLifecycle',\r\n method: 'PUT',\r\n Bucket: params.Bucket,\r\n Region: params.Region,\r\n body: xml,\r\n action: 'lifecycle',\r\n headers: headers,\r\n }, function (err, data) {\r\n if (err && err.statusCode === 204) {\r\n return callback(null, {statusCode: err.statusCode});\r\n } else if (err) {\r\n return callback(err);\r\n }\r\n callback(null, {\r\n statusCode: data.statusCode,\r\n headers: data.headers,\r\n });\r\n });\r\n}\r\n\r\nfunction getBucketLifecycle(params, callback) {\r\n submitRequest.call(this, {\r\n Action: 'name/cos:GetBucketLifecycle',\r\n method: 'GET',\r\n Bucket: params.Bucket,\r\n Region: params.Region,\r\n headers: params.Headers,\r\n action: 'lifecycle',\r\n }, function (err, data) {\r\n if (err) {\r\n if (err.statusCode === 404 && err.error && err.error.Code === 'NoSuchLifecycleConfiguration') {\r\n var result = {\r\n Rules: [],\r\n statusCode: err.statusCode,\r\n };\r\n err.headers && (result.headers = err.headers);\r\n callback(null, result);\r\n } else {\r\n callback(err);\r\n }\r\n return;\r\n }\r\n var Rules = [];\r\n try {\r\n Rules = data.LifecycleConfiguration.Rule || [];\r\n } catch (e) {\r\n }\r\n Rules = util.clone(util.isArray(Rules) ? Rules : [Rules]);\r\n callback(null, {\r\n Rules: Rules,\r\n statusCode: data.statusCode,\r\n headers: data.headers,\r\n });\r\n });\r\n}\r\n\r\nfunction deleteBucketLifecycle(params, callback) {\r\n submitRequest.call(this, {\r\n Action: 'name/cos:DeleteBucketLifecycle',\r\n method: 'DELETE',\r\n Bucket: params.Bucket,\r\n Region: params.Region,\r\n headers: params.Headers,\r\n action: 'lifecycle',\r\n }, function (err, data) {\r\n if (err && err.statusCode === 204) {\r\n return callback(null, {statusCode: err.statusCode});\r\n } else if (err) {\r\n return callback(err);\r\n }\r\n callback(null, {\r\n statusCode: data.statusCode,\r\n headers: data.headers,\r\n });\r\n });\r\n}\r\n\r\nfunction putBucketVersioning(params, callback) {\r\n\r\n if (!params['VersioningConfiguration']) {\r\n callback(util.error(new Error('missing param VersioningConfiguration')));\r\n return;\r\n }\r\n var VersioningConfiguration = params['VersioningConfiguration'] || {};\r\n var xml = util.json2xml({VersioningConfiguration: VersioningConfiguration});\r\n\r\n var headers = params.Headers;\r\n headers['Content-Type'] = 'application/xml';\r\n headers['Content-MD5'] = util.binaryBase64(util.md5(xml));\r\n\r\n submitRequest.call(this, {\r\n Action: 'name/cos:PutBucketVersioning',\r\n method: 'PUT',\r\n Bucket: params.Bucket,\r\n Region: params.Region,\r\n body: xml,\r\n action: 'versioning',\r\n headers: headers,\r\n }, function (err, data) {\r\n if (err && err.statusCode === 204) {\r\n return callback(null, {statusCode: err.statusCode});\r\n } else if (err) {\r\n return callback(err);\r\n }\r\n callback(null, {\r\n statusCode: data.statusCode,\r\n headers: data.headers,\r\n });\r\n });\r\n}\r\n\r\nfunction getBucketVersioning(params, callback) {\r\n submitRequest.call(this, {\r\n Action: 'name/cos:GetBucketVersioning',\r\n method: 'GET',\r\n Bucket: params.Bucket,\r\n Region: params.Region,\r\n headers: params.Headers,\r\n action: 'versioning',\r\n }, function (err, data) {\r\n if (!err) {\r\n !data.VersioningConfiguration && (data.VersioningConfiguration = {});\r\n }\r\n callback(err, data);\r\n });\r\n}\r\n\r\nfunction putBucketReplication(params, callback) {\r\n var ReplicationConfiguration = util.clone(params.ReplicationConfiguration);\r\n var xml = util.json2xml({ReplicationConfiguration: ReplicationConfiguration});\r\n xml = xml.replace(/<(\\/?)Rules>/ig, '<$1Rule>');\r\n xml = xml.replace(/<(\\/?)Tags>/ig, '<$1Tag>');\r\n\r\n var headers = params.Headers;\r\n headers['Content-Type'] = 'application/xml';\r\n headers['Content-MD5'] = util.binaryBase64(util.md5(xml));\r\n\r\n submitRequest.call(this, {\r\n Action: 'name/cos:PutBucketReplication',\r\n method: 'PUT',\r\n Bucket: params.Bucket,\r\n Region: params.Region,\r\n body: xml,\r\n action: 'replication',\r\n headers: headers,\r\n }, function (err, data) {\r\n if (err && err.statusCode === 204) {\r\n return callback(null, {statusCode: err.statusCode});\r\n } else if (err) {\r\n return callback(err);\r\n }\r\n callback(null, {\r\n statusCode: data.statusCode,\r\n headers: data.headers,\r\n });\r\n });\r\n}\r\n\r\nfunction getBucketReplication(params, callback) {\r\n submitRequest.call(this, {\r\n Action: 'name/cos:GetBucketReplication',\r\n method: 'GET',\r\n Bucket: params.Bucket,\r\n Region: params.Region,\r\n headers: params.Headers,\r\n action: 'replication',\r\n }, function (err, data) {\r\n if (err) {\r\n if (err.statusCode === 404 && err.error && (err.error === 'Not Found' || err.error.Code === 'ReplicationConfigurationnotFoundError')) {\r\n var result = {\r\n ReplicationConfiguration: {Rules: []},\r\n statusCode: err.statusCode,\r\n };\r\n err.headers && (result.headers = err.headers);\r\n callback(null, result);\r\n } else {\r\n callback(err);\r\n }\r\n return;\r\n }\r\n !data.ReplicationConfiguration && (data.ReplicationConfiguration = {});\r\n if (data.ReplicationConfiguration.Rule) {\r\n data.ReplicationConfiguration.Rules = util.makeArray(data.ReplicationConfiguration.Rule);\r\n delete data.ReplicationConfiguration.Rule;\r\n }\r\n callback(err, data);\r\n });\r\n}\r\n\r\nfunction deleteBucketReplication(params, callback) {\r\n submitRequest.call(this, {\r\n Action: 'name/cos:DeleteBucketReplication',\r\n method: 'DELETE',\r\n Bucket: params.Bucket,\r\n Region: params.Region,\r\n headers: params.Headers,\r\n action: 'replication',\r\n }, function (err, data) {\r\n if (err && err.statusCode === 204) {\r\n return callback(null, {statusCode: err.statusCode});\r\n } else if (err) {\r\n return callback(err);\r\n }\r\n callback(null, {\r\n statusCode: data.statusCode,\r\n headers: data.headers,\r\n });\r\n });\r\n}\r\n\r\n/**\r\n * 设置 Bucket 静态网站配置信息\r\n * @param {Object} params 参数对象,必须\r\n * @param {String} params.Bucket Bucket名称,必须\r\n * @param {String} params.Region 地域名称,必须\r\n * @param {Object} params.WebsiteConfiguration 地域名称,必须\r\n * @param {Object} WebsiteConfiguration.IndexDocument 索引文档,必须\r\n * @param {Object} WebsiteConfiguration.ErrorDocument 错误文档,非必须\r\n * @param {Object} WebsiteConfiguration.RedirectAllRequestsTo 重定向所有请求,非必须\r\n * @param {Array} params.RoutingRules 重定向规则,非必须\r\n * @param {Function} callback 回调函数,必须\r\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730\r\n * @return {Object} data 返回数据\r\n */\r\nfunction putBucketWebsite(params, callback) {\r\n\r\n if (!params['WebsiteConfiguration']) {\r\n callback(util.error(new Error('missing param WebsiteConfiguration')));\r\n return;\r\n }\r\n\r\n var WebsiteConfiguration = util.clone(params['WebsiteConfiguration'] || {});\r\n var RoutingRules = WebsiteConfiguration['RoutingRules'] || WebsiteConfiguration['RoutingRule'] || [];\r\n RoutingRules = util.isArray(RoutingRules) ? RoutingRules : [RoutingRules];\r\n delete WebsiteConfiguration.RoutingRule;\r\n delete WebsiteConfiguration.RoutingRules;\r\n if (RoutingRules.length) WebsiteConfiguration.RoutingRules = { RoutingRule: RoutingRules };\r\n var xml = util.json2xml({ WebsiteConfiguration: WebsiteConfiguration });\r\n\r\n var headers = params.Headers;\r\n headers['Content-Type'] = 'application/xml';\r\n headers['Content-MD5'] = util.binaryBase64(util.md5(xml));\r\n\r\n submitRequest.call(this, {\r\n Action: 'name/cos:PutBucketWebsite',\r\n method: 'PUT',\r\n Bucket: params.Bucket,\r\n Region: params.Region,\r\n body: xml,\r\n action: 'website',\r\n headers: headers,\r\n }, function (err, data) {\r\n if (err && err.statusCode === 204) {\r\n return callback(null, {statusCode: err.statusCode});\r\n } else if (err) {\r\n return callback(err);\r\n }\r\n callback(null, {\r\n statusCode: data.statusCode,\r\n headers: data.headers,\r\n });\r\n });\r\n}\r\n\r\n/**\r\n * 获取 Bucket 的静态网站配置信息\r\n * @param {Object} params 参数对象,必须\r\n * @param {String} params.Bucket Bucket名称,必须\r\n * @param {String} params.Region 地域名称,必须\r\n * @param {Function} callback 回调函数,必须\r\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730\r\n * @return {Object} data 返回数据\r\n */\r\nfunction getBucketWebsite(params, callback) {\r\n\r\n submitRequest.call(this, {\r\n Action: 'name/cos:GetBucketWebsite',\r\n method: 'GET',\r\n Bucket: params.Bucket,\r\n Region: params.Region,\r\n Key: params.Key,\r\n headers: params.Headers,\r\n action: 'website',\r\n }, function (err, data) {\r\n if (err) {\r\n if(err.statusCode === 404 && err.error.Code === 'NoSuchWebsiteConfiguration'){\r\n var result = {\r\n WebsiteConfiguration: {},\r\n statusCode: err.statusCode,\r\n };\r\n err.headers && (result.headers = err.headers);\r\n callback(null, result);\r\n } else {\r\n callback(err);\r\n }\r\n return;\r\n }\r\n\r\n var WebsiteConfiguration = data.WebsiteConfiguration || {};\r\n if (WebsiteConfiguration['RoutingRules']) {\r\n var RoutingRules = util.clone(WebsiteConfiguration['RoutingRules'].RoutingRule || []);\r\n RoutingRules = util.makeArray(RoutingRules);\r\n WebsiteConfiguration.RoutingRules = RoutingRules;\r\n }\r\n\r\n callback(null, {\r\n WebsiteConfiguration: WebsiteConfiguration,\r\n statusCode: data.statusCode,\r\n headers: data.headers,\r\n });\r\n });\r\n}\r\n\r\n/**\r\n * 删除 Bucket 的静态网站配置\r\n * @param {Object} params 参数对象,必须\r\n * @param {String} params.Bucket Bucket名称,必须\r\n * @param {String} params.Region 地域名称,必须\r\n * @param {Function} callback 回调函数,必须\r\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730\r\n * @return {Object} data 返回数据\r\n */\r\nfunction deleteBucketWebsite(params, callback) {\r\n\r\n submitRequest.call(this, {\r\n Action: 'name/cos:DeleteBucketWebsite',\r\n method: 'DELETE',\r\n Bucket: params.Bucket,\r\n Region: params.Region,\r\n headers: params.Headers,\r\n action: 'website',\r\n }, function (err, data) {\r\n if (err && err.statusCode === 204) {\r\n return callback(null, {statusCode: err.statusCode});\r\n } else if (err) {\r\n return callback(err);\r\n }\r\n callback(null, {\r\n statusCode: data.statusCode,\r\n headers: data.headers,\r\n });\r\n });\r\n}\r\n\r\n/**\r\n * 设置 Bucket 的防盗链白名单或者黑名单\r\n * @param {Object} params 参数对象,必须\r\n * @param {String} params.Bucket Bucket名称,必须\r\n * @param {String} params.Region 地域名称,必须\r\n * @param {Object} params.RefererConfiguration 地域名称,必须\r\n * @param {String} RefererConfiguration.Status 是否开启防盗链,枚举值:Enabled、Disabled\r\n * @param {String} RefererConfiguration.RefererType 防盗链类型,枚举值:Black-List、White-List,必须\r\n * @param {Array} RefererConfiguration.DomianList.Domain 生效域名,必须\r\n * @param {String} RefererConfiguration.EmptyReferConfiguration ,非必须\r\n * @param {Function} callback 回调函数,必须\r\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730\r\n * @return {Object} data 返回数据\r\n */\r\nfunction putBucketReferer(params, callback) {\r\n\r\n if (!params['RefererConfiguration']) {\r\n callback(util.error(new Error('missing param RefererConfiguration')));\r\n return;\r\n }\r\n\r\n var RefererConfiguration = util.clone(params['RefererConfiguration'] || {});\r\n var DomainList = RefererConfiguration['DomainList'] || {};\r\n var Domains = DomainList['Domains'] || DomainList['Domain'] || [];\r\n Domains = util.isArray(Domains) ? Domains : [Domains];\r\n if (Domains.length) RefererConfiguration.DomainList = {Domain: Domains};\r\n var xml = util.json2xml({ RefererConfiguration: RefererConfiguration });\r\n\r\n var headers = params.Headers;\r\n headers['Content-Type'] = 'application/xml';\r\n headers['Content-MD5'] = util.binaryBase64(util.md5(xml));\r\n\r\n submitRequest.call(this, {\r\n Action: 'name/cos:PutBucketReferer',\r\n method: 'PUT',\r\n Bucket: params.Bucket,\r\n Region: params.Region,\r\n body: xml,\r\n action: 'referer',\r\n headers: headers,\r\n }, function (err, data) {\r\n if (err && err.statusCode === 204) {\r\n return callback(null, {statusCode: err.statusCode});\r\n } else if (err) {\r\n return callback(err);\r\n }\r\n callback(null, {\r\n statusCode: data.statusCode,\r\n headers: data.headers,\r\n });\r\n });\r\n}\r\n\r\n/**\r\n * 获取 Bucket 的防盗链白名单或者黑名单\r\n * @param {Object} params 参数对象,必须\r\n * @param {String} params.Bucket Bucket名称,必须\r\n * @param {String} params.Region 地域名称,必须\r\n * @param {Function} callback 回调函数,必须\r\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730\r\n * @return {Object} data 返回数据\r\n */\r\nfunction getBucketReferer(params, callback) {\r\n\r\n submitRequest.call(this, {\r\n Action: 'name/cos:GetBucketReferer',\r\n method: 'GET',\r\n Bucket: params.Bucket,\r\n Region: params.Region,\r\n Key: params.Key,\r\n headers: params.Headers,\r\n action: 'referer',\r\n }, function (err, data) {\r\n if (err) {\r\n if(err.statusCode === 404 && err.error.Code === 'NoSuchRefererConfiguration'){\r\n var result = {\r\n WebsiteConfiguration: {},\r\n statusCode: err.statusCode,\r\n };\r\n err.headers && (result.headers = err.headers);\r\n callback(null, result);\r\n } else {\r\n callback(err);\r\n }\r\n return;\r\n }\r\n\r\n var RefererConfiguration = data.RefererConfiguration || {};\r\n if (RefererConfiguration['DomainList']) {\r\n var Domains = util.clone(RefererConfiguration['DomainList'].Domain || []);\r\n Domains = util.makeArray(Domains);\r\n RefererConfiguration.DomainList = {Domains: Domains};\r\n }\r\n\r\n callback(null, {\r\n RefererConfiguration: RefererConfiguration,\r\n statusCode: data.statusCode,\r\n headers: data.headers,\r\n });\r\n });\r\n}\r\n\r\n/**\r\n * 设置 Bucket 自定义域名\r\n * @param {Object} params 参数对象,必须\r\n * @param {String} params.Bucket Bucket名称,必须\r\n * @param {String} params.Region 地域名称,必须\r\n * @param {Function} callback 回调函数,必须\r\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730\r\n * @return {Object} data 返回数据\r\n */\r\nfunction putBucketDomain(params, callback) {\r\n\r\n var DomainConfiguration = params['DomainConfiguration'] || {};\r\n var DomainRule = DomainConfiguration.DomainRule || params.DomainRule || [];\r\n DomainRule = util.clone(DomainRule);\r\n var xml = util.json2xml({DomainConfiguration: {DomainRule: DomainRule}});\r\n\r\n var headers = params.Headers;\r\n headers['Content-Type'] = 'application/xml';\r\n headers['Content-MD5'] = util.binaryBase64(util.md5(xml));\r\n\r\n submitRequest.call(this, {\r\n Action: 'name/cos:PutBucketDomain',\r\n method: 'PUT',\r\n Bucket: params.Bucket,\r\n Region: params.Region,\r\n body: xml,\r\n action: 'domain',\r\n headers: headers,\r\n }, function (err, data) {\r\n if (err && err.statusCode === 204) {\r\n return callback(null, {statusCode: err.statusCode});\r\n } else if (err) {\r\n return callback(err);\r\n }\r\n callback(null, {\r\n statusCode: data.statusCode,\r\n headers: data.headers,\r\n });\r\n });\r\n}\r\n\r\n/**\r\n * 获取 Bucket 的自定义域名\r\n * @param {Object} params 参数对象,必须\r\n * @param {String} params.Bucket Bucket名称,必须\r\n * @param {String} params.Region 地域名称,必须\r\n * @param {Function} callback 回调函数,必须\r\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730\r\n * @return {Object} data 返回数据\r\n */\r\nfunction getBucketDomain(params, callback) {\r\n\r\n submitRequest.call(this, {\r\n Action: 'name/cos:GetBucketDomain',\r\n method: 'GET',\r\n Bucket: params.Bucket,\r\n Region: params.Region,\r\n headers: params.Headers,\r\n action: 'domain',\r\n }, function (err, data) {\r\n if (err) return callback(err);\r\n\r\n var DomainRule = [];\r\n try {\r\n DomainRule = data.DomainConfiguration.DomainRule || [];\r\n } catch (e) {\r\n }\r\n DomainRule = util.clone(util.isArray(DomainRule) ? DomainRule : [DomainRule]);\r\n callback(null, {\r\n DomainRule: DomainRule,\r\n statusCode: data.statusCode,\r\n headers: data.headers,\r\n });\r\n });\r\n}\r\n\r\n/**\r\n * 删除 Bucket 自定义域名\r\n * @param {Object} params 参数对象,必须\r\n * @param {String} params.Bucket Bucket名称,必须\r\n * @param {String} params.Region 地域名称,必须\r\n * @param {Function} callback 回调函数,必须\r\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730\r\n * @return {Object} data 返回数据\r\n */\r\nfunction deleteBucketDomain(params, callback) {\r\n\r\n submitRequest.call(this, {\r\n Action: 'name/cos:DeleteBucketDomain',\r\n method: 'DELETE',\r\n Bucket: params.Bucket,\r\n Region: params.Region,\r\n headers: params.Headers,\r\n action: 'domain',\r\n }, function (err, data) {\r\n if (err && err.statusCode === 204) {\r\n return callback(null, {statusCode: err.statusCode});\r\n } else if (err) {\r\n return callback(err);\r\n }\r\n callback(null, {\r\n statusCode: data.statusCode,\r\n headers: data.headers,\r\n });\r\n });\r\n}\r\n\r\n/**\r\n * 设置 Bucket 的回源\r\n * @param {Object} params 参数对象,必须\r\n * @param {String} params.Bucket Bucket名称,必须\r\n * @param {String} params.Region 地域名称,必须\r\n * @param {Function} callback 回调函数,必须\r\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730\r\n * @return {Object} data 返回数据\r\n */\r\nfunction putBucketOrigin(params, callback){\r\n var OriginConfiguration = params['OriginConfiguration'] || {};\r\n var OriginRule = OriginConfiguration.OriginRule || params.OriginRule || [];\r\n OriginRule = util.clone(OriginRule);\r\n var xml = util.json2xml({OriginConfiguration: {OriginRule: OriginRule}});\r\n\r\n var headers = params.Headers;\r\n headers['Content-Type'] = 'application/xml';\r\n headers['Content-MD5'] = util.binaryBase64(util.md5(xml));\r\n\r\n submitRequest.call(this, {\r\n Action: 'name/cos:PutBucketOrigin',\r\n method: 'PUT',\r\n Bucket: params.Bucket,\r\n Region: params.Region,\r\n body: xml,\r\n action: 'origin',\r\n headers: headers,\r\n }, function (err, data) {\r\n if (err && err.statusCode === 204) {\r\n return callback(null, {statusCode: err.statusCode});\r\n } else if (err) {\r\n return callback(err);\r\n }\r\n callback(null, {\r\n statusCode: data.statusCode,\r\n headers: data.headers,\r\n });\r\n });\r\n}\r\n\r\n/**\r\n * 获取 Bucket 的回源\r\n * @param {Object} params 参数对象,必须\r\n * @param {String} params.Bucket Bucket名称,必须\r\n * @param {String} params.Region 地域名称,必须\r\n * @param {Function} callback 回调函数,必须\r\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730\r\n * @return {Object} data 返回数据\r\n */\r\nfunction getBucketOrigin(params, callback) {\r\n\r\n submitRequest.call(this, {\r\n Action: 'name/cos:GetBucketOrigin',\r\n method: 'GET',\r\n Bucket: params.Bucket,\r\n Region: params.Region,\r\n headers: params.Headers,\r\n action: 'origin',\r\n }, function (err, data) {\r\n if (err) return callback(err);\r\n\r\n var OriginRule = [];\r\n try {\r\n OriginRule = data.OriginConfiguration.OriginRule || [];\r\n } catch (e) {\r\n }\r\n OriginRule = util.clone(util.isArray(OriginRule) ? OriginRule : [OriginRule]);\r\n callback(null, {\r\n OriginRule: OriginRule,\r\n statusCode: data.statusCode,\r\n headers: data.headers,\r\n });\r\n });\r\n}\r\n\r\n/**\r\n * 删除 Bucket 的回源\r\n * @param {Object} params 参数对象,必须\r\n * @param {String} params.Bucket Bucket名称,必须\r\n * @param {String} params.Region 地域名称,必须\r\n * @param {Function} callback 回调函数,必须\r\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730\r\n * @return {Object} data 返回数据\r\n */\r\nfunction deleteBucketOrigin(params, callback) {\r\n\r\n submitRequest.call(this, {\r\n Action: 'name/cos:DeleteBucketOrigin',\r\n method: 'DELETE',\r\n Bucket: params.Bucket,\r\n Region: params.Region,\r\n headers: params.Headers,\r\n action: 'origin',\r\n }, function (err, data) {\r\n if (err && err.statusCode === 204) {\r\n return callback(null, {statusCode: err.statusCode});\r\n } else if (err) {\r\n return callback(err);\r\n }\r\n callback(null, {\r\n statusCode: data.statusCode,\r\n headers: data.headers,\r\n });\r\n });\r\n}\r\n\r\n/**\r\n * 设置 Bucket 的日志记录\r\n * @param {Object} params 参数对象,必须\r\n * @param {String} params.Bucket Bucket名称,必须\r\n * @param {String} params.Region 地域名称,必须\r\n * @param {(Object|String)} params.BucketLoggingStatus 说明日志记录配置的状态,如果无子节点信息则意为关闭日志记录,必须\r\n * @param {Function} callback 回调函数,必须\r\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730\r\n * @return {Object} data 返回数据\r\n */\r\nfunction putBucketLogging(params, callback) {\r\n var xml = util.json2xml({\r\n BucketLoggingStatus: params['BucketLoggingStatus'] || ''\r\n });\r\n\r\n var headers = params.Headers;\r\n headers['Content-Type'] = 'application/xml';\r\n headers['Content-MD5'] = util.binaryBase64(util.md5(xml));\r\n\r\n submitRequest.call(this, {\r\n Action: 'name/cos:PutBucketLogging',\r\n method: 'PUT',\r\n Bucket: params.Bucket,\r\n Region: params.Region,\r\n body: xml,\r\n action: 'logging',\r\n headers: headers,\r\n }, function (err, data) {\r\n if (err && err.statusCode === 204) {\r\n return callback(null, {statusCode: err.statusCode});\r\n } else if (err) {\r\n return callback(err);\r\n }\r\n callback(null, {\r\n statusCode: data.statusCode,\r\n headers: data.headers,\r\n });\r\n });\r\n}\r\n\r\n/**\r\n * 获取 Bucket 的日志记录\r\n * @param {Object} params 参数对象,必须\r\n * @param {String} params.Bucket Bucket名称,必须\r\n * @param {String} params.Region 地域名称,必须\r\n * @param {Function} callback 回调函数,必须\r\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730\r\n * @return {Object} data 返回数据\r\n */\r\nfunction getBucketLogging(params, callback) {\r\n submitRequest.call(this, {\r\n Action: 'name/cos:GetBucketLogging',\r\n method: 'GET',\r\n Bucket: params.Bucket,\r\n Region: params.Region,\r\n headers: params.Headers,\r\n action: 'logging',\r\n }, function (err, data) {\r\n if (err) return callback(err);\r\n callback(null, {\r\n BucketLoggingStatus: data.BucketLoggingStatus,\r\n statusCode: data.statusCode,\r\n headers: data.headers,\r\n });\r\n });\r\n}\r\n\r\n/**\r\n * 创建/编辑 Bucket 的清单任务\r\n * @param {Object} params 参数对象,必须\r\n * @param {String} params.Bucket Bucket名称,必须\r\n * @param {String} params.Region 地域名称,必须\r\n * @param {String} params.Id 清单任务的名称,必须\r\n * @param {Object} params.InventoryConfiguration 包含清单的配置参数,必须\r\n * @param {Function} callback 回调函数,必须\r\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730\r\n * @return {Object} data 返回数据\r\n */\r\nfunction putBucketInventory(params, callback) {\r\n var InventoryConfiguration = util.clone(params['InventoryConfiguration']);\r\n\r\n if (InventoryConfiguration.OptionalFields) {\r\n var Field = InventoryConfiguration.OptionalFields || [];\r\n InventoryConfiguration.OptionalFields = {\r\n Field: Field\r\n };\r\n }\r\n\r\n if (InventoryConfiguration.Destination\r\n && InventoryConfiguration.Destination.COSBucketDestination\r\n && InventoryConfiguration.Destination.COSBucketDestination.Encryption\r\n ) {\r\n var Encryption = InventoryConfiguration.Destination.COSBucketDestination.Encryption;\r\n if (Object.keys(Encryption).indexOf('SSECOS') > -1) {\r\n Encryption['SSE-COS'] = Encryption['SSECOS'];\r\n delete Encryption['SSECOS'];\r\n }\r\n }\r\n\r\n var xml = util.json2xml({\r\n InventoryConfiguration: InventoryConfiguration\r\n });\r\n\r\n var headers = params.Headers;\r\n headers['Content-Type'] = 'application/xml';\r\n headers['Content-MD5'] = util.binaryBase64(util.md5(xml));\r\n\r\n submitRequest.call(this, {\r\n Action: 'name/cos:PutBucketInventory',\r\n method: 'PUT',\r\n Bucket: params.Bucket,\r\n Region: params.Region,\r\n body: xml,\r\n action: 'inventory',\r\n qs: {\r\n id: params['Id']\r\n },\r\n headers: headers,\r\n }, function (err, data) {\r\n if (err && err.statusCode === 204) {\r\n return callback(null, {statusCode: err.statusCode});\r\n } else if (err) {\r\n return callback(err);\r\n }\r\n callback(null, {\r\n statusCode: data.statusCode,\r\n headers: data.headers,\r\n });\r\n });\r\n}\r\n\r\n/**\r\n * 获取 Bucket 的清单任务信息\r\n * @param {Object} params 参数对象,必须\r\n * @param {String} params.Bucket Bucket名称,必须\r\n * @param {String} params.Region 地域名称,必须\r\n * @param {String} params.Id 清单任务的名称,必须\r\n * @param {Function} callback 回调函数,必须\r\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730\r\n * @return {Object} data 返回数据\r\n */\r\nfunction getBucketInventory(params, callback) {\r\n submitRequest.call(this, {\r\n Action: 'name/cos:GetBucketInventory',\r\n method: 'GET',\r\n Bucket: params.Bucket,\r\n Region: params.Region,\r\n headers: params.Headers,\r\n action: 'inventory',\r\n qs: {\r\n id: params['Id']\r\n }\r\n }, function (err, data) {\r\n if (err) return callback(err);\r\n\r\n var InventoryConfiguration = data['InventoryConfiguration'];\r\n if (InventoryConfiguration && InventoryConfiguration.OptionalFields && InventoryConfiguration.OptionalFields.Field) {\r\n var Field = InventoryConfiguration.OptionalFields.Field;\r\n if (!util.isArray(Field)) {\r\n Field = [Field];\r\n }\r\n InventoryConfiguration.OptionalFields = Field;\r\n }\r\n if (InventoryConfiguration.Destination\r\n && InventoryConfiguration.Destination.COSBucketDestination\r\n && InventoryConfiguration.Destination.COSBucketDestination.Encryption\r\n ) {\r\n var Encryption = InventoryConfiguration.Destination.COSBucketDestination.Encryption;\r\n if (Object.keys(Encryption).indexOf('SSE-COS') > -1) {\r\n Encryption['SSECOS'] = Encryption['SSE-COS'];\r\n delete Encryption['SSE-COS'];\r\n }\r\n }\r\n\r\n callback(null, {\r\n InventoryConfiguration: InventoryConfiguration,\r\n statusCode: data.statusCode,\r\n headers: data.headers,\r\n });\r\n });\r\n}\r\n\r\n/**\r\n * 获取 Bucket 的清单任务信息\r\n * @param {Object} params 参数对象,必须\r\n * @param {String} params.Bucket Bucket名称,必须\r\n * @param {String} params.Region 地域名称,必须\r\n * @param {String} params.ContinuationToken 当 COS 响应体中 IsTruncated 为 true,且 NextContinuationToken 节点中存在参数值时,您可以将这个参数作为 continuation-token 参数值,以获取下一页的清单任务信息,非必须\r\n * @param {Function} callback 回调函数,必须\r\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730\r\n * @return {Object} data 返回数据\r\n */\r\nfunction listBucketInventory(params, callback) {\r\n submitRequest.call(this, {\r\n Action: 'name/cos:ListBucketInventory',\r\n method: 'GET',\r\n Bucket: params.Bucket,\r\n Region: params.Region,\r\n headers: params.Headers,\r\n action: 'inventory',\r\n qs: {\r\n 'continuation-token': params['ContinuationToken']\r\n }\r\n }, function (err, data) {\r\n if (err) return callback(err);\r\n var ListInventoryConfigurationResult = data['ListInventoryConfigurationResult'];\r\n var InventoryConfigurations = ListInventoryConfigurationResult.InventoryConfiguration || [];\r\n InventoryConfigurations = util.isArray(InventoryConfigurations) ? InventoryConfigurations : [InventoryConfigurations];\r\n delete ListInventoryConfigurationResult['InventoryConfiguration'];\r\n util.each(InventoryConfigurations, function (InventoryConfiguration) {\r\n if (InventoryConfiguration && InventoryConfiguration.OptionalFields && InventoryConfiguration.OptionalFields.Field) {\r\n var Field = InventoryConfiguration.OptionalFields.Field;\r\n if (!util.isArray(Field)) {\r\n Field = [Field];\r\n }\r\n InventoryConfiguration.OptionalFields = Field;\r\n }\r\n\r\n if (InventoryConfiguration.Destination\r\n && InventoryConfiguration.Destination.COSBucketDestination\r\n && InventoryConfiguration.Destination.COSBucketDestination.Encryption\r\n ) {\r\n var Encryption = InventoryConfiguration.Destination.COSBucketDestination.Encryption;\r\n if (Object.keys(Encryption).indexOf('SSE-COS') > -1) {\r\n Encryption['SSECOS'] = Encryption['SSE-COS'];\r\n delete Encryption['SSE-COS'];\r\n }\r\n }\r\n });\r\n ListInventoryConfigurationResult.InventoryConfigurations = InventoryConfigurations;\r\n util.extend(ListInventoryConfigurationResult, {\r\n statusCode: data.statusCode,\r\n headers: data.headers,\r\n });\r\n callback(null, ListInventoryConfigurationResult);\r\n });\r\n}\r\n\r\n/**\r\n * 删除 Bucket 的清单任务\r\n * @param {Object} params 参数对象,必须\r\n * @param {String} params.Bucket Bucket名称,必须\r\n * @param {String} params.Region 地域名称,必须\r\n * @param {String} params.Id 清单任务的名称,必须\r\n * @param {Function} callback 回调函数,必须\r\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730\r\n * @return {Object} data 返回数据\r\n */\r\nfunction deleteBucketInventory(params, callback) {\r\n submitRequest.call(this, {\r\n Action: 'name/cos:DeleteBucketInventory',\r\n method: 'DELETE',\r\n Bucket: params.Bucket,\r\n Region: params.Region,\r\n headers: params.Headers,\r\n action: 'inventory',\r\n qs: {\r\n id: params['Id']\r\n }\r\n }, function (err, data) {\r\n if (err && err.statusCode === 204) {\r\n return callback(null, {statusCode: err.statusCode});\r\n } else if (err) {\r\n return callback(err);\r\n }\r\n callback(null, {\r\n statusCode: data.statusCode,\r\n headers: data.headers,\r\n });\r\n });\r\n}\r\n\r\n/* 全球加速 */\r\nfunction putBucketAccelerate(params, callback) {\r\n\r\n if (!params['AccelerateConfiguration']) {\r\n callback(util.error(new Error('missing param AccelerateConfiguration')));\r\n return;\r\n }\r\n\r\n var configuration = { AccelerateConfiguration: params.AccelerateConfiguration || {} };\r\n\r\n var xml = util.json2xml(configuration);\r\n\r\n var headers = {};\r\n headers['Content-Type'] = 'application/xml';\r\n headers['Content-MD5'] = util.binaryBase64(util.md5(xml));\r\n\r\n submitRequest.call(this, {\r\n Action: 'name/cos:PutBucketAccelerate',\r\n method: 'PUT',\r\n Bucket: params.Bucket,\r\n Region: params.Region,\r\n body: xml,\r\n action: 'accelerate',\r\n headers: headers,\r\n }, function (err, data) {\r\n if (err) return callback(err);\r\n callback(null, {\r\n statusCode: data.statusCode,\r\n headers: data.headers,\r\n });\r\n });\r\n}\r\n\r\nfunction getBucketAccelerate(params, callback) {\r\n submitRequest.call(this, {\r\n Action: 'name/cos:GetBucketAccelerate',\r\n method: 'GET',\r\n Bucket: params.Bucket,\r\n Region: params.Region,\r\n action: 'accelerate',\r\n }, function (err, data) {\r\n if (!err) {\r\n !data.AccelerateConfiguration && (data.AccelerateConfiguration = {});\r\n }\r\n callback(err, data);\r\n });\r\n}\r\n\r\nfunction putBucketEncryption(params, callback) {\r\n var conf = params.ServerSideEncryptionConfiguration || {};\r\n var Rules = conf.Rule || conf.Rules || [];\r\n var xml = util.json2xml({ServerSideEncryptionConfiguration: {Rule:Rules}});\r\n\r\n var headers = params.Headers;\r\n headers['Content-Type'] = 'application/xml';\r\n headers['Content-MD5'] = util.binaryBase64(util.md5(xml));\r\n\r\n submitRequest.call(this, {\r\n Action: 'name/cos:PutBucketEncryption',\r\n method: 'PUT',\r\n Bucket: params.Bucket,\r\n Region: params.Region,\r\n body: xml,\r\n action: 'encryption',\r\n headers: headers,\r\n }, function (err, data) {\r\n if (err && err.statusCode === 204) {\r\n return callback(null, {statusCode: err.statusCode});\r\n } else if (err) {\r\n return callback(err);\r\n }\r\n callback(null, {\r\n statusCode: data.statusCode,\r\n headers: data.headers,\r\n });\r\n });\r\n}\r\n\r\nfunction getBucketEncryption(params, callback) {\r\n submitRequest.call(this, {\r\n Action: 'name/cos:GetBucketEncryption',\r\n method: 'GET',\r\n Bucket: params.Bucket,\r\n Region: params.Region,\r\n headers: params.Headers,\r\n action: 'encryption',\r\n }, function (err, data) {\r\n if (err) {\r\n if (err.statusCode === 404 && err.code === 'NoSuchEncryptionConfiguration') {\r\n var result = {\r\n EncryptionConfiguration: {Rules: []},\r\n statusCode: err.statusCode,\r\n };\r\n err.headers && (result.headers = err.headers);\r\n callback(null, result);\r\n } else {\r\n callback(err);\r\n }\r\n return;\r\n }\r\n var Rules = util.makeArray(data.EncryptionConfiguration && data.EncryptionConfiguration.Rule || []);\r\n data.EncryptionConfiguration = {Rules: Rules};\r\n callback(err, data);\r\n });\r\n}\r\n\r\nfunction deleteBucketEncryption(params, callback) {\r\n submitRequest.call(this, {\r\n Action: 'name/cos:DeleteBucketReplication',\r\n method: 'DELETE',\r\n Bucket: params.Bucket,\r\n Region: params.Region,\r\n headers: params.Headers,\r\n action: 'encryption',\r\n }, function (err, data) {\r\n if (err && err.statusCode === 204) {\r\n return callback(null, {statusCode: err.statusCode});\r\n } else if (err) {\r\n return callback(err);\r\n }\r\n callback(null, {\r\n statusCode: data.statusCode,\r\n headers: data.headers,\r\n });\r\n });\r\n}\r\n\r\n// Object 相关\r\n\r\n/**\r\n * 取回对应Object的元数据,Head的权限与Get的权限一致\r\n * @param {Object} params 参数对象,必须\r\n * @param {String} params.Bucket Bucket名称,必须\r\n * @param {String} params.Region 地域名称,必须\r\n * @param {String} params.Key 文件名称,必须\r\n * @param {String} params.IfModifiedSince 当Object在指定时间后被修改,则返回对应Object元信息,否则返回304,非必须\r\n * @param {Function} callback 回调函数,必须\r\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730\r\n * @return {Object} data 为指定 object 的元数据,如果设置了 IfModifiedSince ,且文件未修改,则返回一个对象,NotModified 属性为 true\r\n * @return {Boolean} data.NotModified 是否在 IfModifiedSince 时间点之后未修改该 object,则为 true\r\n */\r\nfunction headObject(params, callback) {\r\n submitRequest.call(this, {\r\n Action: 'name/cos:HeadObject',\r\n method: 'HEAD',\r\n Bucket: params.Bucket,\r\n Region: params.Region,\r\n Key: params.Key,\r\n VersionId: params.VersionId,\r\n headers: params.Headers,\r\n }, function (err, data) {\r\n if (err) {\r\n var statusCode = err.statusCode;\r\n if (params.Headers['If-Modified-Since'] && statusCode && statusCode === 304) {\r\n return callback(null, {\r\n NotModified: true,\r\n statusCode: statusCode,\r\n });\r\n }\r\n return callback(err);\r\n }\r\n data.ETag = util.attr(data.headers, 'etag', '');\r\n callback(null, data);\r\n });\r\n}\r\n\r\n\r\nfunction listObjectVersions(params, callback) {\r\n var reqParams = {};\r\n reqParams['prefix'] = params['Prefix'] || '';\r\n reqParams['delimiter'] = params['Delimiter'];\r\n reqParams['key-marker'] = params['KeyMarker'];\r\n reqParams['version-id-marker'] = params['VersionIdMarker'];\r\n reqParams['max-keys'] = params['MaxKeys'];\r\n reqParams['encoding-type'] = params['EncodingType'];\r\n\r\n submitRequest.call(this, {\r\n Action: 'name/cos:GetBucketObjectVersions',\r\n ResourceKey: reqParams['prefix'],\r\n method: 'GET',\r\n Bucket: params.Bucket,\r\n Region: params.Region,\r\n headers: params.Headers,\r\n qs: reqParams,\r\n action: 'versions',\r\n }, function (err, data) {\r\n if (err) return callback(err);\r\n var ListVersionsResult = data.ListVersionsResult || {};\r\n var DeleteMarkers = ListVersionsResult.DeleteMarker || [];\r\n DeleteMarkers = util.isArray(DeleteMarkers) ? DeleteMarkers : [DeleteMarkers];\r\n var Versions = ListVersionsResult.Version || [];\r\n Versions = util.isArray(Versions) ? Versions : [Versions];\r\n\r\n var result = util.clone(ListVersionsResult);\r\n delete result.DeleteMarker;\r\n delete result.Version;\r\n util.extend(result, {\r\n DeleteMarkers: DeleteMarkers,\r\n Versions: Versions,\r\n statusCode: data.statusCode,\r\n headers: data.headers,\r\n });\r\n\r\n callback(null, result);\r\n });\r\n}\r\n\r\n/**\r\n * 下载 object\r\n * @param {Object} params 参数对象,必须\r\n * @param {String} params.Bucket Bucket名称,必须\r\n * @param {String} params.Region 地域名称,必须\r\n * @param {String} params.Key 文件名称,必须\r\n * @param {WriteStream} params.Output 文件写入流,非必须\r\n * @param {String} params.IfModifiedSince 当Object在指定时间后被修改,则返回对应Object元信息,否则返回304,非必须\r\n * @param {String} params.IfUnmodifiedSince 如果文件修改时间早于或等于指定时间,才返回文件内容。否则返回 412 (precondition failed),非必须\r\n * @param {String} params.IfMatch 当 ETag 与指定的内容一致,才返回文件。否则返回 412 (precondition failed),非必须\r\n * @param {String} params.IfNoneMatch 当 ETag 与指定的内容不一致,才返回文件。否则返回304 (not modified),非必须\r\n * @param {String} params.ResponseContentType 设置返回头部中的 Content-Type 参数,非必须\r\n * @param {String} params.ResponseContentLanguage 设置返回头部中的 Content-Language 参数,非必须\r\n * @param {String} params.ResponseExpires 设置返回头部中的 Content-Expires 参数,非必须\r\n * @param {String} params.ResponseCacheControl 设置返回头部中的 Cache-Control 参数,非必须\r\n * @param {String} params.ResponseContentDisposition 设置返回头部中的 Content-Disposition 参数,非必须\r\n * @param {String} params.ResponseContentEncoding 设置返回头部中的 Content-Encoding 参数,非必须\r\n * @param {Function} callback 回调函数,必须\r\n * @param {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730\r\n * @param {Object} data 为对应的 object 数据,包括 body 和 headers\r\n */\r\nfunction getObject(params, callback) {\r\n var reqParams = params.Query || {};\r\n var onProgress = util.throttleOnProgress.call(this, 0, params.onProgress);\r\n\r\n reqParams['response-content-type'] = params['ResponseContentType'];\r\n reqParams['response-content-language'] = params['ResponseContentLanguage'];\r\n reqParams['response-expires'] = params['ResponseExpires'];\r\n reqParams['response-cache-control'] = params['ResponseCacheControl'];\r\n reqParams['response-content-disposition'] = params['ResponseContentDisposition'];\r\n reqParams['response-content-encoding'] = params['ResponseContentEncoding'];\r\n\r\n // 如果用户自己传入了 output\r\n submitRequest.call(this, {\r\n Action: 'name/cos:GetObject',\r\n method: 'GET',\r\n Bucket: params.Bucket,\r\n Region: params.Region,\r\n Key: params.Key,\r\n VersionId: params.VersionId,\r\n DataType: params.DataType,\r\n headers: params.Headers,\r\n qs: reqParams,\r\n rawBody: true,\r\n onDownloadProgress: onProgress,\r\n }, function (err, data) {\r\n onProgress(null, true);\r\n if (err) {\r\n var statusCode = err.statusCode;\r\n if (params.Headers['If-Modified-Since'] && statusCode && statusCode === 304) {\r\n return callback(null, {\r\n NotModified: true\r\n });\r\n }\r\n return callback(err);\r\n }\r\n callback(null, {\r\n Body: data.body,\r\n ETag: util.attr(data.headers, 'etag', ''),\r\n statusCode: data.statusCode,\r\n headers: data.headers,\r\n });\r\n });\r\n\r\n}\r\n\r\n/**\r\n * 上传 object\r\n * @param {Object} params 参数对象,必须\r\n * @param {String} params.Bucket Bucket名称,必须\r\n * @param {String} params.Region 地域名称,必须\r\n * @param {String} params.Key 文件名称,必须\r\n * @param {File || Blob || String} params.Body 上传文件对象或字符串,必须\r\n * @param {String} params.CacheControl RFC 2616 中定义的缓存策略,将作为 Object 元数据保存,非必须\r\n * @param {String} params.ContentDisposition RFC 2616 中定义的文件名称,将作为 Object 元数据保存,非必须\r\n * @param {String} params.ContentEncoding RFC 2616 中定义的编码格式,将作为 Object 元数据保存,非必须\r\n * @param {String} params.ContentLength RFC 2616 中定义的 HTTP 请求内容长度(字节),必须\r\n * @param {String} params.ContentType RFC 2616 中定义的内容类型(MIME),将作为 Object 元数据保存,非必须\r\n * @param {String} params.Expect 当使用 Expect: 100-continue 时,在收到服务端确认后,才会发送请求内容,非必须\r\n * @param {String} params.Expires RFC 2616 中定义的过期时间,将作为 Object 元数据保存,非必须\r\n * @param {String} params.ACL 允许用户自定义文件权限,有效值:private | public-read,非必须\r\n * @param {String} params.GrantRead 赋予被授权者读取对象的权限,格式:id=\"[OwnerUin]\",可使用半角逗号(,)分隔多组被授权者,非必须\r\n * @param {String} params.GrantReadAcp 赋予被授权者读取对象的访问控制列表(ACL)的权限,格式:id=\"[OwnerUin]\",可使用半角逗号(,)分隔多组被授权者,非必须\r\n * @param {String} params.GrantWriteAcp 赋予被授权者写入对象的访问控制列表(ACL)的权限,格式:id=\"[OwnerUin]\",可使用半角逗号(,)分隔多组被授权者,非必须\r\n * @param {String} params.GrantFullControl 赋予被授权者操作对象的所有权限,格式:id=\"[OwnerUin]\",可使用半角逗号(,)分隔多组被授权者,非必须\r\n * @param {String} params.StorageClass 设置对象的存储级别,枚举值:STANDARD、STANDARD_IA、ARCHIVE,默认值:STANDARD,非必须\r\n * @param {String} params.x-cos-meta-* 允许用户自定义的头部信息,将作为对象的元数据保存。大小限制2KB,非必须\r\n * @param {String} params.ContentSha1 RFC 3174 中定义的 160-bit 内容 SHA-1 算法校验,非必须\r\n * @param {String} params.ServerSideEncryption 支持按照指定的加密算法进行服务端数据加密,格式 x-cos-server-side-encryption: \"AES256\",非必须\r\n * @param {Function} params.onProgress 上传进度回调函数\r\n * @param {Function} callback 回调函数,必须\r\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730\r\n * @return {Object} data 为对应的 object 数据\r\n * @return {String} data.ETag 为对应上传文件的 ETag 值\r\n */\r\nfunction putObject(params, callback) {\r\n var self = this;\r\n var FileSize = params.ContentLength;\r\n var onProgress = util.throttleOnProgress.call(self, FileSize, params.onProgress);\r\n\r\n // 特殊处理 Cache-Control、Content-Type,避免代理更改这两个字段导致写入到 Object 属性里\r\n var headers = params.Headers;\r\n if (!headers['Cache-Control'] && !headers['cache-control']) headers['Cache-Control'] = '';\r\n if (!headers['Content-Type'] && !headers['content-type']) headers['Content-Type'] = params.Body && params.Body.type || '';\r\n var needCalcMd5 = params.UploadAddMetaMd5 || self.options.UploadAddMetaMd5 || self.options.UploadCheckContentMd5;\r\n util.getBodyMd5(needCalcMd5, params.Body, function (md5) {\r\n if (md5) {\r\n if (self.options.UploadCheckContentMd5) headers['Content-MD5'] = util.binaryBase64(md5);\r\n if (params.UploadAddMetaMd5 || self.options.UploadAddMetaMd5) headers['x-cos-meta-md5'] = md5;\r\n }\r\n if (params.ContentLength !== undefined) headers['Content-Length'] = params.ContentLength;\r\n onProgress(null, true); // 任务状态开始 uploading\r\n submitRequest.call(self, {\r\n Action: 'name/cos:PutObject',\r\n TaskId: params.TaskId,\r\n method: 'PUT',\r\n Bucket: params.Bucket,\r\n Region: params.Region,\r\n Key: params.Key,\r\n headers: params.Headers,\r\n qs: params.Query,\r\n body: params.Body,\r\n onProgress: onProgress,\r\n }, function (err, data) {\r\n if (err) {\r\n onProgress(null, true);\r\n return callback(err);\r\n }\r\n onProgress({loaded: FileSize, total: FileSize}, true);\r\n var url = getUrl({\r\n ForcePathStyle: self.options.ForcePathStyle,\r\n protocol: self.options.Protocol,\r\n domain: self.options.Domain,\r\n bucket: params.Bucket,\r\n region: params.Region,\r\n object: params.Key,\r\n });\r\n url = url.substr(url.indexOf('://') + 3);\r\n data.Location = url;\r\n data.ETag = util.attr(data.headers, 'etag', '');\r\n callback(null, data);\r\n });\r\n }, params.onHashProgress);\r\n}\r\n\r\n/**\r\n * 删除 object\r\n * @param {Object} params 参数对象,必须\r\n * @param {String} params.Bucket Bucket名称,必须\r\n * @param {String} params.Region 地域名称,必须\r\n * @param {String} params.Key object名称,必须\r\n * @param {Function} callback 回调函数,必须\r\n * @param {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730\r\n * @param {Object} data 删除操作成功之后返回的数据\r\n */\r\nfunction deleteObject(params, callback) {\r\n submitRequest.call(this, {\r\n Action: 'name/cos:DeleteObject',\r\n method: 'DELETE',\r\n Bucket: params.Bucket,\r\n Region: params.Region,\r\n Key: params.Key,\r\n headers: params.Headers,\r\n VersionId: params.VersionId,\r\n }, function (err, data) {\r\n if (err) {\r\n var statusCode = err.statusCode;\r\n if (statusCode && statusCode === 404) {\r\n return callback(null, {BucketNotFound: true, statusCode: statusCode,});\r\n } else {\r\n return callback(err);\r\n }\r\n }\r\n callback(null, {\r\n statusCode: data.statusCode,\r\n headers: data.headers,\r\n });\r\n });\r\n}\r\n\r\n/**\r\n * 获取 object 的 权限列表\r\n * @param {Object} params 参数对象,必须\r\n * @param {String} params.Bucket Bucket名称,必须\r\n * @param {String} params.Region 地域名称,必须\r\n * @param {String} params.Key object名称,必须\r\n * @param {Function} callback 回调函数,必须\r\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730\r\n * @return {Object} data 返回的数据\r\n * @return {Object} data.AccessControlPolicy 权限列表\r\n */\r\nfunction getObjectAcl(params, callback) {\r\n\r\n submitRequest.call(this, {\r\n Action: 'name/cos:GetObjectACL',\r\n method: 'GET',\r\n Bucket: params.Bucket,\r\n Region: params.Region,\r\n Key: params.Key,\r\n headers: params.Headers,\r\n action: 'acl',\r\n }, function (err, data) {\r\n if (err) return callback(err);\r\n var AccessControlPolicy = data.AccessControlPolicy || {};\r\n var Owner = AccessControlPolicy.Owner || {};\r\n var Grant = AccessControlPolicy.AccessControlList && AccessControlPolicy.AccessControlList.Grant || [];\r\n Grant = util.isArray(Grant) ? Grant : [Grant];\r\n var result = decodeAcl(AccessControlPolicy);\r\n delete result.GrantWrite;\r\n if (data.headers && data.headers['x-cos-acl']) {\r\n result.ACL = data.headers['x-cos-acl'];\r\n }\r\n result = util.extend(result, {\r\n Owner: Owner,\r\n Grants: Grant,\r\n statusCode: data.statusCode,\r\n headers: data.headers,\r\n });\r\n callback(null, result);\r\n });\r\n}\r\n\r\n/**\r\n * 设置 object 的 权限列表\r\n * @param {Object} params 参数对象,必须\r\n * @param {String} params.Bucket Bucket名称,必须\r\n * @param {String} params.Region 地域名称,必须\r\n * @param {String} params.Key object名称,必须\r\n * @param {Function} callback 回调函数,必须\r\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730\r\n * @return {Object} data 返回的数据\r\n */\r\nfunction putObjectAcl(params, callback) {\r\n var headers = params.Headers;\r\n\r\n var xml = '';\r\n if (params['AccessControlPolicy']) {\r\n var AccessControlPolicy = util.clone(params['AccessControlPolicy'] || {});\r\n var Grants = AccessControlPolicy.Grants || AccessControlPolicy.Grant;\r\n Grants = util.isArray(Grants) ? Grants : [Grants];\r\n delete AccessControlPolicy.Grant;\r\n delete AccessControlPolicy.Grants;\r\n AccessControlPolicy.AccessControlList = {Grant: Grants};\r\n xml = util.json2xml({AccessControlPolicy: AccessControlPolicy});\r\n\r\n headers['Content-Type'] = 'application/xml';\r\n headers['Content-MD5'] = util.binaryBase64(util.md5(xml));\r\n }\r\n\r\n // Grant Header 去重\r\n util.each(headers, function (val, key) {\r\n if (key.indexOf('x-cos-grant-') === 0) {\r\n headers[key] = uniqGrant(headers[key]);\r\n }\r\n });\r\n\r\n submitRequest.call(this, {\r\n Action: 'name/cos:PutObjectACL',\r\n method: 'PUT',\r\n Bucket: params.Bucket,\r\n Region: params.Region,\r\n Key: params.Key,\r\n action: 'acl',\r\n headers: headers,\r\n body: xml,\r\n }, function (err, data) {\r\n if (err) return callback(err);\r\n callback(null, {\r\n statusCode: data.statusCode,\r\n headers: data.headers,\r\n });\r\n });\r\n}\r\n\r\n/**\r\n * Options Object请求实现跨域访问的预请求。即发出一个 OPTIONS 请求给服务器以确认是否可以进行跨域操作。\r\n * @param {Object} params 参数对象,必须\r\n * @param {String} params.Bucket Bucket名称,必须\r\n * @param {String} params.Region 地域名称,必须\r\n * @param {String} params.Key object名称,必须\r\n * @param {Function} callback 回调函数,必须\r\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730\r\n * @return {Object} data 返回的数据\r\n */\r\nfunction optionsObject(params, callback) {\r\n\r\n var headers = params.Headers;\r\n headers['Origin'] = params['Origin'];\r\n headers['Access-Control-Request-Method'] = params['AccessControlRequestMethod'];\r\n headers['Access-Control-Request-Headers'] = params['AccessControlRequestHeaders'];\r\n\r\n submitRequest.call(this, {\r\n Action: 'name/cos:OptionsObject',\r\n method: 'OPTIONS',\r\n Bucket: params.Bucket,\r\n Region: params.Region,\r\n Key: params.Key,\r\n headers: headers,\r\n }, function (err, data) {\r\n if (err) {\r\n if (err.statusCode && err.statusCode === 403) {\r\n return callback(null, {\r\n OptionsForbidden: true,\r\n statusCode: err.statusCode\r\n });\r\n }\r\n return callback(err);\r\n }\r\n\r\n var headers = data.headers || {};\r\n callback(null, {\r\n AccessControlAllowOrigin: headers['access-control-allow-origin'],\r\n AccessControlAllowMethods: headers['access-control-allow-methods'],\r\n AccessControlAllowHeaders: headers['access-control-allow-headers'],\r\n AccessControlExposeHeaders: headers['access-control-expose-headers'],\r\n AccessControlMaxAge: headers['access-control-max-age'],\r\n statusCode: data.statusCode,\r\n headers: data.headers,\r\n });\r\n });\r\n}\r\n\r\n/**\r\n * @param {Object} 参数列表\r\n * @param {String} Bucket Bucket 名称\r\n * @param {String} Region 地域名称\r\n * @param {String} Key 文件名称\r\n * @param {String} CopySource 源文件URL绝对路径,可以通过versionid子资源指定历史版本\r\n * @param {String} ACL 允许用户自定义文件权限。有效值:private,public-read默认值:private。\r\n * @param {String} GrantRead 赋予被授权者读的权限,格式 x-cos-grant-read: uin=\" \",uin=\" \",当需要给子账户授权时,uin=\"RootAcountID/SubAccountID\",当需要给根账户授权时,uin=\"RootAcountID\"。\r\n * @param {String} GrantWrite 赋予被授权者写的权限,格式 x-cos-grant-write: uin=\" \",uin=\" \",当需要给子账户授权时,uin=\"RootAcountID/SubAccountID\",当需要给根账户授权时,uin=\"RootAcountID\"。\r\n * @param {String} GrantFullControl 赋予被授权者读写权限,格式 x-cos-grant-full-control: uin=\" \",uin=\" \",当需要给子账户授权时,uin=\"RootAcountID/SubAccountID\",当需要给根账户授权时,uin=\"RootAcountID\"。\r\n * @param {String} MetadataDirective 是否拷贝元数据,枚举值:Copy, Replaced,默认值Copy。假如标记为Copy,忽略Header中的用户元数据信息直接复制;假如标记为Replaced,按Header信息修改元数据。当目标路径和原路径一致,即用户试图修改元数据时,必须为Replaced\r\n * @param {String} CopySourceIfModifiedSince 当Object在指定时间后被修改,则执行操作,否则返回412。可与x-cos-copy-source-If-None-Match一起使用,与其他条件联合使用返回冲突。\r\n * @param {String} CopySourceIfUnmodifiedSince 当Object在指定时间后未被修改,则执行操作,否则返回412。可与x-cos-copy-source-If-Match一起使用,与其他条件联合使用返回冲突。\r\n * @param {String} CopySourceIfMatch 当Object的ETag和给定一致时,则执行操作,否则返回412。可与x-cos-copy-source-If-Unmodified-Since一起使用,与其他条件联合使用返回冲突。\r\n * @param {String} CopySourceIfNoneMatch 当Object的ETag和给定不一致时,则执行操作,否则返回412。可与x-cos-copy-source-If-Modified-Since一起使用,与其他条件联合使用返回冲突。\r\n * @param {String} StorageClass 存储级别,枚举值:存储级别,枚举值:Standard, Standard_IA,Archive;默认值:Standard\r\n * @param {String} CacheControl 指定所有缓存机制在整个请求/响应链中必须服从的指令。\r\n * @param {String} ContentDisposition MIME 协议的扩展,MIME 协议指示 MIME 用户代理如何显示附加的文件\r\n * @param {String} ContentEncoding HTTP 中用来对「采用何种编码格式传输正文」进行协定的一对头部字段\r\n * @param {String} ContentLength 设置响应消息的实体内容的大小,单位为字节\r\n * @param {String} ContentType RFC 2616 中定义的 HTTP 请求内容类型(MIME),例如text/plain\r\n * @param {String} Expect 请求的特定的服务器行为\r\n * @param {String} Expires 响应过期的日期和时间\r\n * @param {String} params.ServerSideEncryption 支持按照指定的加密算法进行服务端数据加密,格式 x-cos-server-side-encryption: \"AES256\",非必须\r\n * @param {String} ContentLanguage 指定内容语言\r\n * @param {String} x-cos-meta-* 允许用户自定义的头部信息,将作为 Object 元数据返回。大小限制2K。\r\n */\r\nfunction putObjectCopy(params, callback) {\r\n\r\n // 特殊处理 Cache-Control\r\n var headers = params.Headers;\r\n if (!headers['Cache-Control'] && !headers['cache-control']) headers['Cache-Control'] = '';\r\n\r\n var CopySource = params.CopySource || '';\r\n var m = CopySource.match(/^([^.]+-\\d+)\\.cos(v6)?\\.([^.]+)\\.[^/]+\\/(.+)$/);\r\n if (!m) {\r\n callback(util.error(new Error('CopySource format error')));\r\n return;\r\n }\r\n\r\n var SourceBucket = m[1];\r\n var SourceRegion = m[3];\r\n var SourceKey = decodeURIComponent(m[4]);\r\n\r\n submitRequest.call(this, {\r\n Scope: [{\r\n action: 'name/cos:GetObject',\r\n bucket: SourceBucket,\r\n region: SourceRegion,\r\n prefix: SourceKey,\r\n }, {\r\n action: 'name/cos:PutObject',\r\n bucket: params.Bucket,\r\n region: params.Region,\r\n prefix: params.Key,\r\n }],\r\n method: 'PUT',\r\n Bucket: params.Bucket,\r\n Region: params.Region,\r\n Key: params.Key,\r\n VersionId: params.VersionId,\r\n headers: params.Headers,\r\n }, function (err, data) {\r\n if (err) return callback(err);\r\n var result = util.clone(data.CopyObjectResult || {});\r\n util.extend(result, {\r\n statusCode: data.statusCode,\r\n headers: data.headers,\r\n });\r\n callback(null, result);\r\n });\r\n}\r\n\r\nfunction uploadPartCopy(params, callback) {\r\n\r\n var CopySource = params.CopySource || '';\r\n var m = CopySource.match(/^([^.]+-\\d+)\\.cos(v6)?\\.([^.]+)\\.[^/]+\\/(.+)$/);\r\n if (!m) {\r\n callback(util.error(new Error('CopySource format error')));\r\n return;\r\n }\r\n\r\n var SourceBucket = m[1];\r\n var SourceRegion = m[3];\r\n var SourceKey = decodeURIComponent(m[4]);\r\n\r\n submitRequest.call(this, {\r\n Scope: [{\r\n action: 'name/cos:GetObject',\r\n bucket: SourceBucket,\r\n region: SourceRegion,\r\n prefix: SourceKey,\r\n }, {\r\n action: 'name/cos:PutObject',\r\n bucket: params.Bucket,\r\n region: params.Region,\r\n prefix: params.Key,\r\n }],\r\n method: 'PUT',\r\n Bucket: params.Bucket,\r\n Region: params.Region,\r\n Key: params.Key,\r\n VersionId: params.VersionId,\r\n qs: {\r\n partNumber: params['PartNumber'],\r\n uploadId: params['UploadId'],\r\n },\r\n headers: params.Headers,\r\n }, function (err, data) {\r\n if (err) return callback(err);\r\n var result = util.clone(data.CopyPartResult || {});\r\n util.extend(result, {\r\n statusCode: data.statusCode,\r\n headers: data.headers,\r\n });\r\n callback(null, result);\r\n });\r\n}\r\n\r\nfunction deleteMultipleObject(params, callback) {\r\n var Objects = params.Objects || [];\r\n var Quiet = params.Quiet;\r\n Objects = util.isArray(Objects) ? Objects : [Objects];\r\n\r\n var xml = util.json2xml({Delete: {Object: Objects, Quiet: Quiet || false}});\r\n\r\n var headers = params.Headers;\r\n headers['Content-Type'] = 'application/xml';\r\n headers['Content-MD5'] = util.binaryBase64(util.md5(xml));\r\n\r\n var Scope = util.map(Objects, function (v) {\r\n return {\r\n action: 'name/cos:DeleteObject',\r\n bucket: params.Bucket,\r\n region: params.Region,\r\n prefix: v.Key,\r\n };\r\n });\r\n\r\n submitRequest.call(this, {\r\n Scope: Scope,\r\n method: 'POST',\r\n Bucket: params.Bucket,\r\n Region: params.Region,\r\n body: xml,\r\n action: 'delete',\r\n headers: headers,\r\n }, function (err, data) {\r\n if (err) return callback(err);\r\n var DeleteResult = data.DeleteResult || {};\r\n var Deleted = DeleteResult.Deleted || [];\r\n var Errors = DeleteResult.Error || [];\r\n\r\n Deleted = util.isArray(Deleted) ? Deleted : [Deleted];\r\n Errors = util.isArray(Errors) ? Errors : [Errors];\r\n\r\n var result = util.clone(DeleteResult);\r\n util.extend(result, {\r\n Error: Errors,\r\n Deleted: Deleted,\r\n statusCode: data.statusCode,\r\n headers: data.headers,\r\n });\r\n callback(null, result);\r\n });\r\n}\r\n\r\nfunction restoreObject(params, callback) {\r\n var headers = params.Headers;\r\n if (!params['RestoreRequest']) {\r\n callback(util.error(new Error('missing param RestoreRequest')));\r\n return;\r\n }\r\n\r\n var RestoreRequest = params.RestoreRequest || {};\r\n var xml = util.json2xml({RestoreRequest: RestoreRequest});\r\n\r\n headers['Content-Type'] = 'application/xml';\r\n headers['Content-MD5'] = util.binaryBase64(util.md5(xml));\r\n\r\n submitRequest.call(this, {\r\n Action: 'name/cos:RestoreObject',\r\n method: 'POST',\r\n Bucket: params.Bucket,\r\n Region: params.Region,\r\n Key: params.Key,\r\n VersionId: params.VersionId,\r\n body: xml,\r\n action: 'restore',\r\n headers: headers,\r\n }, callback);\r\n}\r\n\r\n/**\r\n * 设置 Object 的标签\r\n * @param {Object} params 参数对象,必须\r\n * @param {String} params.Bucket Object名称,必须\r\n * @param {String} params.Region 地域名称,必须\r\n * @param {Array} params.TagSet 标签设置,必须\r\n * @param {Function} callback 回调函数,必须\r\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/42998\r\n * @return {Object} data 返回数据\r\n */\r\nfunction putObjectTagging(params, callback) {\r\n\r\n var Tagging = params['Tagging'] || {};\r\n var Tags = Tagging.TagSet || Tagging.Tags || params['Tags'] || [];\r\n Tags = util.clone(util.isArray(Tags) ? Tags : [Tags]);\r\n var xml = util.json2xml({Tagging: {TagSet: {Tag: Tags}}});\r\n\r\n var headers = params.Headers;\r\n headers['Content-Type'] = 'application/xml';\r\n headers['Content-MD5'] = util.binaryBase64(util.md5(xml));\r\n\r\n submitRequest.call(this, {\r\n Action: 'name/cos:PutObjectTagging',\r\n method: 'PUT',\r\n Bucket: params.Bucket,\r\n Key: params.Key,\r\n Region: params.Region,\r\n body: xml,\r\n action: 'tagging',\r\n headers: headers,\r\n VersionId: params.VersionId,\r\n }, function (err, data) {\r\n if (err && err.statusCode === 204) {\r\n return callback(null, {statusCode: err.statusCode});\r\n } else if (err) {\r\n return callback(err);\r\n }\r\n callback(null, {\r\n statusCode: data.statusCode,\r\n headers: data.headers,\r\n });\r\n });\r\n}\r\n\r\n/**\r\n * 获取 Object 的标签设置\r\n * @param {Object} params 参数对象,必须\r\n * @param {String} params.Bucket Bucket名称,必须\r\n * @param {String} params.Region 地域名称,必须\r\n * @param {Function} callback 回调函数,必须\r\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/42998\r\n * @return {Object} data 返回数据\r\n */\r\nfunction getObjectTagging(params, callback) {\r\n\r\n submitRequest.call(this, {\r\n Action: 'name/cos:GetObjectTagging',\r\n method: 'GET',\r\n Key: params.Key,\r\n Bucket: params.Bucket,\r\n Region: params.Region,\r\n headers: params.Headers,\r\n action: 'tagging',\r\n VersionId: params.VersionId,\r\n }, function (err, data) {\r\n if (err) {\r\n if (err.statusCode === 404 && err.error && (err.error === \"Not Found\" || err.error.Code === 'NoSuchTagSet')) {\r\n var result = {\r\n Tags: [],\r\n statusCode: err.statusCode,\r\n };\r\n err.headers && (result.headers = err.headers);\r\n callback(null, result);\r\n } else {\r\n callback(err);\r\n }\r\n return;\r\n }\r\n var Tags = [];\r\n try {\r\n Tags = data.Tagging.TagSet.Tag || [];\r\n } catch (e) {\r\n }\r\n Tags = util.clone(util.isArray(Tags) ? Tags : [Tags]);\r\n callback(null, {\r\n Tags: Tags,\r\n statusCode: data.statusCode,\r\n headers: data.headers,\r\n });\r\n });\r\n}\r\n\r\n/**\r\n * 删除 Object 的 标签设置\r\n * @param {Object} params 参数对象,必须\r\n * @param {String} params.Bucket Object名称,必须\r\n * @param {String} params.Region 地域名称,必须\r\n * @param {Function} callback 回调函数,必须\r\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/42998\r\n * @return {Object} data 返回的数据\r\n */\r\nfunction deleteObjectTagging(params, callback) {\r\n submitRequest.call(this, {\r\n Action: 'name/cos:DeleteObjectTagging',\r\n method: 'DELETE',\r\n Bucket: params.Bucket,\r\n Region: params.Region,\r\n Key: params.Key,\r\n headers: params.Headers,\r\n action: 'tagging',\r\n VersionId: params.VersionId,\r\n }, function (err, data) {\r\n if (err && err.statusCode === 204) {\r\n return callback(null, {statusCode: err.statusCode});\r\n } else if (err) {\r\n return callback(err);\r\n }\r\n callback(null, {\r\n statusCode: data.statusCode,\r\n headers: data.headers,\r\n });\r\n });\r\n}\r\n\r\n/**\r\n * 使用 SQL 语句从指定对象(CSV 格式或者 JSON 格式)中检索内容\r\n * @param {Object} params 参数对象,必须\r\n * @param {String} params.Bucket Object名称,必须\r\n * @param {String} params.Region 地域名称,必须\r\n * @param {Object} params.SelectRequest 地域名称,必须\r\n * @param {Function} callback 回调函数,必须\r\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/42998\r\n * @return {Object} data 返回的数据\r\n */\r\nfunction selectObjectContent(params, callback) {\r\n var SelectType = params['SelectType'];\r\n if (!SelectType) return callback(util.error(new Error('missing param SelectType')));\r\n\r\n var SelectRequest = params['SelectRequest'] || {};\r\n var xml = util.json2xml({SelectRequest: SelectRequest});\r\n\r\n var headers = params.Headers;\r\n headers['Content-Type'] = 'application/xml';\r\n headers['Content-MD5'] = util.binaryBase64(util.md5(xml));\r\n\r\n submitRequest.call(this, {\r\n Action: 'name/cos:GetObject',\r\n method: 'POST',\r\n Bucket: params.Bucket,\r\n Region: params.Region,\r\n Key: params.Key,\r\n headers: params.Headers,\r\n action: 'select',\r\n qs: {\r\n 'select-type': params['SelectType'],\r\n },\r\n VersionId: params.VersionId,\r\n body: xml,\r\n DataType: 'arraybuffer',\r\n rawBody: true,\r\n }, function (err, data) {\r\n if (err && err.statusCode === 204) {\r\n return callback(null, {statusCode: err.statusCode});\r\n } else if (err) {\r\n return callback(err);\r\n }\r\n var result = util.parseSelectPayload(data.body);\r\n callback(null, {\r\n statusCode: data.statusCode,\r\n headers: data.headers,\r\n Body: result.body,\r\n Payload: result.payload,\r\n });\r\n });\r\n}\r\n\r\n\r\n// 分块上传\r\n\r\n\r\n/**\r\n * 初始化分块上传\r\n * @param {Object} params 参数对象,必须\r\n * @param {String} params.Bucket Bucket名称,必须\r\n * @param {String} params.Region 地域名称,必须\r\n * @param {String} params.Key object名称,必须\r\n * @param {String} params.UploadId object名称,必须\r\n * @param {String} params.CacheControl RFC 2616 中定义的缓存策略,将作为 Object 元数据保存,非必须\r\n * @param {String} params.ContentDisposition RFC 2616 中定义的文件名称,将作为 Object 元数据保存 ,非必须\r\n * @param {String} params.ContentEncoding RFC 2616 中定义的编码格式,将作为 Object 元数据保存,非必须\r\n * @param {String} params.ContentType RFC 2616 中定义的内容类型(MIME),将作为 Object 元数据保存,非必须\r\n * @param {String} params.Expires RFC 2616 中定义的过期时间,将作为 Object 元数据保存,非必须\r\n * @param {String} params.ACL 允许用户自定义文件权限,非必须\r\n * @param {String} params.GrantRead 赋予被授权者读的权限 ,非必须\r\n * @param {String} params.GrantWrite 赋予被授权者写的权限 ,非必须\r\n * @param {String} params.GrantFullControl 赋予被授权者读写权限 ,非必须\r\n * @param {String} params.StorageClass 设置Object的存储级别,枚举值:Standard,Standard_IA,Archive,非必须\r\n * @param {String} params.ServerSideEncryption 支持按照指定的加密算法进行服务端数据加密,格式 x-cos-server-side-encryption: \"AES256\",非必须\r\n * @param {Function} callback 回调函数,必须\r\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730\r\n * @return {Object} data 返回的数据\r\n */\r\nfunction multipartInit(params, callback) {\r\n\r\n var self = this;\r\n // 特殊处理 Cache-Control\r\n var headers = params.Headers;\r\n\r\n // 特殊处理 Cache-Control、Content-Type\r\n if (!headers['Cache-Control'] && !headers['cache-control']) headers['Cache-Control'] = '';\r\n if (!headers['Content-Type'] && !headers['content-type']) headers['Content-Type'] = params.Body && params.Body.type || '';\r\n\r\n util.getBodyMd5(params.Body && (params.UploadAddMetaMd5 || self.options.UploadAddMetaMd5), params.Body, function (md5) {\r\n if (md5) params.Headers['x-cos-meta-md5'] = md5;\r\n submitRequest.call(self, {\r\n Action: 'name/cos:InitiateMultipartUpload',\r\n method: 'POST',\r\n Bucket: params.Bucket,\r\n Region: params.Region,\r\n Key: params.Key,\r\n action: 'uploads',\r\n headers: params.Headers,\r\n qs: params.Query,\r\n }, function (err, data) {\r\n if (err) return callback(err);\r\n data = util.clone(data || {});\r\n if (data && data.InitiateMultipartUploadResult) {\r\n return callback(null, util.extend(data.InitiateMultipartUploadResult, {\r\n statusCode: data.statusCode,\r\n headers: data.headers,\r\n }));\r\n }\r\n callback(null, data);\r\n });\r\n }, params.onHashProgress);\r\n}\r\n\r\n/**\r\n * 分块上传\r\n * @param {Object} params 参数对象,必须\r\n * @param {String} params.Bucket Bucket名称,必须\r\n * @param {String} params.Region 地域名称,必须\r\n * @param {String} params.Key object名称,必须\r\n * @param {File || Blob || String} params.Body 上传文件对象或字符串\r\n * @param {String} params.ContentLength RFC 2616 中定义的 HTTP 请求内容长度(字节),非必须\r\n * @param {String} params.Expect 当使用 Expect: 100-continue 时,在收到服务端确认后,才会发送请求内容,非必须\r\n * @param {String} params.ServerSideEncryption 支持按照指定的加密算法进行服务端数据加密,格式 x-cos-server-side-encryption: \"AES256\",非必须\r\n * @param {String} params.ContentSha1 RFC 3174 中定义的 160-bit 内容 SHA-1 算法校验值,非必须\r\n * @param {Function} callback 回调函数,必须\r\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730\r\n * @return {Object} data 返回的数据\r\n * @return {Object} data.ETag 返回的文件分块 sha1 值\r\n */\r\nfunction multipartUpload(params, callback) {\r\n\r\n var self = this;\r\n util.getFileSize('multipartUpload', params, function () {\r\n util.getBodyMd5(self.options.UploadCheckContentMd5, params.Body, function (md5) {\r\n if (md5) params.Headers['Content-MD5'] = util.binaryBase64(md5);\r\n submitRequest.call(self, {\r\n Action: 'name/cos:UploadPart',\r\n TaskId: params.TaskId,\r\n method: 'PUT',\r\n Bucket: params.Bucket,\r\n Region: params.Region,\r\n Key: params.Key,\r\n qs: {\r\n partNumber: params['PartNumber'],\r\n uploadId: params['UploadId'],\r\n },\r\n headers: params.Headers,\r\n onProgress: params.onProgress,\r\n body: params.Body || null\r\n }, function (err, data) {\r\n if (err) return callback(err);\r\n callback(null, {\r\n ETag: util.attr(data.headers, 'etag', ''),\r\n statusCode: data.statusCode,\r\n headers: data.headers,\r\n });\r\n });\r\n });\r\n });\r\n\r\n}\r\n\r\n/**\r\n * 完成分块上传\r\n * @param {Object} params 参数对象,必须\r\n * @param {String} params.Bucket Bucket名称,必须\r\n * @param {String} params.Region 地域名称,必须\r\n * @param {String} params.Key object名称,必须\r\n * @param {Array} params.Parts 分块信息列表,必须\r\n * @param {String} params.Parts[i].PartNumber 块编号,必须\r\n * @param {String} params.Parts[i].ETag 分块的 sha1 校验值\r\n * @param {Function} callback 回调函数,必须\r\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730\r\n * @return {Object} data 返回的数据\r\n * @return {Object} data.CompleteMultipartUpload 完成分块上传后的文件信息,包括Location, Bucket, Key 和 ETag\r\n */\r\nfunction multipartComplete(params, callback) {\r\n var self = this;\r\n\r\n var UploadId = params.UploadId;\r\n\r\n var Parts = params['Parts'];\r\n\r\n for (var i = 0, len = Parts.length; i < len; i++) {\r\n if (Parts[i]['ETag'].indexOf('\"') === 0) {\r\n continue;\r\n }\r\n Parts[i]['ETag'] = '\"' + Parts[i]['ETag'] + '\"';\r\n }\r\n\r\n var xml = util.json2xml({CompleteMultipartUpload: {Part: Parts}});\r\n // CSP/ceph CompleteMultipartUpload 接口 body 写死了限制 1MB,这里醉倒 10000 片时,xml 字符串去掉空格853KB\r\n xml = xml.replace(/\\n\\s*/g, '');\r\n\r\n var headers = params.Headers;\r\n headers['Content-Type'] = 'application/xml';\r\n headers['Content-MD5'] = util.binaryBase64(util.md5(xml));\r\n\r\n submitRequest.call(this, {\r\n Action: 'name/cos:CompleteMultipartUpload',\r\n method: 'POST',\r\n Bucket: params.Bucket,\r\n Region: params.Region,\r\n Key: params.Key,\r\n qs: {\r\n uploadId: UploadId\r\n },\r\n body: xml,\r\n headers: headers,\r\n }, function (err, data) {\r\n if (err) return callback(err);\r\n var url = getUrl({\r\n ForcePathStyle: self.options.ForcePathStyle,\r\n protocol: self.options.Protocol,\r\n domain: self.options.Domain,\r\n bucket: params.Bucket,\r\n region: params.Region,\r\n object: params.Key,\r\n isLocation: true,\r\n });\r\n var res = data.CompleteMultipartUploadResult || {};\r\n if (res.ProcessResults) {\r\n if (res && res.ProcessResults) {\r\n res.UploadResult = {\r\n OriginalInfo: {\r\n Key: res.Key,\r\n Location: url,\r\n ETag: res.ETag,\r\n ImageInfo: res.ImageInfo,\r\n },\r\n ProcessResults: res.ProcessResults,\r\n };\r\n delete res.ImageInfo;\r\n delete res.ProcessResults;\r\n }\r\n }\r\n var result = util.extend(res, {\r\n Location: url,\r\n statusCode: data.statusCode,\r\n headers: data.headers,\r\n });\r\n callback(null, result);\r\n });\r\n}\r\n\r\n/**\r\n * 分块上传任务列表查询\r\n * @param {Object} params 参数对象,必须\r\n * @param {String} params.Bucket Bucket名称,必须\r\n * @param {String} params.Region 地域名称,必须\r\n * @param {String} params.Delimiter 定界符为一个符号,如果有Prefix,则将Prefix到delimiter之间的相同路径归为一类,定义为Common Prefix,然后列出所有Common Prefix。如果没有Prefix,则从路径起点开始,非必须\r\n * @param {String} params.EncodingType 规定返回值的编码方式,非必须\r\n * @param {String} params.Prefix 前缀匹配,用来规定返回的文件前缀地址,非必须\r\n * @param {String} params.MaxUploads 单次返回最大的条目数量,默认1000,非必须\r\n * @param {String} params.KeyMarker 与upload-id-marker一起使用
当upload-id-marker未被指定时,ObjectName字母顺序大于key-marker的条目将被列出
当upload-id-marker被指定时,ObjectName字母顺序大于key-marker的条目被列出,ObjectName字母顺序等于key-marker同时UploadId大于upload-id-marker的条目将被列出,非必须\r\n * @param {String} params.UploadIdMarker 与key-marker一起使用
当key-marker未被指定时,upload-id-marker将被忽略
当key-marker被指定时,ObjectName字母顺序大于key-marker的条目被列出,ObjectName字母顺序等于key-marker同时UploadId大于upload-id-marker的条目将被列出,非必须\r\n * @param {Function} callback 回调函数,必须\r\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730\r\n * @return {Object} data 返回的数据\r\n * @return {Object} data.ListMultipartUploadsResult 分块上传任务信息\r\n */\r\nfunction multipartList(params, callback) {\r\n var reqParams = {};\r\n\r\n reqParams['delimiter'] = params['Delimiter'];\r\n reqParams['encoding-type'] = params['EncodingType'];\r\n reqParams['prefix'] = params['Prefix'] || '';\r\n\r\n reqParams['max-uploads'] = params['MaxUploads'];\r\n\r\n reqParams['key-marker'] = params['KeyMarker'];\r\n reqParams['upload-id-marker'] = params['UploadIdMarker'];\r\n\r\n reqParams = util.clearKey(reqParams);\r\n\r\n submitRequest.call(this, {\r\n Action: 'name/cos:ListMultipartUploads',\r\n ResourceKey: reqParams['prefix'],\r\n method: 'GET',\r\n Bucket: params.Bucket,\r\n Region: params.Region,\r\n headers: params.Headers,\r\n qs: reqParams,\r\n action: 'uploads',\r\n }, function (err, data) {\r\n if (err) return callback(err);\r\n\r\n if (data && data.ListMultipartUploadsResult) {\r\n var Upload = data.ListMultipartUploadsResult.Upload || [];\r\n Upload = util.isArray(Upload) ? Upload : [Upload];\r\n data.ListMultipartUploadsResult.Upload = Upload;\r\n }\r\n var result = util.clone(data.ListMultipartUploadsResult || {});\r\n util.extend(result, {\r\n statusCode: data.statusCode,\r\n headers: data.headers,\r\n });\r\n callback(null, result);\r\n });\r\n}\r\n\r\n/**\r\n * 上传的分块列表查询\r\n * @param {Object} params 参数对象,必须\r\n * @param {String} params.Bucket Bucket名称,必须\r\n * @param {String} params.Region 地域名称,必须\r\n * @param {String} params.Key object名称,必须\r\n * @param {String} params.UploadId 标示本次分块上传的ID,必须\r\n * @param {String} params.EncodingType 规定返回值的编码方式,非必须\r\n * @param {String} params.MaxParts 单次返回最大的条目数量,默认1000,非必须\r\n * @param {String} params.PartNumberMarker 默认以UTF-8二进制顺序列出条目,所有列出条目从marker开始,非必须\r\n * @param {Function} callback 回调函数,必须\r\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730\r\n * @return {Object} data 返回的数据\r\n * @return {Object} data.ListMultipartUploadsResult 分块信息\r\n */\r\nfunction multipartListPart(params, callback) {\r\n var reqParams = {};\r\n\r\n reqParams['uploadId'] = params['UploadId'];\r\n reqParams['encoding-type'] = params['EncodingType'];\r\n reqParams['max-parts'] = params['MaxParts'];\r\n reqParams['part-number-marker'] = params['PartNumberMarker'];\r\n\r\n submitRequest.call(this, {\r\n Action: 'name/cos:ListParts',\r\n method: 'GET',\r\n Bucket: params.Bucket,\r\n Region: params.Region,\r\n Key: params.Key,\r\n headers: params.Headers,\r\n qs: reqParams,\r\n }, function (err, data) {\r\n if (err) return callback(err);\r\n var ListPartsResult = data.ListPartsResult || {};\r\n var Part = ListPartsResult.Part || [];\r\n Part = util.isArray(Part) ? Part : [Part];\r\n\r\n ListPartsResult.Part = Part;\r\n var result = util.clone(ListPartsResult);\r\n util.extend(result, {\r\n statusCode: data.statusCode,\r\n headers: data.headers,\r\n });\r\n callback(null, result);\r\n });\r\n}\r\n\r\n/**\r\n * 抛弃分块上传\r\n * @param {Object} params 参数对象,必须\r\n * @param {String} params.Bucket Bucket名称,必须\r\n * @param {String} params.Region 地域名称,必须\r\n * @param {String} params.Key object名称,必须\r\n * @param {String} params.UploadId 标示本次分块上传的ID,必须\r\n * @param {Function} callback 回调函数,必须\r\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730\r\n * @return {Object} data 返回的数据\r\n */\r\nfunction multipartAbort(params, callback) {\r\n var reqParams = {};\r\n\r\n reqParams['uploadId'] = params['UploadId'];\r\n submitRequest.call(this, {\r\n Action: 'name/cos:AbortMultipartUpload',\r\n method: 'DELETE',\r\n Bucket: params.Bucket,\r\n Region: params.Region,\r\n Key: params.Key,\r\n headers: params.Headers,\r\n qs: reqParams,\r\n }, function (err, data) {\r\n if (err) return callback(err);\r\n callback(null, {\r\n statusCode: data.statusCode,\r\n headers: data.headers,\r\n });\r\n });\r\n}\r\n\r\n/**\r\n * 抛弃分块上传\r\n * @param {Object} params 参数对象,必须\r\n * @param {String} params.Bucket Bucket名称,必须\r\n * @param {String} params.Region 地域名称,必须\r\n * @param {String} params.Key object名称,必须\r\n * @param {String} params.UploadId 标示本次分块上传的ID,必须\r\n * @param {Function} callback 回调函数,必须\r\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730\r\n * @return {Object} data 返回的数据\r\n */\r\nfunction request(params, callback) {\r\n submitRequest.call(this, {\r\n method: params.Method,\r\n Bucket: params.Bucket,\r\n Region: params.Region,\r\n Key: params.Key,\r\n action: params.Action,\r\n headers: params.Headers,\r\n qs: params.Query,\r\n body: params.Body,\r\n }, function (err, data) {\r\n if (err) return callback(err);\r\n if (data && data.body) {\r\n data.Body = data.body;\r\n delete data.body;\r\n }\r\n callback(err, data);\r\n });\r\n}\r\n\r\n/**\r\n * 获取签名\r\n * @param {Object} params 参数对象,必须\r\n * @param {String} params.Method 请求方法,必须\r\n * @param {String} params.Key object名称,必须\r\n * @param {String} params.Expires 名超时时间,单位秒,可选\r\n * @return {String} data 返回签名字符串\r\n */\r\nfunction getAuth(params) {\r\n var self = this;\r\n return util.getAuth({\r\n SecretId: params.SecretId || this.options.SecretId || '',\r\n SecretKey: params.SecretKey || this.options.SecretKey || '',\r\n Method: params.Method,\r\n Key: params.Key,\r\n Query: params.Query,\r\n Headers: params.Headers,\r\n Expires: params.Expires,\r\n UseRawKey: self.options.UseRawKey,\r\n SystemClockOffset: self.options.SystemClockOffset,\r\n });\r\n}\r\n\r\n/**\r\n * 获取文件下载链接\r\n * @param {Object} params 参数对象,必须\r\n * @param {String} params.Bucket Bucket名称,必须\r\n * @param {String} params.Region 地域名称,必须\r\n * @param {String} params.Key object名称,必须\r\n * @param {String} params.Method 请求的方法,可选\r\n * @param {String} params.Expires 签名超时时间,单位秒,可选\r\n * @param {Function} callback 回调函数,必须\r\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730\r\n * @return {Object} data 返回的数据\r\n */\r\nfunction getObjectUrl(params, callback) {\r\n var self = this;\r\n var url = getUrl({\r\n ForcePathStyle: self.options.ForcePathStyle,\r\n protocol: params.Protocol || self.options.Protocol,\r\n domain: params.Domain || self.options.Domain,\r\n bucket: params.Bucket,\r\n region: params.Region,\r\n object: params.Key,\r\n });\r\n if (params.Sign !== undefined && !params.Sign) {\r\n callback(null, {Url: url});\r\n return url;\r\n }\r\n var AuthData = getAuthorizationAsync.call(this, {\r\n Action: ((params.Method || '').toUpperCase() === 'PUT' ? 'name/cos:PutObject' : 'name/cos:GetObject'),\r\n Bucket: params.Bucket || '',\r\n Region: params.Region || '',\r\n Method: params.Method || 'get',\r\n Key: params.Key,\r\n Expires: params.Expires,\r\n }, function (err, AuthData) {\r\n if (!callback) return;\r\n if (err) {\r\n callback(err);\r\n return;\r\n }\r\n var signUrl = url;\r\n signUrl += '?' + (AuthData.Authorization.indexOf('q-signature') > -1 ?\r\n AuthData.Authorization : 'sign=' + encodeURIComponent(AuthData.Authorization));\r\n AuthData.SecurityToken && (signUrl += '&x-cos-security-token=' + AuthData.SecurityToken);\r\n AuthData.ClientIP && (signUrl += '&clientIP=' + AuthData.ClientIP);\r\n AuthData.ClientUA && (signUrl += '&clientUA=' + AuthData.ClientUA);\r\n AuthData.Token && (signUrl += '&token=' + AuthData.Token);\r\n setTimeout(function () {\r\n callback(null, {Url: signUrl});\r\n });\r\n });\r\n if (AuthData) {\r\n return url + '?' + AuthData.Authorization +\r\n (AuthData.SecurityToken ? '&x-cos-security-token=' + AuthData.SecurityToken : '');\r\n } else {\r\n return url;\r\n }\r\n}\r\n\r\n\r\n/**\r\n * 私有方法\r\n */\r\nfunction decodeAcl(AccessControlPolicy) {\r\n var result = {\r\n GrantFullControl: [],\r\n GrantWrite: [],\r\n GrantRead: [],\r\n GrantReadAcp: [],\r\n GrantWriteAcp: [],\r\n ACL: '',\r\n };\r\n var GrantMap = {\r\n 'FULL_CONTROL': 'GrantFullControl',\r\n 'WRITE': 'GrantWrite',\r\n 'READ': 'GrantRead',\r\n 'READ_ACP': 'GrantReadAcp',\r\n 'WRITE_ACP': 'GrantWriteAcp',\r\n };\r\n var AccessControlList = AccessControlPolicy && AccessControlPolicy.AccessControlList || {};\r\n var Grant = AccessControlList.Grant;\r\n if (Grant) {\r\n Grant = util.isArray(Grant) ? Grant : [Grant];\r\n }\r\n var PublicAcl = {READ: 0, WRITE: 0, FULL_CONTROL: 0};\r\n Grant && Grant.length && util.each(Grant, function (item) {\r\n if (item.Grantee.ID === 'qcs::cam::anyone:anyone' || item.Grantee.URI === 'http://cam.qcloud.com/groups/global/AllUsers') {\r\n PublicAcl[item.Permission] = 1;\r\n } else if (item.Grantee.ID !== AccessControlPolicy.Owner.ID) {\r\n result[GrantMap[item.Permission]].push('id=\"' + item.Grantee.ID + '\"');\r\n }\r\n });\r\n if (PublicAcl.FULL_CONTROL || (PublicAcl.WRITE && PublicAcl.READ)) {\r\n result.ACL = 'public-read-write';\r\n } else if (PublicAcl.READ) {\r\n result.ACL = 'public-read';\r\n } else {\r\n result.ACL = 'private';\r\n }\r\n util.each(GrantMap, function (item) {\r\n result[item] = uniqGrant(result[item].join(','));\r\n });\r\n return result;\r\n}\r\n\r\n// Grant 去重\r\nfunction uniqGrant(str) {\r\n var arr = str.split(',');\r\n var exist = {};\r\n var i, item;\r\n for (i = 0; i < arr.length; ) {\r\n item = arr[i].trim();\r\n if (exist[item]) {\r\n arr.splice(i, 1);\r\n } else {\r\n exist[item] = true;\r\n arr[i] = item;\r\n i++;\r\n }\r\n }\r\n return arr.join(',');\r\n}\r\n\r\n// 生成操作 url\r\nfunction getUrl(params) {\r\n var longBucket = params.bucket;\r\n var shortBucket = longBucket.substr(0, longBucket.lastIndexOf('-'));\r\n var appId = longBucket.substr(longBucket.lastIndexOf('-') + 1);\r\n var domain = params.domain;\r\n var region = params.region;\r\n var object = params.object;\r\n var protocol = params.protocol || (util.isBrowser && location.protocol === 'http:' ? 'http:' : 'https:');\r\n if (!domain) {\r\n if (['cn-south', 'cn-south-2', 'cn-north', 'cn-east', 'cn-southwest', 'sg'].indexOf(region) > -1) {\r\n domain = '{Region}.myqcloud.com';\r\n } else {\r\n domain = 'cos.{Region}.myqcloud.com';\r\n }\r\n if (!params.ForcePathStyle) {\r\n domain = '{Bucket}.' + domain;\r\n }\r\n }\r\n domain = domain.replace(/\\{\\{AppId\\}\\}/ig, appId)\r\n .replace(/\\{\\{Bucket\\}\\}/ig, shortBucket)\r\n .replace(/\\{\\{Region\\}\\}/ig, region)\r\n .replace(/\\{\\{.*?\\}\\}/ig, '');\r\n domain = domain.replace(/\\{AppId\\}/ig, appId)\r\n .replace(/\\{BucketName\\}/ig, shortBucket)\r\n .replace(/\\{Bucket\\}/ig, longBucket)\r\n .replace(/\\{Region\\}/ig, region)\r\n .replace(/\\{.*?\\}/ig, '');\r\n if (!/^[a-zA-Z]+:\\/\\//.test(domain)) {\r\n domain = protocol + '//' + domain;\r\n }\r\n\r\n // 去掉域名最后的斜杆\r\n if (domain.slice(-1) === '/') {\r\n domain = domain.slice(0, -1);\r\n }\r\n var url = domain;\r\n\r\n if (params.ForcePathStyle) {\r\n url += '/' + longBucket;\r\n }\r\n url += '/';\r\n if (object) {\r\n url += util.camSafeUrlEncode(object).replace(/%2F/g, '/');\r\n }\r\n\r\n if (params.isLocation) {\r\n url = url.replace(/^https?:\\/\\//, '');\r\n }\r\n return url;\r\n}\r\n\r\n// 异步获取签名\r\nfunction getAuthorizationAsync(params, callback) {\r\n\r\n var headers = util.clone(params.Headers);\r\n util.each(headers, function (v, k) {\r\n (v === '' || ['content-type', 'cache-control', 'expires'].indexOf(k.toLowerCase()) > -1) && delete headers[k];\r\n });\r\n\r\n // 获取凭证的回调,避免用户 callback 多次\r\n var cbDone = false;\r\n var cb = function (err, AuthData) {\r\n if (cbDone) return;\r\n cbDone = true;\r\n if (AuthData && AuthData.XCosSecurityToken && !AuthData.SecurityToken) {\r\n AuthData = util.clone(AuthData);\r\n AuthData.SecurityToken = AuthData.XCosSecurityToken;\r\n delete AuthData.XCosSecurityToken;\r\n }\r\n callback && callback(err, AuthData);\r\n };\r\n\r\n var self = this;\r\n var Bucket = params.Bucket || '';\r\n var Region = params.Region || '';\r\n\r\n // PathName\r\n var KeyName = params.Key || '';\r\n if (self.options.ForcePathStyle && Bucket) {\r\n KeyName = Bucket + '/' + KeyName;\r\n }\r\n var Pathname = '/' + KeyName;\r\n\r\n // Action、ResourceKey\r\n var StsData = {};\r\n var Scope = params.Scope;\r\n if (!Scope) {\r\n var Action = params.Action || '';\r\n var ResourceKey = params.ResourceKey || params.Key || '';\r\n Scope = params.Scope || [{\r\n action: Action,\r\n bucket: Bucket,\r\n region: Region,\r\n prefix: ResourceKey,\r\n }];\r\n }\r\n var ScopeKey = util.md5(JSON.stringify(Scope));\r\n\r\n // STS\r\n self._StsCache = self._StsCache ||[];\r\n (function () {\r\n var i, AuthData;\r\n for (i = self._StsCache.length - 1; i >= 0; i--) {\r\n AuthData = self._StsCache[i];\r\n var compareTime = Math.round(util.getSkewTime(self.options.SystemClockOffset) / 1000) + 30;\r\n if (AuthData.StartTime && compareTime < AuthData.StartTime || compareTime >= AuthData.ExpiredTime) {\r\n self._StsCache.splice(i, 1);\r\n continue;\r\n }\r\n if (!AuthData.ScopeLimit || AuthData.ScopeLimit && AuthData.ScopeKey === ScopeKey) {\r\n StsData = AuthData;\r\n break;\r\n }\r\n }\r\n })();\r\n\r\n var calcAuthByTmpKey = function () {\r\n var KeyTime = StsData.StartTime && StsData.ExpiredTime ? StsData.StartTime + ';' + StsData.ExpiredTime : '';\r\n var Authorization = util.getAuth({\r\n SecretId: StsData.TmpSecretId,\r\n SecretKey: StsData.TmpSecretKey,\r\n Method: params.Method,\r\n Pathname: Pathname,\r\n Query: params.Query,\r\n Headers: headers,\r\n Expires: params.Expires,\r\n UseRawKey: self.options.UseRawKey,\r\n SystemClockOffset: self.options.SystemClockOffset,\r\n KeyTime: KeyTime\r\n });\r\n var AuthData = {\r\n Authorization: Authorization,\r\n SecurityToken: StsData.SecurityToken || StsData.XCosSecurityToken || '',\r\n Token: StsData.Token || '',\r\n ClientIP: StsData.ClientIP || '',\r\n ClientUA: StsData.ClientUA || '',\r\n };\r\n cb(null, AuthData);\r\n };\r\n var checkAuthError = function (AuthData) {\r\n if (AuthData.Authorization) {\r\n // 检查签名格式\r\n var formatAllow = false;\r\n var auth = AuthData.Authorization;\r\n if (auth) {\r\n if (auth.indexOf(' ') > -1) {\r\n formatAllow = false;\r\n } else if (auth.indexOf('q-sign-algorithm=') > -1 &&\r\n auth.indexOf('q-ak=') > -1 &&\r\n auth.indexOf('q-sign-time=') > -1 &&\r\n auth.indexOf('q-key-time=') > -1 &&\r\n auth.indexOf('q-url-param-list=') > -1) {\r\n formatAllow = true;\r\n } else {\r\n try {\r\n auth = atob(auth);\r\n if (auth.indexOf('a=') > -1 &&\r\n auth.indexOf('k=') > -1 &&\r\n auth.indexOf('t=') > -1 &&\r\n auth.indexOf('r=') > -1 &&\r\n auth.indexOf('b=') > -1) {\r\n formatAllow = true;\r\n }\r\n } catch (e) {}\r\n }\r\n }\r\n if (!formatAllow) return util.error(new Error('getAuthorization callback params format error'));\r\n } else {\r\n if (!AuthData.TmpSecretId) return util.error(new Error('getAuthorization callback params missing \"TmpSecretId\"'));\r\n if (!AuthData.TmpSecretKey) return util.error(new Error('getAuthorization callback params missing \"TmpSecretKey\"'));\r\n if (!AuthData.SecurityToken && !AuthData.XCosSecurityToken) return util.error(new Error('getAuthorization callback params missing \"SecurityToken\"'));\r\n if (!AuthData.ExpiredTime) return util.error(new Error('getAuthorization callback params missing \"ExpiredTime\"'));\r\n if (AuthData.ExpiredTime && AuthData.ExpiredTime.toString().length !== 10) return util.error(new Error('getAuthorization callback params \"ExpiredTime\" should be 10 digits'));\r\n if (AuthData.StartTime && AuthData.StartTime.toString().length !== 10) return util.error(new Error('getAuthorization callback params \"StartTime\" should be 10 StartTime'));\r\n }\r\n return false;\r\n };\r\n\r\n // 先判断是否有临时密钥\r\n if (StsData.ExpiredTime && StsData.ExpiredTime - (util.getSkewTime(self.options.SystemClockOffset) / 1000) > 60) { // 如果缓存的临时密钥有效,并还有超过60秒有效期就直接使用\r\n calcAuthByTmpKey();\r\n } else if (self.options.getAuthorization) { // 外部计算签名或获取临时密钥\r\n self.options.getAuthorization.call(self, {\r\n Bucket: Bucket,\r\n Region: Region,\r\n Method: params.Method,\r\n Key: KeyName,\r\n Pathname: Pathname,\r\n Query: params.Query,\r\n Headers: headers,\r\n Scope: Scope,\r\n SystemClockOffset: self.options.SystemClockOffset,\r\n }, function (AuthData) {\r\n if (typeof AuthData === 'string') AuthData = {Authorization: AuthData};\r\n var AuthError = checkAuthError(AuthData);\r\n if (AuthError) return cb(AuthError);\r\n if (AuthData.Authorization) {\r\n cb(null, AuthData);\r\n } else {\r\n StsData = AuthData || {};\r\n StsData.Scope = Scope;\r\n StsData.ScopeKey = ScopeKey;\r\n self._StsCache.push(StsData);\r\n calcAuthByTmpKey();\r\n }\r\n });\r\n } else if (self.options.getSTS) { // 外部获取临时密钥\r\n self.options.getSTS.call(self, {\r\n Bucket: Bucket,\r\n Region: Region,\r\n }, function (data) {\r\n StsData = data || {};\r\n StsData.Scope = Scope;\r\n StsData.ScopeKey = ScopeKey;\r\n if (!StsData.TmpSecretId) StsData.TmpSecretId = StsData.SecretId;\r\n if (!StsData.TmpSecretKey) StsData.TmpSecretKey = StsData.SecretKey;\r\n var AuthError = checkAuthError(StsData);\r\n if (AuthError) return cb(AuthError);\r\n self._StsCache.push(StsData);\r\n calcAuthByTmpKey();\r\n });\r\n } else { // 内部计算获取签名\r\n return (function () {\r\n var Authorization = util.getAuth({\r\n SecretId: params.SecretId || self.options.SecretId,\r\n SecretKey: params.SecretKey || self.options.SecretKey,\r\n Method: params.Method,\r\n Pathname: Pathname,\r\n Query: params.Query,\r\n Headers: headers,\r\n Expires: params.Expires,\r\n UseRawKey: self.options.UseRawKey,\r\n SystemClockOffset: self.options.SystemClockOffset,\r\n });\r\n var AuthData = {\r\n Authorization: Authorization,\r\n SecurityToken: self.options.SecurityToken || self.options.XCosSecurityToken,\r\n };\r\n cb(null, AuthData);\r\n return AuthData;\r\n })();\r\n }\r\n return '';\r\n}\r\n\r\n// 调整时间偏差\r\nfunction allowRetry(err) {\r\n var allowRetry = false;\r\n var isTimeError = false;\r\n var serverDate = (err.headers && (err.headers.date || err.headers.Date)) || (err.error && err.error.ServerTime);\r\n try {\r\n var errorCode = err.error.Code;\r\n var errorMessage = err.error.Message;\r\n if (errorCode === 'RequestTimeTooSkewed' ||\r\n (errorCode === 'AccessDenied' && errorMessage === 'Request has expired')) {\r\n isTimeError = true;\r\n }\r\n } catch (e) {\r\n }\r\n if (err) {\r\n if (isTimeError && serverDate) {\r\n var serverTime = Date.parse(serverDate);\r\n if (this.options.CorrectClockSkew && Math.abs(util.getSkewTime(this.options.SystemClockOffset) - serverTime) >= 30000) {\r\n console.error('error: Local time is too skewed.');\r\n this.options.SystemClockOffset = serverTime - Date.now();\r\n allowRetry = true;\r\n }\r\n } else if (Math.floor(err.statusCode / 100) === 5) {\r\n allowRetry = true;\r\n }\r\n }\r\n return allowRetry;\r\n}\r\n\r\n// 获取签名并发起请求\r\nfunction submitRequest(params, callback) {\r\n var self = this;\r\n\r\n // 处理 headers\r\n !params.headers && (params.headers = {});\r\n\r\n // 处理 query\r\n !params.qs && (params.qs = {});\r\n params.VersionId && (params.qs.versionId = params.VersionId);\r\n params.qs = util.clearKey(params.qs);\r\n\r\n // 清理 undefined 和 null 字段\r\n params.headers && (params.headers = util.clearKey(params.headers));\r\n params.qs && (params.qs = util.clearKey(params.qs));\r\n\r\n var Query = util.clone(params.qs);\r\n params.action && (Query[params.action] = '');\r\n\r\n var next = function (tryTimes) {\r\n var oldClockOffset = self.options.SystemClockOffset;\r\n getAuthorizationAsync.call(self, {\r\n Bucket: params.Bucket || '',\r\n Region: params.Region || '',\r\n Method: params.method,\r\n Key: params.Key,\r\n Query: Query,\r\n Headers: params.headers,\r\n Action: params.Action,\r\n ResourceKey: params.ResourceKey,\r\n Scope: params.Scope,\r\n }, function (err, AuthData) {\r\n if (err) {\r\n callback(err);\r\n return;\r\n }\r\n params.AuthData = AuthData;\r\n _submitRequest.call(self, params, function (err, data) {\r\n if (err && tryTimes < 2 && (oldClockOffset !== self.options.SystemClockOffset || allowRetry.call(self, err))) {\r\n if (params.headers) {\r\n delete params.headers.Authorization;\r\n delete params.headers['token'];\r\n delete params.headers['clientIP'];\r\n delete params.headers['clientUA'];\r\n delete params.headers['x-cos-security-token'];\r\n }\r\n next(tryTimes + 1);\r\n } else {\r\n callback(err, data);\r\n }\r\n });\r\n });\r\n };\r\n next(1);\r\n\r\n}\r\n\r\n// 发起请求\r\nfunction _submitRequest(params, callback) {\r\n var self = this;\r\n var TaskId = params.TaskId;\r\n if (TaskId && !self._isRunningTask(TaskId)) return;\r\n\r\n var bucket = params.Bucket;\r\n var region = params.Region;\r\n var object = params.Key;\r\n var method = params.method || 'GET';\r\n var url = params.url;\r\n var body = params.body;\r\n var rawBody = params.rawBody;\r\n\r\n // url\r\n url = url || getUrl({\r\n ForcePathStyle: self.options.ForcePathStyle,\r\n protocol: self.options.Protocol,\r\n domain: self.options.Domain,\r\n bucket: bucket,\r\n region: region,\r\n object: object,\r\n });\r\n if (params.action) {\r\n url = url + '?' + params.action;\r\n }\r\n\r\n var opt = {\r\n method: method,\r\n url: url,\r\n headers: params.headers,\r\n qs: params.qs,\r\n body: body,\r\n };\r\n\r\n // 获取签名\r\n opt.headers.Authorization = params.AuthData.Authorization;\r\n params.AuthData.Token && (opt.headers['token'] = params.AuthData.Token);\r\n params.AuthData.ClientIP && (opt.headers['clientIP'] = params.AuthData.ClientIP);\r\n params.AuthData.ClientUA && (opt.headers['clientUA'] = params.AuthData.ClientUA);\r\n params.AuthData.SecurityToken && (opt.headers['x-cos-security-token'] = params.AuthData.SecurityToken);\r\n\r\n // 清理 undefined 和 null 字段\r\n opt.headers && (opt.headers = util.clearKey(opt.headers));\r\n opt = util.clearKey(opt);\r\n\r\n // progress\r\n if (params.onProgress && typeof params.onProgress === 'function') {\r\n var contentLength = body && (body.size || body.length) || 0;\r\n opt.onProgress = function (e) {\r\n if (TaskId && !self._isRunningTask(TaskId)) return;\r\n var loaded = e ? e.loaded : 0;\r\n params.onProgress({loaded: loaded, total: contentLength});\r\n };\r\n }\r\n if (params.onDownloadProgress) {\r\n opt.onDownloadProgress = params.onDownloadProgress;\r\n }\r\n if (params.DataType) {\r\n opt.dataType = params.DataType;\r\n }\r\n if (this.options.Timeout) {\r\n opt.timeout = this.options.Timeout;\r\n }\r\n\r\n self.options.ForcePathStyle && (opt.pathStyle = self.options.ForcePathStyle);\r\n self.emit('before-send', opt);\r\n var sender = (self.options.Request || REQUEST)(opt, function (r) {\r\n if (r.error === 'abort') return;\r\n\r\n // 抛出事件,允许修改返回值的 error、statusCode、statusMessage、body\r\n self.emit('after-receive', r);\r\n var response = {statusCode: r.statusCode, statusMessage: r.statusMessage, headers: r.headers};\r\n var err = r.error;\r\n var body = r.body;\r\n\r\n // 返回内容添加 状态码 和 headers\r\n var hasReturned;\r\n var cb = function (err, data) {\r\n TaskId && self.off('inner-kill-task', killTask);\r\n if (hasReturned) return;\r\n hasReturned = true;\r\n var attrs = {};\r\n response && response.statusCode && (attrs.statusCode = response.statusCode);\r\n response && response.headers && (attrs.headers = response.headers);\r\n\r\n if (err) {\r\n err = util.extend(err || {}, attrs)\r\n callback(err, null);\r\n } else {\r\n data = util.extend(data || {}, attrs);\r\n callback(null, data);\r\n }\r\n sender = null;\r\n };\r\n\r\n // 请求错误,发生网络错误\r\n if (err) return cb(util.error(err));\r\n\r\n // 请求返回码不为 200\r\n var statusCode = response.statusCode;\r\n var statusSuccess = Math.floor(statusCode / 100) === 2; // 200 202 204 206\r\n\r\n // 不对 body 进行转换,body 直接挂载返回\r\n if (rawBody && statusSuccess) return cb(null, {body: body});\r\n\r\n // 解析 xml body\r\n var json;\r\n try {\r\n json = body && body.indexOf('<') > -1 && body.indexOf('>') > -1 && util.xml2json(body) || {};\r\n } catch (e) {\r\n json = {};\r\n }\r\n\r\n // 处理返回值\r\n var xmlError = json && json.Error;\r\n if (statusSuccess) { // 正确返回,状态码 2xx 时,body 不会有 Error\r\n cb(null, json);\r\n } else if (xmlError) { // 正常返回了 xml body,且有 Error 节点\r\n cb(util.error(new Error(xmlError.Message), {code: xmlError.Code, error: xmlError}));\r\n } else if (statusCode) { // 有错误的状态码\r\n cb(util.error(new Error(response.statusMessage), {code: '' + statusCode}));\r\n } else if (statusCode) { // 无状态码,或者获取不到状态码\r\n cb(util.error(new Error('statusCode error')));\r\n }\r\n });\r\n\r\n // kill task\r\n var killTask = function (data) {\r\n if (data.TaskId === TaskId) {\r\n sender && sender.abort && sender.abort();\r\n self.off('inner-kill-task', killTask);\r\n }\r\n };\r\n TaskId && self.on('inner-kill-task', killTask);\r\n\r\n}\r\n\r\n\r\nvar API_MAP = {\r\n // Bucket 相关方法\r\n getService: getService, // Bucket\r\n putBucket: putBucket,\r\n headBucket: headBucket, // Bucket\r\n getBucket: getBucket,\r\n deleteBucket: deleteBucket,\r\n putBucketAcl: putBucketAcl, // BucketACL\r\n getBucketAcl: getBucketAcl,\r\n putBucketCors: putBucketCors, // BucketCors\r\n getBucketCors: getBucketCors,\r\n deleteBucketCors: deleteBucketCors,\r\n getBucketLocation: getBucketLocation, // BucketLocation\r\n getBucketPolicy: getBucketPolicy, // BucketPolicy\r\n putBucketPolicy: putBucketPolicy,\r\n deleteBucketPolicy: deleteBucketPolicy,\r\n putBucketTagging: putBucketTagging, // BucketTagging\r\n getBucketTagging: getBucketTagging,\r\n deleteBucketTagging: deleteBucketTagging,\r\n putBucketLifecycle: putBucketLifecycle, // BucketLifecycle\r\n getBucketLifecycle: getBucketLifecycle,\r\n deleteBucketLifecycle: deleteBucketLifecycle,\r\n putBucketVersioning: putBucketVersioning, // BucketVersioning\r\n getBucketVersioning: getBucketVersioning,\r\n putBucketReplication: putBucketReplication, // BucketReplication\r\n getBucketReplication: getBucketReplication,\r\n deleteBucketReplication: deleteBucketReplication,\r\n putBucketWebsite: putBucketWebsite, // BucketWebsite\r\n getBucketWebsite: getBucketWebsite,\r\n deleteBucketWebsite: deleteBucketWebsite,\r\n putBucketReferer: putBucketReferer, // BucketReferer\r\n getBucketReferer: getBucketReferer,\r\n putBucketDomain: putBucketDomain, // BucketDomain\r\n getBucketDomain: getBucketDomain,\r\n deleteBucketDomain: deleteBucketDomain,\r\n putBucketOrigin: putBucketOrigin, // BucketOrigin\r\n getBucketOrigin: getBucketOrigin,\r\n deleteBucketOrigin: deleteBucketOrigin,\r\n putBucketLogging: putBucketLogging, // BucketLogging\r\n getBucketLogging: getBucketLogging,\r\n putBucketInventory: putBucketInventory, // BucketInventory\r\n getBucketInventory: getBucketInventory,\r\n listBucketInventory: listBucketInventory,\r\n deleteBucketInventory: deleteBucketInventory,\r\n putBucketAccelerate: putBucketAccelerate,\r\n getBucketAccelerate: getBucketAccelerate,\r\n putBucketEncryption: putBucketEncryption,\r\n getBucketEncryption: getBucketEncryption,\r\n deleteBucketEncryption: deleteBucketEncryption,\r\n\r\n // Object 相关方法\r\n getObject: getObject,\r\n headObject: headObject,\r\n listObjectVersions: listObjectVersions,\r\n putObject: putObject,\r\n deleteObject: deleteObject,\r\n getObjectAcl: getObjectAcl,\r\n putObjectAcl: putObjectAcl,\r\n optionsObject: optionsObject,\r\n putObjectCopy: putObjectCopy,\r\n deleteMultipleObject: deleteMultipleObject,\r\n restoreObject: restoreObject,\r\n putObjectTagging: putObjectTagging,\r\n getObjectTagging: getObjectTagging,\r\n deleteObjectTagging: deleteObjectTagging,\r\n selectObjectContent: selectObjectContent,\r\n\r\n // 分块上传相关方法\r\n uploadPartCopy: uploadPartCopy,\r\n multipartInit: multipartInit,\r\n multipartUpload: multipartUpload,\r\n multipartComplete: multipartComplete,\r\n multipartList: multipartList,\r\n multipartListPart: multipartListPart,\r\n multipartAbort: multipartAbort,\r\n\r\n // 工具方法\r\n request: request,\r\n getObjectUrl: getObjectUrl,\r\n getAuth: getAuth,\r\n};\r\n\r\nfunction warnOldApi(apiName, fn, proto) {\r\n util.each(['Cors', 'Acl'], function (suffix) {\r\n if (apiName.slice(-suffix.length) === suffix) {\r\n var oldName = apiName.slice(0, -suffix.length) + suffix.toUpperCase();\r\n var apiFn = util.apiWrapper(apiName, fn);\r\n var warned = false;\r\n proto[oldName] = function () {\r\n !warned && console.warn('warning: cos.' + oldName + ' has been deprecated. Please Use cos.' + apiName + ' instead.');\r\n warned = true;\r\n apiFn.apply(this, arguments);\r\n };\r\n }\r\n });\r\n}\r\n\r\nmodule.exports.init = function (COS, task) {\r\n task.transferToTaskMethod(API_MAP, 'putObject');\r\n util.each(API_MAP, function (fn, apiName) {\r\n COS.prototype[apiName] = util.apiWrapper(apiName, fn);\r\n warnOldApi(apiName, fn, COS.prototype);\r\n });\r\n};\r\n","//copyright Ryan Day 2010 , Joscha Feth 2013 [MIT Licensed]\r\n\r\nvar element_start_char =\r\n \"a-zA-Z_\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u00FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FFF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\";\r\nvar element_non_start_char = \"\\-.0-9\\u00B7\\u0300-\\u036F\\u203F\\u2040\";\r\nvar element_replace = new RegExp(\"^([^\" + element_start_char + \"])|^((x|X)(m|M)(l|L))|([^\" + element_start_char + element_non_start_char + \"])\", \"g\");\r\nvar not_safe_in_xml = /[^\\x09\\x0A\\x0D\\x20-\\xFF\\x85\\xA0-\\uD7FF\\uE000-\\uFDCF\\uFDE0-\\uFFFD]/gm;\r\n\r\nvar objKeys = function (obj) {\r\n var l = [];\r\n if (obj instanceof Object) {\r\n for (var k in obj) {\r\n if (obj.hasOwnProperty(k)) {\r\n l.push(k);\r\n }\r\n }\r\n }\r\n return l;\r\n};\r\nvar process_to_xml = function (node_data, options) {\r\n\r\n var makeNode = function (name, content, attributes, level, hasSubNodes) {\r\n var indent_value = options.indent !== undefined ? options.indent : \"\\t\";\r\n var indent = options.prettyPrint ? '\\n' + new Array(level).join(indent_value) : '';\r\n if (options.removeIllegalNameCharacters) {\r\n name = name.replace(element_replace, '_');\r\n }\r\n\r\n var node = [indent, '<', name, (attributes || '')];\r\n if (content && content.length > 0) {\r\n node.push('>')\r\n node.push(content);\r\n hasSubNodes && node.push(indent);\r\n node.push('');\r\n } else {\r\n node.push('/>');\r\n }\r\n return node.join('');\r\n };\r\n\r\n return (function fn(node_data, node_descriptor, level) {\r\n var type = typeof node_data;\r\n if ((Array.isArray) ? Array.isArray(node_data) : node_data instanceof Array) {\r\n type = 'array';\r\n } else if (node_data instanceof Date) {\r\n type = 'date';\r\n }\r\n\r\n switch (type) {\r\n //if value is an array create child nodes from values\r\n case 'array':\r\n var ret = [];\r\n node_data.map(function (v) {\r\n ret.push(fn(v, 1, level + 1));\r\n //entries that are values of an array are the only ones that can be special node descriptors\r\n });\r\n options.prettyPrint && ret.push('\\n');\r\n return ret.join('');\r\n break;\r\n\r\n case 'date':\r\n // cast dates to ISO 8601 date (soap likes it)\r\n return node_data.toJSON ? node_data.toJSON() : node_data + '';\r\n break;\r\n\r\n case 'object':\r\n var nodes = [];\r\n for (var name in node_data) {\r\n if (node_data.hasOwnProperty(name)) {\r\n if (node_data[name] instanceof Array) {\r\n for (var j = 0; j < node_data[name].length; j++) {\r\n if (node_data[name].hasOwnProperty(j)) {\r\n nodes.push(makeNode(name, fn(node_data[name][j], 0, level + 1), null, level + 1, objKeys(node_data[name][j]).length));\r\n }\r\n }\r\n } else {\r\n nodes.push(makeNode(name, fn(node_data[name], 0, level + 1), null, level + 1));\r\n }\r\n }\r\n }\r\n options.prettyPrint && nodes.length > 0 && nodes.push('\\n');\r\n return nodes.join('');\r\n break;\r\n\r\n case 'function':\r\n return node_data();\r\n break;\r\n\r\n default:\r\n return options.escape ? esc(node_data) : '' + node_data;\r\n }\r\n\r\n }(node_data, 0, 0))\r\n};\r\n\r\n\r\nvar xml_header = function (standalone) {\r\n var ret = ['');\r\n\r\n return ret.join('');\r\n};\r\n\r\nfunction esc(str) {\r\n return ('' + str).replace(/&/g, '&')\r\n .replace(//g, '>')\r\n .replace(/'/g, ''')\r\n .replace(/\"/g, '"')\r\n .replace(not_safe_in_xml, '');\r\n}\r\n\r\nmodule.exports = function (obj, options) {\r\n if (!options) {\r\n options = {\r\n xmlHeader: {\r\n standalone: true\r\n },\r\n prettyPrint: true,\r\n indent: \" \",\r\n escape: true,\r\n };\r\n }\r\n\r\n if (typeof obj == 'string') {\r\n try {\r\n obj = JSON.parse(obj.toString());\r\n } catch (e) {\r\n return false;\r\n }\r\n }\r\n\r\n var xmlheader = '';\r\n var docType = '';\r\n if (options) {\r\n if (typeof options == 'object') {\r\n // our config is an object\r\n\r\n if (options.xmlHeader) {\r\n // the user wants an xml header\r\n xmlheader = xml_header(!!options.xmlHeader.standalone);\r\n }\r\n\r\n if (typeof options.docType != 'undefined') {\r\n docType = ''\r\n }\r\n } else {\r\n // our config is a boolean value, so just add xml header\r\n xmlheader = xml_header();\r\n }\r\n }\r\n options = options || {}\r\n\r\n var ret = [\r\n xmlheader,\r\n (options.prettyPrint && docType ? '\\n' : ''),\r\n docType,\r\n process_to_xml(obj, options)\r\n ];\r\n return ret.join('').replace(/\\n{2,}/g, '\\n').replace(/\\s+$/g, '');\r\n};","var eachLimit = function (arr, limit, iterator, callback) {\r\n callback = callback || function () {};\r\n if (!arr.length || limit <= 0) {\r\n return callback();\r\n }\r\n\r\n var completed = 0;\r\n var started = 0;\r\n var running = 0;\r\n\r\n (function replenish () {\r\n if (completed >= arr.length) {\r\n return callback();\r\n }\r\n\r\n while (running < limit && started < arr.length) {\r\n started += 1;\r\n running += 1;\r\n iterator(arr[started - 1], function (err) {\r\n\r\n if (err) {\r\n callback(err);\r\n callback = function () {};\r\n } else {\r\n completed += 1;\r\n running -= 1;\r\n if (completed >= arr.length) {\r\n callback();\r\n } else {\r\n replenish();\r\n }\r\n }\r\n });\r\n }\r\n })();\r\n};\r\n\r\nvar retry = function (times, iterator, callback) {\r\n var next = function (index) {\r\n iterator(function (err, data) {\r\n if (err && index < times) {\r\n next(index + 1);\r\n } else {\r\n callback(err, data);\r\n }\r\n });\r\n };\r\n if (times < 1) {\r\n callback();\r\n } else {\r\n next(1);\r\n }\r\n};\r\n\r\nvar async = {\r\n eachLimit: eachLimit,\r\n retry: retry\r\n};\r\n\r\nmodule.exports = async;","var stringifyPrimitive = function(v) {\r\n switch (typeof v) {\r\n case 'string':\r\n return v;\r\n case 'boolean':\r\n return v ? 'true' : 'false';\r\n case 'number':\r\n return isFinite(v) ? v : '';\r\n default:\r\n return '';\r\n }\r\n};\r\n\r\nvar queryStringify = function(obj, sep, eq, name) {\r\n sep = sep || '&';\r\n eq = eq || '=';\r\n if (obj === null) {\r\n obj = undefined;\r\n }\r\n if (typeof obj === 'object') {\r\n return Object.keys(obj).map(function(k) {\r\n var ks = encodeURIComponent(stringifyPrimitive(k)) + eq;\r\n if (Array.isArray(obj[k])) {\r\n return obj[k].map(function(v) {\r\n return ks + encodeURIComponent(stringifyPrimitive(v));\r\n }).join(sep);\r\n } else {\r\n return ks + encodeURIComponent(stringifyPrimitive(obj[k]));\r\n }\r\n }).filter(Boolean).join(sep);\r\n\r\n }\r\n if (!name) return '';\r\n return encodeURIComponent(stringifyPrimitive(name)) + eq +\r\n encodeURIComponent(stringifyPrimitive(obj));\r\n};\r\n\r\nvar xhrRes = function (err, xhr, body) {\r\n var headers = {};\r\n xhr.getAllResponseHeaders().trim().split('\\n').forEach(function (item) {\r\n if (item) {\r\n var index = item.indexOf(':');\r\n var key = item.substr(0, index).trim().toLowerCase();\r\n var val = item.substr(index + 1).trim();\r\n headers[key] = val;\r\n }\r\n });\r\n return {\r\n error: err,\r\n statusCode: xhr.status,\r\n statusMessage: xhr.statusText,\r\n headers: headers,\r\n body: body,\r\n };\r\n};\r\n\r\nvar xhrBody = function (xhr, dataType) {\r\n return !dataType && dataType === 'text' ? xhr.responseText : xhr.response;\r\n};\r\n\r\nvar request = function (opt, callback) {\r\n\r\n // method\r\n var method = (opt.method || 'GET').toUpperCase();\r\n\r\n // url、qs\r\n var url = opt.url;\r\n if (opt.qs) {\r\n var qsStr = queryStringify(opt.qs);\r\n if (qsStr) {\r\n url += (url.indexOf('?') === -1 ? '?' : '&') + qsStr;\r\n }\r\n }\r\n\r\n // 创建 ajax 实例\r\n var xhr = new XMLHttpRequest();\r\n xhr.open(method, url, true);\r\n xhr.responseType = opt.dataType || 'text';\r\n\r\n // 处理 headers\r\n var headers = opt.headers;\r\n if (headers) {\r\n for (var key in headers) {\r\n if (headers.hasOwnProperty(key) &&\r\n key.toLowerCase() !== 'content-length' &&\r\n key.toLowerCase() !== 'user-agent' &&\r\n key.toLowerCase() !== 'origin' &&\r\n key.toLowerCase() !== 'host') {\r\n xhr.setRequestHeader(key, headers[key]);\r\n }\r\n }\r\n }\r\n\r\n // onprogress\r\n if (opt.onProgress && xhr.upload) xhr.upload.onprogress = opt.onProgress;\r\n if (opt.onDownloadProgress) xhr.onprogress = opt.onDownloadProgress;\r\n\r\n // success 2xx/3xx/4xx\r\n xhr.onload = function () {\r\n callback(xhrRes(null, xhr, xhrBody(xhr, opt.dataType)));\r\n };\r\n\r\n // error 5xx/0 (网络错误、跨域报错、Https connect-src 限制的报错时 statusCode 为 0)\r\n xhr.onerror = function (err) {\r\n var body = xhrBody(xhr, opt.dataType);\r\n if (body) { // 5xx\r\n callback(xhrRes(null, xhr, body));\r\n } else { // 0\r\n var error = xhr.statusText;\r\n if (!error && xhr.status === 0) error = new Error('CORS blocked or network error');\r\n callback(xhrRes(error, xhr, body));\r\n }\r\n };\r\n\r\n // send\r\n xhr.send(opt.body || '');\r\n\r\n // 返回 ajax 实例,用于外部调用 xhr.abort\r\n return xhr;\r\n};\r\n\r\nmodule.exports = request;\r\n","//[4] \tNameStartChar\t ::= \t\":\" | [A-Z] | \"_\" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF]\r\n//[4a] \tNameChar\t ::= \tNameStartChar | \"-\" | \".\" | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]\r\n//[5] \tName\t ::= \tNameStartChar (NameChar)*\r\nvar nameStartChar = /[A-Z_a-z\\xC0-\\xD6\\xD8-\\xF6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD]///\\u10000-\\uEFFFF\r\nvar nameChar = new RegExp(\"[\\\\-\\\\.0-9\"+nameStartChar.source.slice(1,-1)+\"\\\\u00B7\\\\u0300-\\\\u036F\\\\u203F-\\\\u2040]\");\r\nvar tagNamePattern = new RegExp('^'+nameStartChar.source+nameChar.source+'*(?:\\:'+nameStartChar.source+nameChar.source+'*)?$');\r\n//var tagNamePattern = /^[a-zA-Z_][\\w\\-\\.]*(?:\\:[a-zA-Z_][\\w\\-\\.]*)?$/\r\n//var handlers = 'resolveEntity,getExternalSubset,characters,endDocument,endElement,endPrefixMapping,ignorableWhitespace,processingInstruction,setDocumentLocator,skippedEntity,startDocument,startElement,startPrefixMapping,notationDecl,unparsedEntityDecl,error,fatalError,warning,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,comment,endCDATA,endDTD,endEntity,startCDATA,startDTD,startEntity'.split(',')\r\n\r\n//S_TAG,\tS_ATTR,\tS_EQ,\tS_ATTR_NOQUOT_VALUE\r\n//S_ATTR_SPACE,\tS_ATTR_END,\tS_TAG_SPACE, S_TAG_CLOSE\r\nvar S_TAG = 0;//tag name offerring\r\nvar S_ATTR = 1;//attr name offerring \r\nvar S_ATTR_SPACE=2;//attr name end and space offer\r\nvar S_EQ = 3;//=space?\r\nvar S_ATTR_NOQUOT_VALUE = 4;//attr value(no quot value only)\r\nvar S_ATTR_END = 5;//attr value end and no space(quot end)\r\nvar S_TAG_SPACE = 6;//(attr value end || tag end ) && (space offer)\r\nvar S_TAG_CLOSE = 7;//closed el\r\n\r\nfunction XMLReader(){\r\n\t\r\n}\r\n\r\nXMLReader.prototype = {\r\n\tparse:function(source,defaultNSMap,entityMap){\r\n\t\tvar domBuilder = this.domBuilder;\r\n\t\tdomBuilder.startDocument();\r\n\t\t_copy(defaultNSMap ,defaultNSMap = {})\r\n\t\tparse(source,defaultNSMap,entityMap,\r\n\t\t\t\tdomBuilder,this.errorHandler);\r\n\t\tdomBuilder.endDocument();\r\n\t}\r\n}\r\nfunction parse(source,defaultNSMapCopy,entityMap,domBuilder,errorHandler){\r\n\tfunction fixedFromCharCode(code) {\r\n\t\t// String.prototype.fromCharCode does not supports\r\n\t\t// > 2 bytes unicode chars directly\r\n\t\tif (code > 0xffff) {\r\n\t\t\tcode -= 0x10000;\r\n\t\t\tvar surrogate1 = 0xd800 + (code >> 10)\r\n\t\t\t\t, surrogate2 = 0xdc00 + (code & 0x3ff);\r\n\r\n\t\t\treturn String.fromCharCode(surrogate1, surrogate2);\r\n\t\t} else {\r\n\t\t\treturn String.fromCharCode(code);\r\n\t\t}\r\n\t}\r\n\tfunction entityReplacer(a){\r\n\t\tvar k = a.slice(1,-1);\r\n\t\tif(k in entityMap){\r\n\t\t\treturn entityMap[k]; \r\n\t\t}else if(k.charAt(0) === '#'){\r\n\t\t\treturn fixedFromCharCode(parseInt(k.substr(1).replace('x','0x')))\r\n\t\t}else{\r\n\t\t\terrorHandler.error('entity not found:'+a);\r\n\t\t\treturn a;\r\n\t\t}\r\n\t}\r\n\tfunction appendText(end){//has some bugs\r\n\t\tif(end>start){\r\n\t\t\tvar xt = source.substring(start,end).replace(/&#?\\w+;/g,entityReplacer);\r\n\t\t\tlocator&&position(start);\r\n\t\t\tdomBuilder.characters(xt,0,end-start);\r\n\t\t\tstart = end\r\n\t\t}\r\n\t}\r\n\tfunction position(p,m){\r\n\t\twhile(p>=lineEnd && (m = linePattern.exec(source))){\r\n\t\t\tlineStart = m.index;\r\n\t\t\tlineEnd = lineStart + m[0].length;\r\n\t\t\tlocator.lineNumber++;\r\n\t\t\t//console.log('line++:',locator,startPos,endPos)\r\n\t\t}\r\n\t\tlocator.columnNumber = p-lineStart+1;\r\n\t}\r\n\tvar lineStart = 0;\r\n\tvar lineEnd = 0;\r\n\tvar linePattern = /.*(?:\\r\\n?|\\n)|.*$/g\r\n\tvar locator = domBuilder.locator;\r\n\t\r\n\tvar parseStack = [{currentNSMap:defaultNSMapCopy}]\r\n\tvar closeMap = {};\r\n\tvar start = 0;\r\n\twhile(true){\r\n\t\ttry{\r\n\t\t\tvar tagStart = source.indexOf('<',start);\r\n\t\t\tif(tagStart<0){\r\n\t\t\t\tif(!source.substr(start).match(/^\\s*$/)){\r\n\t\t\t\t\tvar doc = domBuilder.doc;\r\n\t \t\t\tvar text = doc.createTextNode(source.substr(start));\r\n\t \t\t\tdoc.appendChild(text);\r\n\t \t\t\tdomBuilder.currentElement = text;\r\n\t\t\t\t}\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tif(tagStart>start){\r\n\t\t\t\tappendText(tagStart);\r\n\t\t\t}\r\n\t\t\tswitch(source.charAt(tagStart+1)){\r\n\t\t\tcase '/':\r\n\t\t\t\tvar end = source.indexOf('>',tagStart+3);\r\n\t\t\t\tvar tagName = source.substring(tagStart+2,end);\r\n\t\t\t\tvar config = parseStack.pop();\r\n\t\t\t\tif(end<0){\r\n\t\t\t\t\t\r\n\t \t\ttagName = source.substring(tagStart+2).replace(/[\\s<].*/,'');\r\n\t \t\t//console.error('#@@@@@@'+tagName)\r\n\t \t\terrorHandler.error(\"end tag name: \"+tagName+' is not complete:'+config.tagName);\r\n\t \t\tend = tagStart+1+tagName.length;\r\n\t \t}else if(tagName.match(/\\s\r\n\t\t\t\tlocator&&position(tagStart);\r\n\t\t\t\tend = parseInstruction(source,tagStart,domBuilder);\r\n\t\t\t\tbreak;\r\n\t\t\tcase '!':// start){\r\n\t\t\tstart = end;\r\n\t\t}else{\r\n\t\t\t//TODO: 这里有可能sax回退,有位置错误风险\r\n\t\t\tappendText(Math.max(tagStart,start)+1);\r\n\t\t}\r\n\t}\r\n}\r\nfunction copyLocator(f,t){\r\n\tt.lineNumber = f.lineNumber;\r\n\tt.columnNumber = f.columnNumber;\r\n\treturn t;\r\n}\r\n\r\n/**\r\n * @see #appendElement(source,elStartEnd,el,selfClosed,entityReplacer,domBuilder,parseStack);\r\n * @return end of the elementStartPart(end of elementEndPart for selfClosed el)\r\n */\r\nfunction parseElementStartPart(source,start,el,currentNSMap,entityReplacer,errorHandler){\r\n\tvar attrName;\r\n\tvar value;\r\n\tvar p = ++start;\r\n\tvar s = S_TAG;//status\r\n\twhile(true){\r\n\t\tvar c = source.charAt(p);\r\n\t\tswitch(c){\r\n\t\tcase '=':\r\n\t\t\tif(s === S_ATTR){//attrName\r\n\t\t\t\tattrName = source.slice(start,p);\r\n\t\t\t\ts = S_EQ;\r\n\t\t\t}else if(s === S_ATTR_SPACE){\r\n\t\t\t\ts = S_EQ;\r\n\t\t\t}else{\r\n\t\t\t\t//fatalError: equal must after attrName or space after attrName\r\n\t\t\t\tthrow new Error('attribute equal must after attrName');\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase '\\'':\r\n\t\tcase '\"':\r\n\t\t\tif(s === S_EQ || s === S_ATTR //|| s == S_ATTR_SPACE\r\n\t\t\t\t){//equal\r\n\t\t\t\tif(s === S_ATTR){\r\n\t\t\t\t\terrorHandler.warning('attribute value must after \"=\"')\r\n\t\t\t\t\tattrName = source.slice(start,p)\r\n\t\t\t\t}\r\n\t\t\t\tstart = p+1;\r\n\t\t\t\tp = source.indexOf(c,start)\r\n\t\t\t\tif(p>0){\r\n\t\t\t\t\tvalue = source.slice(start,p).replace(/&#?\\w+;/g,entityReplacer);\r\n\t\t\t\t\tel.add(attrName,value,start-1);\r\n\t\t\t\t\ts = S_ATTR_END;\r\n\t\t\t\t}else{\r\n\t\t\t\t\t//fatalError: no end quot match\r\n\t\t\t\t\tthrow new Error('attribute value no end \\''+c+'\\' match');\r\n\t\t\t\t}\r\n\t\t\t}else if(s == S_ATTR_NOQUOT_VALUE){\r\n\t\t\t\tvalue = source.slice(start,p).replace(/&#?\\w+;/g,entityReplacer);\r\n\t\t\t\t//console.log(attrName,value,start,p)\r\n\t\t\t\tel.add(attrName,value,start);\r\n\t\t\t\t//console.dir(el)\r\n\t\t\t\terrorHandler.warning('attribute \"'+attrName+'\" missed start quot('+c+')!!');\r\n\t\t\t\tstart = p+1;\r\n\t\t\t\ts = S_ATTR_END\r\n\t\t\t}else{\r\n\t\t\t\t//fatalError: no equal before\r\n\t\t\t\tthrow new Error('attribute value must after \"=\"');\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase '/':\r\n\t\t\tswitch(s){\r\n\t\t\tcase S_TAG:\r\n\t\t\t\tel.setTagName(source.slice(start,p));\r\n\t\t\tcase S_ATTR_END:\r\n\t\t\tcase S_TAG_SPACE:\r\n\t\t\tcase S_TAG_CLOSE:\r\n\t\t\t\ts =S_TAG_CLOSE;\r\n\t\t\t\tel.closed = true;\r\n\t\t\tcase S_ATTR_NOQUOT_VALUE:\r\n\t\t\tcase S_ATTR:\r\n\t\t\tcase S_ATTR_SPACE:\r\n\t\t\t\tbreak;\r\n\t\t\t//case S_EQ:\r\n\t\t\tdefault:\r\n\t\t\t\tthrow new Error(\"attribute invalid close char('/')\")\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase ''://end document\r\n\t\t\t//throw new Error('unexpected end of input')\r\n\t\t\terrorHandler.error('unexpected end of input');\r\n\t\t\tif(s == S_TAG){\r\n\t\t\t\tel.setTagName(source.slice(start,p));\r\n\t\t\t}\r\n\t\t\treturn p;\r\n\t\tcase '>':\r\n\t\t\tswitch(s){\r\n\t\t\tcase S_TAG:\r\n\t\t\t\tel.setTagName(source.slice(start,p));\r\n\t\t\tcase S_ATTR_END:\r\n\t\t\tcase S_TAG_SPACE:\r\n\t\t\tcase S_TAG_CLOSE:\r\n\t\t\t\tbreak;//normal\r\n\t\t\tcase S_ATTR_NOQUOT_VALUE://Compatible state\r\n\t\t\tcase S_ATTR:\r\n\t\t\t\tvalue = source.slice(start,p);\r\n\t\t\t\tif(value.slice(-1) === '/'){\r\n\t\t\t\t\tel.closed = true;\r\n\t\t\t\t\tvalue = value.slice(0,-1)\r\n\t\t\t\t}\r\n\t\t\tcase S_ATTR_SPACE:\r\n\t\t\t\tif(s === S_ATTR_SPACE){\r\n\t\t\t\t\tvalue = attrName;\r\n\t\t\t\t}\r\n\t\t\t\tif(s == S_ATTR_NOQUOT_VALUE){\r\n\t\t\t\t\terrorHandler.warning('attribute \"'+value+'\" missed quot(\")!!');\r\n\t\t\t\t\tel.add(attrName,value.replace(/&#?\\w+;/g,entityReplacer),start)\r\n\t\t\t\t}else{\r\n\t\t\t\t\tif(currentNSMap[''] !== 'http://www.w3.org/1999/xhtml' || !value.match(/^(?:disabled|checked|selected)$/i)){\r\n\t\t\t\t\t\terrorHandler.warning('attribute \"'+value+'\" missed value!! \"'+value+'\" instead!!')\r\n\t\t\t\t\t}\r\n\t\t\t\t\tel.add(value,value,start)\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\tcase S_EQ:\r\n\t\t\t\tthrow new Error('attribute value missed!!');\r\n\t\t\t}\r\n//\t\t\tconsole.log(tagName,tagNamePattern,tagNamePattern.test(tagName))\r\n\t\t\treturn p;\r\n\t\t/*xml space '\\x20' | #x9 | #xD | #xA; */\r\n\t\tcase '\\u0080':\r\n\t\t\tc = ' ';\r\n\t\tdefault:\r\n\t\t\tif(c<= ' '){//space\r\n\t\t\t\tswitch(s){\r\n\t\t\t\tcase S_TAG:\r\n\t\t\t\t\tel.setTagName(source.slice(start,p));//tagName\r\n\t\t\t\t\ts = S_TAG_SPACE;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase S_ATTR:\r\n\t\t\t\t\tattrName = source.slice(start,p)\r\n\t\t\t\t\ts = S_ATTR_SPACE;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase S_ATTR_NOQUOT_VALUE:\r\n\t\t\t\t\tvar value = source.slice(start,p).replace(/&#?\\w+;/g,entityReplacer);\r\n\t\t\t\t\terrorHandler.warning('attribute \"'+value+'\" missed quot(\")!!');\r\n\t\t\t\t\tel.add(attrName,value,start)\r\n\t\t\t\tcase S_ATTR_END:\r\n\t\t\t\t\ts = S_TAG_SPACE;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t//case S_TAG_SPACE:\r\n\t\t\t\t//case S_EQ:\r\n\t\t\t\t//case S_ATTR_SPACE:\r\n\t\t\t\t//\tvoid();break;\r\n\t\t\t\t//case S_TAG_CLOSE:\r\n\t\t\t\t\t//ignore warning\r\n\t\t\t\t}\r\n\t\t\t}else{//not space\r\n//S_TAG,\tS_ATTR,\tS_EQ,\tS_ATTR_NOQUOT_VALUE\r\n//S_ATTR_SPACE,\tS_ATTR_END,\tS_TAG_SPACE, S_TAG_CLOSE\r\n\t\t\t\tswitch(s){\r\n\t\t\t\t//case S_TAG:void();break;\r\n\t\t\t\t//case S_ATTR:void();break;\r\n\t\t\t\t//case S_ATTR_NOQUOT_VALUE:void();break;\r\n\t\t\t\tcase S_ATTR_SPACE:\r\n\t\t\t\t\tvar tagName = el.tagName;\r\n\t\t\t\t\tif(currentNSMap[''] !== 'http://www.w3.org/1999/xhtml' || !attrName.match(/^(?:disabled|checked|selected)$/i)){\r\n\t\t\t\t\t\terrorHandler.warning('attribute \"'+attrName+'\" missed value!! \"'+attrName+'\" instead2!!')\r\n\t\t\t\t\t}\r\n\t\t\t\t\tel.add(attrName,attrName,start);\r\n\t\t\t\t\tstart = p;\r\n\t\t\t\t\ts = S_ATTR;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase S_ATTR_END:\r\n\t\t\t\t\terrorHandler.warning('attribute space is required\"'+attrName+'\"!!')\r\n\t\t\t\tcase S_TAG_SPACE:\r\n\t\t\t\t\ts = S_ATTR;\r\n\t\t\t\t\tstart = p;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase S_EQ:\r\n\t\t\t\t\ts = S_ATTR_NOQUOT_VALUE;\r\n\t\t\t\t\tstart = p;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase S_TAG_CLOSE:\r\n\t\t\t\t\tthrow new Error(\"elements closed character '/' and '>' must be connected to\");\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}//end outer switch\r\n\t\t//console.log('p++',p)\r\n\t\tp++;\r\n\t}\r\n}\r\n/**\r\n * @return true if has new namespace define\r\n */\r\nfunction appendElement(el,domBuilder,currentNSMap){\r\n\tvar tagName = el.tagName;\r\n\tvar localNSMap = null;\r\n\t//var currentNSMap = parseStack[parseStack.length-1].currentNSMap;\r\n\tvar i = el.length;\r\n\twhile(i--){\r\n\t\tvar a = el[i];\r\n\t\tvar qName = a.qName;\r\n\t\tvar value = a.value;\r\n\t\tvar nsp = qName.indexOf(':');\r\n\t\tif(nsp>0){\r\n\t\t\tvar prefix = a.prefix = qName.slice(0,nsp);\r\n\t\t\tvar localName = qName.slice(nsp+1);\r\n\t\t\tvar nsPrefix = prefix === 'xmlns' && localName\r\n\t\t}else{\r\n\t\t\tlocalName = qName;\r\n\t\t\tprefix = null\r\n\t\t\tnsPrefix = qName === 'xmlns' && ''\r\n\t\t}\r\n\t\t//can not set prefix,because prefix !== ''\r\n\t\ta.localName = localName ;\r\n\t\t//prefix == null for no ns prefix attribute \r\n\t\tif(nsPrefix !== false){//hack!!\r\n\t\t\tif(localNSMap == null){\r\n\t\t\t\tlocalNSMap = {}\r\n\t\t\t\t//console.log(currentNSMap,0)\r\n\t\t\t\t_copy(currentNSMap,currentNSMap={})\r\n\t\t\t\t//console.log(currentNSMap,1)\r\n\t\t\t}\r\n\t\t\tcurrentNSMap[nsPrefix] = localNSMap[nsPrefix] = value;\r\n\t\t\ta.uri = 'http://www.w3.org/2000/xmlns/'\r\n\t\t\tdomBuilder.startPrefixMapping(nsPrefix, value) \r\n\t\t}\r\n\t}\r\n\tvar i = el.length;\r\n\twhile(i--){\r\n\t\ta = el[i];\r\n\t\tvar prefix = a.prefix;\r\n\t\tif(prefix){//no prefix attribute has no namespace\r\n\t\t\tif(prefix === 'xml'){\r\n\t\t\t\ta.uri = 'http://www.w3.org/XML/1998/namespace';\r\n\t\t\t}if(prefix !== 'xmlns'){\r\n\t\t\t\ta.uri = currentNSMap[prefix || '']\r\n\t\t\t\t\r\n\t\t\t\t//{console.log('###'+a.qName,domBuilder.locator.systemId+'',currentNSMap,a.uri)}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tvar nsp = tagName.indexOf(':');\r\n\tif(nsp>0){\r\n\t\tprefix = el.prefix = tagName.slice(0,nsp);\r\n\t\tlocalName = el.localName = tagName.slice(nsp+1);\r\n\t}else{\r\n\t\tprefix = null;//important!!\r\n\t\tlocalName = el.localName = tagName;\r\n\t}\r\n\t//no prefix element has default namespace\r\n\tvar ns = el.uri = currentNSMap[prefix || ''];\r\n\tdomBuilder.startElement(ns,localName,tagName,el);\r\n\t//endPrefixMapping and startPrefixMapping have not any help for dom builder\r\n\t//localNSMap = null\r\n\tif(el.closed){\r\n\t\tdomBuilder.endElement(ns,localName,tagName);\r\n\t\tif(localNSMap){\r\n\t\t\tfor(prefix in localNSMap){\r\n\t\t\t\tdomBuilder.endPrefixMapping(prefix) \r\n\t\t\t}\r\n\t\t}\r\n\t}else{\r\n\t\tel.currentNSMap = currentNSMap;\r\n\t\tel.localNSMap = localNSMap;\r\n\t\t//parseStack.push(el);\r\n\t\treturn true;\r\n\t}\r\n}\r\nfunction parseHtmlSpecialContent(source,elStartEnd,tagName,entityReplacer,domBuilder){\r\n\tif(/^(?:script|textarea)$/i.test(tagName)){\r\n\t\tvar elEndStart = source.indexOf('',elStartEnd);\r\n\t\tvar text = source.substring(elStartEnd+1,elEndStart);\r\n\t\tif(/[&<]/.test(text)){\r\n\t\t\tif(/^script$/i.test(tagName)){\r\n\t\t\t\t//if(!/\\]\\]>/.test(text)){\r\n\t\t\t\t\t//lexHandler.startCDATA();\r\n\t\t\t\t\tdomBuilder.characters(text,0,text.length);\r\n\t\t\t\t\t//lexHandler.endCDATA();\r\n\t\t\t\t\treturn elEndStart;\r\n\t\t\t\t//}\r\n\t\t\t}//}else{//text area\r\n\t\t\t\ttext = text.replace(/&#?\\w+;/g,entityReplacer);\r\n\t\t\t\tdomBuilder.characters(text,0,text.length);\r\n\t\t\t\treturn elEndStart;\r\n\t\t\t//}\r\n\t\t\t\r\n\t\t}\r\n\t}\r\n\treturn elStartEnd+1;\r\n}\r\nfunction fixSelfClosed(source,elStartEnd,tagName,closeMap){\r\n\t//if(tagName in closeMap){\r\n\tvar pos = closeMap[tagName];\r\n\tif(pos == null){\r\n\t\t//console.log(tagName)\r\n\t\tpos = source.lastIndexOf('')\r\n\t\tif(pos',start+4);\r\n\t\t\t//append comment source.substring(4,end)//