1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288 |
- //
- // OSSUtil.m
- // oss_ios_sdk
- //
- // Created by zhouzhuo on 8/16/15.
- // Copyright (c) 2015 aliyun.com. All rights reserved.
- //
- #import "OSSUtil.h"
- #import <mach/mach.h>
- #import "CommonCrypto/CommonDigest.h"
- #import "CommonCrypto/CommonHMAC.h"
- #import "OSSModel.h"
- #import "OSSLog.h"
- #import "OSSHttpdns.h"
- #import "OSSIPv6Adapter.h"
- #import "OSSReachability.h"
- #import <CoreTelephony/CTCarrier.h>
- #import <CoreTelephony/CTTelephonyNetworkInfo.h>
- #import "aos_crc64.h"
- NSString * const ALIYUN_HOST_SUFFIX = @".aliyuncs.com";
- NSString * const ALIYUN_OSS_TEST_ENDPOINT = @".aliyun-inc.com";
- int32_t const CHUNK_SIZE = 8 * 1024;
- @implementation OSSUtil
- + (NSString *)calBase64Sha1WithData:(NSString *)data withSecret:(NSString *)key {
- NSData *secretData = [key dataUsingEncoding:NSUTF8StringEncoding];
- NSData *clearTextData = [data dataUsingEncoding:NSUTF8StringEncoding];
- uint8_t input[20];
- CCHmac(kCCHmacAlgSHA1, [secretData bytes], [secretData length], [clearTextData bytes], [clearTextData length], input);
- return [self calBase64WithData:input];
- }
- + (NSString*)calBase64WithData:(uint8_t *)data {
- static char b[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
- NSInteger a = 20;
- NSMutableData* c = [NSMutableData dataWithLength:((a + 2) / 3) * 4];
- uint8_t* d = (uint8_t*)c.mutableBytes;
- NSInteger i;
- for (i=0; i < a; i += 3) {
- NSInteger e = 0;
- NSInteger j;
- for (j = i; j < (i + 3); j++) {
- e <<= 8;
- if (j < a) {
- e |= (0xFF & data[j]);
- }
- }
- NSInteger index = (i / 3) * 4;
- d[index + 0] = b[(e >> 18) & 0x3F];
- d[index + 1] = b[(e >> 12) & 0x3F];
- if ((i + 1) < a) {
- d[index + 2] = b[(e >> 6) & 0x3F];
- } else {
- d[index + 2] = '=';
- }
- if ((i + 2) < a) {
- d[index + 3] = b[(e >> 0) & 0x3F];
- } else {
- d[index + 3] = '=';
- }
- }
- NSString *result = [[NSString alloc] initWithData:c encoding:NSASCIIStringEncoding];
- return result;
- }
- + (NSString *)encodeURL:(NSString *)url {
- //保持和android处理方式一致,添加+ -> %20,* -> %2A,%7E -> ~, "%2F" -> /
- NSMutableString *output = [NSMutableString string];
- const unsigned char *source = (const unsigned char *)[url UTF8String];
- NSUInteger sourceLen = strlen((const char *)source);
- for (int i = 0; i < sourceLen; ++i) {
- const unsigned char thisChar = source[i];
- if (thisChar == ' ') {
- [output appendString:@"%20"];
- } else if (thisChar == '*') {
- [output appendString:@"%2A"];
- } else if (thisChar == '.' || thisChar == '-' || thisChar == '_' || thisChar == '~' ||
- (thisChar >= 'a' && thisChar <= 'z') ||
- (thisChar >= 'A' && thisChar <= 'Z') ||
- (thisChar >= '0' && thisChar <= '9')) {
- [output appendFormat:@"%c", thisChar];
- } else {
- [output appendFormat:@"%%%02X", thisChar];
- }
- }
- NSString *encodeUrl = [output stringByReplacingOccurrencesOfString:@"%2F" withString:@"/"];
- encodeUrl = [encodeUrl stringByReplacingOccurrencesOfString:@"%7E" withString:@"~"];
- return encodeUrl;
-
- // 不要用系统urlencode 的方式,很多特殊字符都没有转化;
- // 详见:https://stackoverflow.com/questions/8088473/how-do-i-url-encode-a-string
- }
- + (NSData *)constructHttpBodyFromPartInfos:(NSArray *)partInfos {
- NSMutableString * body = [NSMutableString stringWithString:@"<CompleteMultipartUpload>\n"];
- [partInfos enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
- if ([obj isKindOfClass:[OSSPartInfo class]]) {
- OSSPartInfo * thePart = obj;
- [body appendFormat:@"<Part>\n<PartNumber>%d</PartNumber>\n<ETag>%@</ETag>\n</Part>\n", thePart.partNum, thePart.eTag];
- }
- }];
- [body appendString:@"</CompleteMultipartUpload>\n"];
- OSSLogVerbose(@"constucted complete multipart upload body:\n%@", body);
- return [body dataUsingEncoding:NSUTF8StringEncoding];
- }
- + (NSData *)constructHttpBodyForDeleteMultipleObjects:(NSArray<NSString *> *)keys quiet:(BOOL)quiet {
- NSMutableString * body = [NSMutableString stringWithString:@"<Delete>\n"];
- [body appendFormat:@"<Quiet>%@</Quiet>\n",quiet?@"true":@"false"];
- [keys enumerateObjectsUsingBlock:^(NSString *key, NSUInteger idx, BOOL *stop) {
- [body appendFormat:@"<Object>\n<Key>%@</Key>\n</Object>\n", key];
- }];
- [body appendString:@"</Delete>\n"];
- OSSLogVerbose(@"constucted delete multiple objects body:\n%@", body);
- return [body dataUsingEncoding:NSUTF8StringEncoding];
- }
- + (NSData *)constructHttpBodyForCreateBucketWithLocation:(NSString *)location {
- NSString * body = [NSString stringWithFormat:@"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
- @"<CreateBucketConfiguration>\n"
- @"<LocationConstraint>%@</LocationConstraint>\n"
- @"</CreateBucketConfiguration>\n",
- location];
- OSSLogVerbose(@"constucted create bucket body:\n%@", body);
- return [body dataUsingEncoding:NSUTF8StringEncoding];
- }
- + (BOOL)validateBucketName:(NSString *)bucketName {
- if (bucketName == nil) {
- return false;
- }
- static NSRegularExpression *regEx;
- static dispatch_once_t onceToken;
- dispatch_once(&onceToken, ^{
- regEx = [[NSRegularExpression alloc] initWithPattern:@"^[a-z0-9][a-z0-9\\-]{1,61}[a-z0-9]$" options:NSRegularExpressionCaseInsensitive error:nil];
- });
- NSUInteger regExMatches = [regEx numberOfMatchesInString:bucketName options:0 range:NSMakeRange(0, [bucketName length])];
- return regExMatches != 0;
- }
- + (BOOL)validateObjectKey:(NSString *)objectKey {
- if (objectKey == nil) {
- return false;
- }
- if (objectKey.length <= 0 || objectKey.length > 1023) {
- return false;
- }
- if (![objectKey canBeConvertedToEncoding:NSUTF8StringEncoding]) {
- return false;
- }
- unichar firstChar = [objectKey characterAtIndex:0];
- if (firstChar == '/' || firstChar == '\\') {
- return false;
- }
- return true;
- }
- + (NSString *)getIpByHost:(NSString *)host {
- if ([self isNetworkDelegateState]) {
- OSSLogDebug(@"current network is delegate state");
- return host;
- }
- NSString * ip = [[OSSHttpdns sharedInstance] asynGetIpByHost:host];
- OSSLogDebug(@"resolved host %@ and get ip: %@", host, ip);
- return ip ? [[OSSIPv6Adapter getInstance] handleIpv4Address:ip] : host;
- }
- + (BOOL)isNetworkDelegateState {
- NSURL* URL = [[NSURL alloc] initWithString:@"https://m.aliyun.com"];
- NSDictionary *proxySettings = CFBridgingRelease(CFNetworkCopySystemProxySettings());
- NSArray *proxies = nil;
- proxies = CFBridgingRelease(CFNetworkCopyProxiesForURL((__bridge CFURLRef)URL,
- (__bridge CFDictionaryRef)proxySettings));
- if (proxies.count) {
- NSDictionary *settings = [proxies objectAtIndex:0];
- NSString* host = [settings objectForKey:(NSString *)kCFProxyHostNameKey];
- NSNumber* port = [settings objectForKey:(NSString *)kCFProxyPortNumberKey];
- if (host && port) {
- return YES;
- }
- }
- return NO;
- }
- + (BOOL)isOssOriginBucketHost:(NSString *)host {
- return [[host lowercaseString] hasSuffix:ALIYUN_HOST_SUFFIX] || [[host lowercaseString] hasSuffix:ALIYUN_OSS_TEST_ENDPOINT];
- }
- + (NSString *)base64Md5ForData:(NSData *)data {
- uint8_t * bytes = (uint8_t *)[[self dataMD5:data] bytes];
- return [self base64ForData:bytes length:CC_MD5_DIGEST_LENGTH];
- }
- + (NSString *)base64Md5ForFilePath:(NSString *)filePath {
- uint8_t * bytes = (uint8_t *)[[self fileMD5:filePath] bytes];
- return [self base64ForData:bytes length:CC_MD5_DIGEST_LENGTH];
- }
- + (NSString *)base64Md5ForFileURL:(NSURL *)fileURL {
- return [self base64Md5ForFilePath:[fileURL path]];
- }
- + (NSData *)dataMD5:(NSData *)data {
- if(data == nil) {
- return nil;
- }
- CC_MD5_CTX md5;
- CC_MD5_Init(&md5);
- for (int i = 0; i < data.length; i += CHUNK_SIZE) {
- NSData *subdata = nil;
- if (i <= ((long)data.length - CHUNK_SIZE)) {
- subdata = [data subdataWithRange:NSMakeRange(i, CHUNK_SIZE)];
- CC_MD5_Update(&md5, [subdata bytes], (CC_LONG)[subdata length]);
- } else {
- subdata = [data subdataWithRange:NSMakeRange(i, data.length - i)];
- CC_MD5_Update(&md5, [subdata bytes], (CC_LONG)[subdata length]);
- }
- }
- unsigned char digestResult[CC_MD5_DIGEST_LENGTH * sizeof(unsigned char)];
- CC_MD5_Final(digestResult, &md5);
- return [NSData dataWithBytes:(const void *)digestResult length:CC_MD5_DIGEST_LENGTH * sizeof(unsigned char)];
- }
- + (NSData *)fileMD5:(NSString*)path {
- NSFileHandle *handle = [NSFileHandle fileHandleForReadingAtPath:path];
- if(handle == nil) {
- return nil;
- }
- CC_MD5_CTX md5;
- CC_MD5_Init(&md5);
- BOOL done = NO;
- while(!done) {
- @autoreleasepool{
- NSData* fileData = [handle readDataOfLength: CHUNK_SIZE];
- CC_MD5_Update(&md5, [fileData bytes], (CC_LONG)[fileData length]);
- if([fileData length] == 0) {
- done = YES;
- }
- }
- }
- unsigned char digestResult[CC_MD5_DIGEST_LENGTH * sizeof(unsigned char)];
- CC_MD5_Final(digestResult, &md5);
- return [NSData dataWithBytes:(const void *)digestResult length:CC_MD5_DIGEST_LENGTH * sizeof(unsigned char)];
- }
- + (NSString *)convertMd5Bytes2String:(unsigned char *)md5Bytes {
- return [NSString stringWithFormat:
- @"%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X",
- md5Bytes[0], md5Bytes[1], md5Bytes[2], md5Bytes[3],
- md5Bytes[4], md5Bytes[5], md5Bytes[6], md5Bytes[7],
- md5Bytes[8], md5Bytes[9], md5Bytes[10], md5Bytes[11],
- md5Bytes[12], md5Bytes[13], md5Bytes[14], md5Bytes[15]
- ];
- }
- + (NSString *)dataMD5String:(NSData *)data {
- unsigned char * md5Bytes = (unsigned char *)[[self dataMD5:data] bytes];
- return [self convertMd5Bytes2String:md5Bytes];
- }
- + (NSString *)fileMD5String:(NSString *)path {
- BOOL isDirectory = NO;
- BOOL isExist = [[NSFileManager defaultManager] fileExistsAtPath:path isDirectory:&isDirectory];
- if (isDirectory || !isExist) {
- OSSLogWarn(@"a file doesn't exists at a specified path(%@)", path);
- return nil;
- }
- unsigned char * md5Bytes = (unsigned char *)[[self fileMD5:path] bytes];
- return [self convertMd5Bytes2String:md5Bytes];
- }
- + (NSString*)base64ForData:(uint8_t *)input length:(int32_t)length {
- if (input == nil) {
- return nil;
- }
- NSData * data = [NSData dataWithBytes:input length:length];
- return [data base64EncodedStringWithOptions: NSDataBase64Encoding64CharacterLineLength];
- }
- + (BOOL)isSubresource:(NSString *)param {
- /****************************************************************
- * define a constant array to contain all specified subresource */
- static NSArray * OSSSubResourceARRAY = nil;
- static dispatch_once_t onceToken;
- dispatch_once(&onceToken, ^{
- OSSSubResourceARRAY = @[
- @"acl", @"uploads", @"location", @"cors", @"logging", @"website", @"referer", @"lifecycle", @"delete", @"append",
- @"tagging", @"objectMeta", @"uploadId", @"partNumber", @"security-token", @"position", @"img", @"style",
- @"styleName", @"replication", @"replicationProgress", @"replicationLocation", @"cname", @"bucketInfo", @"comp",
- @"qos", @"live", @"status", @"vod", @"startTime", @"endTime", @"symlink", @"x-oss-process", @"response-content-type",
- @"response-content-language", @"response-expires", @"response-cache-control", @"response-content-disposition", @"response-content-encoding",@"restore"
- ];
- });
- /****************************************************************/
- return [OSSSubResourceARRAY containsObject:param];
- }
- + (NSString *)populateSubresourceStringFromParameter:(NSDictionary *)parameters {
- NSMutableArray * subresource = [NSMutableArray new];
- [parameters enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) {
- NSString * keyStr = [key oss_trim];
- NSString * valueStr = [obj oss_trim];
- if (![OSSUtil isSubresource:keyStr]) {
- return;
- }
- if ([valueStr length] == 0) {
- [subresource addObject:keyStr];
- } else {
- [subresource addObject:[NSString stringWithFormat:@"%@=%@", keyStr, valueStr]];
- }
- }];
- NSArray * sortedSubResource = [subresource sortedArrayUsingSelector:@selector(compare:)]; // 升序
- return [sortedSubResource componentsJoinedByString:@"&"];
- }
- + (NSString *)populateQueryStringFromParameter:(NSDictionary *)parameters {
- NSMutableArray * subresource = [NSMutableArray new];
- [parameters enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) {
- NSString * keyStr = [OSSUtil encodeURL:[key oss_trim]];
- NSString * valueStr = [OSSUtil encodeURL:[obj oss_trim]];
- if ([valueStr length] == 0) {
- [subresource addObject:keyStr];
- } else {
- [subresource addObject:[NSString stringWithFormat:@"%@=%@", keyStr, valueStr]];
- }
- }];
- return [subresource componentsJoinedByString:@"&"];
- }
- + (NSString *)sign:(NSString *)content withToken:(OSSFederationToken *)token {
- NSString * sign = [OSSUtil calBase64Sha1WithData:content withSecret:token.tSecretKey];
- return [NSString stringWithFormat:@"OSS %@:%@", token.tAccessKey, sign];
- }
- + (NSString *)getRelativePath:(NSString *)fullPath {
- NSString * userName = NSUserName();
- NSString * rootPath = NSHomeDirectoryForUser(userName);
- return [fullPath stringByReplacingOccurrencesOfString:rootPath withString:@""];
- }
- + (NSString *)detemineMimeTypeForFilePath:(NSString *)filePath uploadName:(NSString *)uploadName {
- static dispatch_once_t onceToken;
- static NSDictionary * mimeMap;
- dispatch_once(&onceToken, ^{
- mimeMap = @{
- @"aw": @"application/applixware",
- @"atom": @"application/atom+xml",
- @"atomcat": @"application/atomcat+xml",
- @"atomsvc": @"application/atomsvc+xml",
- @"ccxml": @"application/ccxml+xml",
- @"cdmia": @"application/cdmi-capability",
- @"cdmic": @"application/cdmi-container",
- @"cdmid": @"application/cdmi-domain",
- @"cdmio": @"application/cdmi-object",
- @"cdmiq": @"application/cdmi-queue",
- @"cu": @"application/cu-seeme",
- @"davmount": @"application/davmount+xml",
- @"dssc": @"application/dssc+der",
- @"xdssc": @"application/dssc+xml",
- @"es": @"application/ecmascript",
- @"emma": @"application/emma+xml",
- @"epub": @"application/epub+zip",
- @"exi": @"application/exi",
- @"pfr": @"application/font-tdpfr",
- @"stk": @"application/hyperstudio",
- @"ipfix": @"application/ipfix",
- @"jar": @"application/java-archive",
- @"ser": @"application/java-serialized-object",
- @"class": @"application/java-vm",
- @"js": @"application/javascript",
- @"json": @"application/json",
- @"hqx": @"application/mac-binhex40",
- @"cpt": @"application/mac-compactpro",
- @"mads": @"application/mads+xml",
- @"mrc": @"application/marc",
- @"mrcx": @"application/marcxml+xml",
- @"ma": @"application/mathematica",
- @"mathml": @"application/mathml+xml",
- @"mbox": @"application/mbox",
- @"mscml": @"application/mediaservercontrol+xml",
- @"meta4": @"application/metalink4+xml",
- @"mets": @"application/mets+xml",
- @"mods": @"application/mods+xml",
- @"m21": @"application/mp21",
- @"mp4": @"video/mp4",
- @"doc": @"application/msword",
- @"mxf": @"application/mxf",
- @"bin": @"application/octet-stream",
- @"oda": @"application/oda",
- @"opf": @"application/oebps-package+xml",
- @"ogx": @"application/ogg",
- @"onetoc": @"application/onenote",
- @"xer": @"application/patch-ops-error+xml",
- @"pdf": @"application/pdf",
- @"pgp": @"application/pgp-signature",
- @"prf": @"application/pics-rules",
- @"p10": @"application/pkcs10",
- @"p7m": @"application/pkcs7-mime",
- @"p7s": @"application/pkcs7-signature",
- @"p8": @"application/pkcs8",
- @"ac": @"application/pkix-attr-cert",
- @"cer": @"application/pkix-cert",
- @"crl": @"application/pkix-crl",
- @"pkipath": @"application/pkix-pkipath",
- @"pki": @"application/pkixcmp",
- @"pls": @"application/pls+xml",
- @"ai": @"application/postscript",
- @"cww": @"application/prs.cww",
- @"pskcxml": @"application/pskc+xml",
- @"rdf": @"application/rdf+xml",
- @"rif": @"application/reginfo+xml",
- @"rnc": @"application/relax-ng-compact-syntax",
- @"rl": @"application/resource-lists+xml",
- @"rld": @"application/resource-lists-diff+xml",
- @"rs": @"application/rls-services+xml",
- @"rsd": @"application/rsd+xml",
- @"rss": @"application/rss+xml",
- @"rtf": @"application/rtf",
- @"sbml": @"application/sbml+xml",
- @"scq": @"application/scvp-cv-request",
- @"scs": @"application/scvp-cv-response",
- @"spq": @"application/scvp-vp-request",
- @"spp": @"application/scvp-vp-response",
- @"sdp": @"application/sdp",
- @"setpay": @"application/set-payment-initiation",
- @"setreg": @"application/set-registration-initiation",
- @"shf": @"application/shf+xml",
- @"smi": @"application/smil+xml",
- @"rq": @"application/sparql-query",
- @"srx": @"application/sparql-results+xml",
- @"gram": @"application/srgs",
- @"grxml": @"application/srgs+xml",
- @"sru": @"application/sru+xml",
- @"ssml": @"application/ssml+xml",
- @"tei": @"application/tei+xml",
- @"tfi": @"application/thraud+xml",
- @"tsd": @"application/timestamped-data",
- @"plb": @"application/vnd.3gpp.pic-bw-large",
- @"psb": @"application/vnd.3gpp.pic-bw-small",
- @"pvb": @"application/vnd.3gpp.pic-bw-var",
- @"tcap": @"application/vnd.3gpp2.tcap",
- @"pwn": @"application/vnd.3m.post-it-notes",
- @"aso": @"application/vnd.accpac.simply.aso",
- @"imp": @"application/vnd.accpac.simply.imp",
- @"acu": @"application/vnd.acucobol",
- @"atc": @"application/vnd.acucorp",
- @"air": @"application/vnd.adobe.air-application-installer-package+zip",
- @"fxp": @"application/vnd.adobe.fxp",
- @"xdp": @"application/vnd.adobe.xdp+xml",
- @"xfdf": @"application/vnd.adobe.xfdf",
- @"ahead": @"application/vnd.ahead.space",
- @"azf": @"application/vnd.airzip.filesecure.azf",
- @"azs": @"application/vnd.airzip.filesecure.azs",
- @"azw": @"application/vnd.amazon.ebook",
- @"acc": @"application/vnd.americandynamics.acc",
- @"ami": @"application/vnd.amiga.ami",
- @"apk": @"application/vnd.android.package-archive",
- @"cii": @"application/vnd.anser-web-certificate-issue-initiation",
- @"fti": @"application/vnd.anser-web-funds-transfer-initiation",
- @"atx": @"application/vnd.antix.game-component",
- @"mpkg": @"application/vnd.apple.installer+xml",
- @"m3u8": @"application/vnd.apple.mpegurl",
- @"swi": @"application/vnd.aristanetworks.swi",
- @"aep": @"application/vnd.audiograph",
- @"mpm": @"application/vnd.blueice.multipass",
- @"bmi": @"application/vnd.bmi",
- @"rep": @"application/vnd.businessobjects",
- @"cdxml": @"application/vnd.chemdraw+xml",
- @"mmd": @"application/vnd.chipnuts.karaoke-mmd",
- @"cdy": @"application/vnd.cinderella",
- @"cla": @"application/vnd.claymore",
- @"rp9": @"application/vnd.cloanto.rp9",
- @"c4g": @"application/vnd.clonk.c4group",
- @"c11amc": @"application/vnd.cluetrust.cartomobile-config",
- @"c11amz": @"application/vnd.cluetrust.cartomobile-config-pkg",
- @"csp": @"application/vnd.commonspace",
- @"cdbcmsg": @"application/vnd.contact.cmsg",
- @"cmc": @"application/vnd.cosmocaller",
- @"clkx": @"application/vnd.crick.clicker",
- @"clkk": @"application/vnd.crick.clicker.keyboard",
- @"clkp": @"application/vnd.crick.clicker.palette",
- @"clkt": @"application/vnd.crick.clicker.template",
- @"clkw": @"application/vnd.crick.clicker.wordbank",
- @"wbs": @"application/vnd.criticaltools.wbs+xml",
- @"pml": @"application/vnd.ctc-posml",
- @"ppd": @"application/vnd.cups-ppd",
- @"car": @"application/vnd.curl.car",
- @"pcurl": @"application/vnd.curl.pcurl",
- @"rdz": @"application/vnd.data-vision.rdz",
- @"fe_launch": @"application/vnd.denovo.fcselayout-link",
- @"dna": @"application/vnd.dna",
- @"mlp": @"application/vnd.dolby.mlp",
- @"dpg": @"application/vnd.dpgraph",
- @"dfac": @"application/vnd.dreamfactory",
- @"ait": @"application/vnd.dvb.ait",
- @"svc": @"application/vnd.dvb.service",
- @"geo": @"application/vnd.dynageo",
- @"mag": @"application/vnd.ecowin.chart",
- @"nml": @"application/vnd.enliven",
- @"esf": @"application/vnd.epson.esf",
- @"msf": @"application/vnd.epson.msf",
- @"qam": @"application/vnd.epson.quickanime",
- @"slt": @"application/vnd.epson.salt",
- @"ssf": @"application/vnd.epson.ssf",
- @"es3": @"application/vnd.eszigno3+xml",
- @"ez2": @"application/vnd.ezpix-album",
- @"ez3": @"application/vnd.ezpix-package",
- @"fdf": @"application/vnd.fdf",
- @"seed": @"application/vnd.fdsn.seed",
- @"gph": @"application/vnd.flographit",
- @"ftc": @"application/vnd.fluxtime.clip",
- @"fm": @"application/vnd.framemaker",
- @"fnc": @"application/vnd.frogans.fnc",
- @"ltf": @"application/vnd.frogans.ltf",
- @"fsc": @"application/vnd.fsc.weblaunch",
- @"oas": @"application/vnd.fujitsu.oasys",
- @"oa2": @"application/vnd.fujitsu.oasys2",
- @"oa3": @"application/vnd.fujitsu.oasys3",
- @"fg5": @"application/vnd.fujitsu.oasysgp",
- @"bh2": @"application/vnd.fujitsu.oasysprs",
- @"ddd": @"application/vnd.fujixerox.ddd",
- @"xdw": @"application/vnd.fujixerox.docuworks",
- @"xbd": @"application/vnd.fujixerox.docuworks.binder",
- @"fzs": @"application/vnd.fuzzysheet",
- @"txd": @"application/vnd.genomatix.tuxedo",
- @"ggb": @"application/vnd.geogebra.file",
- @"ggt": @"application/vnd.geogebra.tool",
- @"gex": @"application/vnd.geometry-explorer",
- @"gxt": @"application/vnd.geonext",
- @"g2w": @"application/vnd.geoplan",
- @"g3w": @"application/vnd.geospace",
- @"gmx": @"application/vnd.gmx",
- @"kml": @"application/vnd.google-earth.kml+xml",
- @"kmz": @"application/vnd.google-earth.kmz",
- @"gqf": @"application/vnd.grafeq",
- @"gac": @"application/vnd.groove-account",
- @"ghf": @"application/vnd.groove-help",
- @"gim": @"application/vnd.groove-identity-message",
- @"grv": @"application/vnd.groove-injector",
- @"gtm": @"application/vnd.groove-tool-message",
- @"tpl": @"application/vnd.groove-tool-template",
- @"vcg": @"application/vnd.groove-vcard",
- @"hal": @"application/vnd.hal+xml",
- @"zmm": @"application/vnd.handheld-entertainment+xml",
- @"hbci": @"application/vnd.hbci",
- @"les": @"application/vnd.hhe.lesson-player",
- @"hpgl": @"application/vnd.hp-hpgl",
- @"hpid": @"application/vnd.hp-hpid",
- @"hps": @"application/vnd.hp-hps",
- @"jlt": @"application/vnd.hp-jlyt",
- @"pcl": @"application/vnd.hp-pcl",
- @"pclxl": @"application/vnd.hp-pclxl",
- @"sfd-hdstx": @"application/vnd.hydrostatix.sof-data",
- @"x3d": @"application/vnd.hzn-3d-crossword",
- @"mpy": @"application/vnd.ibm.minipay",
- @"afp": @"application/vnd.ibm.modcap",
- @"irm": @"application/vnd.ibm.rights-management",
- @"sc": @"application/vnd.ibm.secure-container",
- @"icc": @"application/vnd.iccprofile",
- @"igl": @"application/vnd.igloader",
- @"ivp": @"application/vnd.immervision-ivp",
- @"ivu": @"application/vnd.immervision-ivu",
- @"igm": @"application/vnd.insors.igm",
- @"xpw": @"application/vnd.intercon.formnet",
- @"i2g": @"application/vnd.intergeo",
- @"qbo": @"application/vnd.intu.qbo",
- @"qfx": @"application/vnd.intu.qfx",
- @"rcprofile": @"application/vnd.ipunplugged.rcprofile",
- @"irp": @"application/vnd.irepository.package+xml",
- @"xpr": @"application/vnd.is-xpr",
- @"fcs": @"application/vnd.isac.fcs",
- @"jam": @"application/vnd.jam",
- @"rms": @"application/vnd.jcp.javame.midlet-rms",
- @"jisp": @"application/vnd.jisp",
- @"joda": @"application/vnd.joost.joda-archive",
- @"ktz": @"application/vnd.kahootz",
- @"karbon": @"application/vnd.kde.karbon",
- @"chrt": @"application/vnd.kde.kchart",
- @"kfo": @"application/vnd.kde.kformula",
- @"flw": @"application/vnd.kde.kivio",
- @"kon": @"application/vnd.kde.kontour",
- @"kpr": @"application/vnd.kde.kpresenter",
- @"ksp": @"application/vnd.kde.kspread",
- @"kwd": @"application/vnd.kde.kword",
- @"htke": @"application/vnd.kenameaapp",
- @"kia": @"application/vnd.kidspiration",
- @"kne": @"application/vnd.kinar",
- @"skp": @"application/vnd.koan",
- @"sse": @"application/vnd.kodak-descriptor",
- @"lasxml": @"application/vnd.las.las+xml",
- @"lbd": @"application/vnd.llamagraphics.life-balance.desktop",
- @"lbe": @"application/vnd.llamagraphics.life-balance.exchange+xml",
- @"123": @"application/vnd.lotus-1-2-3",
- @"apr": @"application/vnd.lotus-approach",
- @"pre": @"application/vnd.lotus-freelance",
- @"nsf": @"application/vnd.lotus-notes",
- @"org": @"application/vnd.lotus-organizer",
- @"scm": @"application/vnd.lotus-screencam",
- @"lwp": @"application/vnd.lotus-wordpro",
- @"portpkg": @"application/vnd.macports.portpkg",
- @"mcd": @"application/vnd.mcd",
- @"mc1": @"application/vnd.medcalcdata",
- @"cdkey": @"application/vnd.mediastation.cdkey",
- @"mwf": @"application/vnd.mfer",
- @"mfm": @"application/vnd.mfmp",
- @"flo": @"application/vnd.micrografx.flo",
- @"igx": @"application/vnd.micrografx.igx",
- @"mif": @"application/vnd.mif",
- @"daf": @"application/vnd.mobius.daf",
- @"dis": @"application/vnd.mobius.dis",
- @"mbk": @"application/vnd.mobius.mbk",
- @"mqy": @"application/vnd.mobius.mqy",
- @"msl": @"application/vnd.mobius.msl",
- @"plc": @"application/vnd.mobius.plc",
- @"txf": @"application/vnd.mobius.txf",
- @"mpn": @"application/vnd.mophun.application",
- @"mpc": @"application/vnd.mophun.certificate",
- @"xul": @"application/vnd.mozilla.xul+xml",
- @"cil": @"application/vnd.ms-artgalry",
- @"cab": @"application/vnd.ms-cab-compressed",
- @"xls": @"application/vnd.ms-excel",
- @"xlam": @"application/vnd.ms-excel.addin.macroenabled.12",
- @"xlsb": @"application/vnd.ms-excel.sheet.binary.macroenabled.12",
- @"xlsm": @"application/vnd.ms-excel.sheet.macroenabled.12",
- @"xltm": @"application/vnd.ms-excel.template.macroenabled.12",
- @"eot": @"application/vnd.ms-fontobject",
- @"chm": @"application/vnd.ms-htmlhelp",
- @"ims": @"application/vnd.ms-ims",
- @"lrm": @"application/vnd.ms-lrm",
- @"thmx": @"application/vnd.ms-officetheme",
- @"cat": @"application/vnd.ms-pki.seccat",
- @"stl": @"application/vnd.ms-pki.stl",
- @"ppt": @"application/vnd.ms-powerpoint",
- @"ppam": @"application/vnd.ms-powerpoint.addin.macroenabled.12",
- @"pptm": @"application/vnd.ms-powerpoint.presentation.macroenabled.12",
- @"sldm": @"application/vnd.ms-powerpoint.slide.macroenabled.12",
- @"ppsm": @"application/vnd.ms-powerpoint.slideshow.macroenabled.12",
- @"potm": @"application/vnd.ms-powerpoint.template.macroenabled.12",
- @"mpp": @"application/vnd.ms-project",
- @"docm": @"application/vnd.ms-word.document.macroenabled.12",
- @"dotm": @"application/vnd.ms-word.template.macroenabled.12",
- @"wps": @"application/vnd.ms-works",
- @"wpl": @"application/vnd.ms-wpl",
- @"xps": @"application/vnd.ms-xpsdocument",
- @"mseq": @"application/vnd.mseq",
- @"mus": @"application/vnd.musician",
- @"msty": @"application/vnd.muvee.style",
- @"nlu": @"application/vnd.neurolanguage.nlu",
- @"nnd": @"application/vnd.noblenet-directory",
- @"nns": @"application/vnd.noblenet-sealer",
- @"nnw": @"application/vnd.noblenet-web",
- @"ngdat": @"application/vnd.nokia.n-gage.data",
- @"n-gage": @"application/vnd.nokia.n-gage.symbian.install",
- @"rpst": @"application/vnd.nokia.radio-preset",
- @"rpss": @"application/vnd.nokia.radio-presets",
- @"edm": @"application/vnd.novadigm.edm",
- @"edx": @"application/vnd.novadigm.edx",
- @"ext": @"application/vnd.novadigm.ext",
- @"odc": @"application/vnd.oasis.opendocument.chart",
- @"otc": @"application/vnd.oasis.opendocument.chart-template",
- @"odb": @"application/vnd.oasis.opendocument.database",
- @"odf": @"application/vnd.oasis.opendocument.formula",
- @"odft": @"application/vnd.oasis.opendocument.formula-template",
- @"odg": @"application/vnd.oasis.opendocument.graphics",
- @"otg": @"application/vnd.oasis.opendocument.graphics-template",
- @"odi": @"application/vnd.oasis.opendocument.image",
- @"oti": @"application/vnd.oasis.opendocument.image-template",
- @"odp": @"application/vnd.oasis.opendocument.presentation",
- @"otp": @"application/vnd.oasis.opendocument.presentation-template",
- @"ods": @"application/vnd.oasis.opendocument.spreadsheet",
- @"ots": @"application/vnd.oasis.opendocument.spreadsheet-template",
- @"odt": @"application/vnd.oasis.opendocument.text",
- @"odm": @"application/vnd.oasis.opendocument.text-master",
- @"ott": @"application/vnd.oasis.opendocument.text-template",
- @"oth": @"application/vnd.oasis.opendocument.text-web",
- @"xo": @"application/vnd.olpc-sugar",
- @"dd2": @"application/vnd.oma.dd2+xml",
- @"oxt": @"application/vnd.openofficeorg.extension",
- @"pptx": @"application/vnd.openxmlformats-officedocument.presentationml.presentation",
- @"sldx": @"application/vnd.openxmlformats-officedocument.presentationml.slide",
- @"ppsx": @"application/vnd.openxmlformats-officedocument.presentationml.slideshow",
- @"potx": @"application/vnd.openxmlformats-officedocument.presentationml.template",
- @"xlsx": @"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
- @"xltx": @"application/vnd.openxmlformats-officedocument.spreadsheetml.template",
- @"docx": @"application/vnd.openxmlformats-officedocument.wordprocessingml.document",
- @"dotx": @"application/vnd.openxmlformats-officedocument.wordprocessingml.template",
- @"mgp": @"application/vnd.osgeo.mapguide.package",
- @"dp": @"application/vnd.osgi.dp",
- @"pdb": @"application/vnd.palm",
- @"paw": @"application/vnd.pawaafile",
- @"str": @"application/vnd.pg.format",
- @"ei6": @"application/vnd.pg.osasli",
- @"efif": @"application/vnd.picsel",
- @"wg": @"application/vnd.pmi.widget",
- @"plf": @"application/vnd.pocketlearn",
- @"pbd": @"application/vnd.powerbuilder6",
- @"box": @"application/vnd.previewsystems.box",
- @"mgz": @"application/vnd.proteus.magazine",
- @"qps": @"application/vnd.publishare-delta-tree",
- @"ptid": @"application/vnd.pvi.ptid1",
- @"qxd": @"application/vnd.quark.quarkxpress",
- @"bed": @"application/vnd.realvnc.bed",
- @"mxl": @"application/vnd.recordare.musicxml",
- @"musicxml": @"application/vnd.recordare.musicxml+xml",
- @"cryptonote": @"application/vnd.rig.cryptonote",
- @"cod": @"application/vnd.rim.cod",
- @"rm": @"application/vnd.rn-realmedia",
- @"link66": @"application/vnd.route66.link66+xml",
- @"st": @"application/vnd.sailingtracker.track",
- @"see": @"application/vnd.seemail",
- @"sema": @"application/vnd.sema",
- @"semd": @"application/vnd.semd",
- @"semf": @"application/vnd.semf",
- @"ifm": @"application/vnd.shana.informed.formdata",
- @"itp": @"application/vnd.shana.informed.formtemplate",
- @"iif": @"application/vnd.shana.informed.interchange",
- @"ipk": @"application/vnd.shana.informed.package",
- @"twd": @"application/vnd.simtech-mindmapper",
- @"mmf": @"application/vnd.smaf",
- @"teacher": @"application/vnd.smart.teacher",
- @"sdkm": @"application/vnd.solent.sdkm+xml",
- @"dxp": @"application/vnd.spotfire.dxp",
- @"sfs": @"application/vnd.spotfire.sfs",
- @"sdc": @"application/vnd.stardivision.calc",
- @"sda": @"application/vnd.stardivision.draw",
- @"sdd": @"application/vnd.stardivision.impress",
- @"smf": @"application/vnd.stardivision.math",
- @"sdw": @"application/vnd.stardivision.writer",
- @"sgl": @"application/vnd.stardivision.writer-global",
- @"sm": @"application/vnd.stepmania.stepchart",
- @"sxc": @"application/vnd.sun.xml.calc",
- @"stc": @"application/vnd.sun.xml.calc.template",
- @"sxd": @"application/vnd.sun.xml.draw",
- @"std": @"application/vnd.sun.xml.draw.template",
- @"sxi": @"application/vnd.sun.xml.impress",
- @"sti": @"application/vnd.sun.xml.impress.template",
- @"sxm": @"application/vnd.sun.xml.math",
- @"sxw": @"application/vnd.sun.xml.writer",
- @"sxg": @"application/vnd.sun.xml.writer.global",
- @"stw": @"application/vnd.sun.xml.writer.template",
- @"sus": @"application/vnd.sus-calendar",
- @"svd": @"application/vnd.svd",
- @"sis": @"application/vnd.symbian.install",
- @"xsm": @"application/vnd.syncml+xml",
- @"bdm": @"application/vnd.syncml.dm+wbxml",
- @"xdm": @"application/vnd.syncml.dm+xml",
- @"tao": @"application/vnd.tao.intent-module-archive",
- @"tmo": @"application/vnd.tmobile-livetv",
- @"tpt": @"application/vnd.trid.tpt",
- @"mxs": @"application/vnd.triscape.mxs",
- @"tra": @"application/vnd.trueapp",
- @"ufd": @"application/vnd.ufdl",
- @"utz": @"application/vnd.uiq.theme",
- @"umj": @"application/vnd.umajin",
- @"unityweb": @"application/vnd.unity",
- @"uoml": @"application/vnd.uoml+xml",
- @"vcx": @"application/vnd.vcx",
- @"vsd": @"application/vnd.visio",
- @"vis": @"application/vnd.visionary",
- @"vsf": @"application/vnd.vsf",
- @"wbxml": @"application/vnd.wap.wbxml",
- @"wmlc": @"application/vnd.wap.wmlc",
- @"wmlsc": @"application/vnd.wap.wmlscriptc",
- @"wtb": @"application/vnd.webturbo",
- @"nbp": @"application/vnd.wolfram.player",
- @"wpd": @"application/vnd.wordperfect",
- @"wqd": @"application/vnd.wqd",
- @"stf": @"application/vnd.wt.stf",
- @"xar": @"application/vnd.xara",
- @"xfdl": @"application/vnd.xfdl",
- @"hvd": @"application/vnd.yamaha.hv-dic",
- @"hvs": @"application/vnd.yamaha.hv-script",
- @"hvp": @"application/vnd.yamaha.hv-voice",
- @"osf": @"application/vnd.yamaha.openscoreformat",
- @"osfpvg": @"application/vnd.yamaha.openscoreformat.osfpvg+xml",
- @"saf": @"application/vnd.yamaha.smaf-audio",
- @"spf": @"application/vnd.yamaha.smaf-phrase",
- @"cmp": @"application/vnd.yellowriver-custom-menu",
- @"zir": @"application/vnd.zul",
- @"zaz": @"application/vnd.zzazz.deck+xml",
- @"vxml": @"application/voicexml+xml",
- @"wgt": @"application/widget",
- @"hlp": @"application/winhlp",
- @"wsdl": @"application/wsdl+xml",
- @"wspolicy": @"application/wspolicy+xml",
- @"7z": @"application/x-7z-compressed",
- @"abw": @"application/x-abiword",
- @"ace": @"application/x-ace-compressed",
- @"aab": @"application/x-authorware-bin",
- @"aam": @"application/x-authorware-map",
- @"aas": @"application/x-authorware-seg",
- @"bcpio": @"application/x-bcpio",
- @"torrent": @"application/x-bittorrent",
- @"bz": @"application/x-bzip",
- @"bz2": @"application/x-bzip2",
- @"vcd": @"application/x-cdlink",
- @"chat": @"application/x-chat",
- @"pgn": @"application/x-chess-pgn",
- @"cpio": @"application/x-cpio",
- @"csh": @"application/x-csh",
- @"deb": @"application/x-debian-package",
- @"dir": @"application/x-director",
- @"wad": @"application/x-doom",
- @"ncx": @"application/x-dtbncx+xml",
- @"dtb": @"application/x-dtbook+xml",
- @"res": @"application/x-dtbresource+xml",
- @"dvi": @"application/x-dvi",
- @"bdf": @"application/x-font-bdf",
- @"gsf": @"application/x-font-ghostscript",
- @"psf": @"application/x-font-linux-psf",
- @"otf": @"application/x-font-otf",
- @"pcf": @"application/x-font-pcf",
- @"snf": @"application/x-font-snf",
- @"ttf": @"application/x-font-ttf",
- @"pfa": @"application/x-font-type1",
- @"woff": @"application/x-font-woff",
- @"spl": @"application/x-futuresplash",
- @"gnumeric": @"application/x-gnumeric",
- @"gtar": @"application/x-gtar",
- @"hdf": @"application/x-hdf",
- @"jnlp": @"application/x-java-jnlp-file",
- @"latex": @"application/x-latex",
- @"prc": @"application/x-mobipocket-ebook",
- @"application": @"application/x-ms-application",
- @"wmd": @"application/x-ms-wmd",
- @"wmz": @"application/x-ms-wmz",
- @"xbap": @"application/x-ms-xbap",
- @"mdb": @"application/x-msaccess",
- @"obd": @"application/x-msbinder",
- @"crd": @"application/x-mscardfile",
- @"clp": @"application/x-msclip",
- @"exe": @"application/x-msdownload",
- @"mvb": @"application/x-msmediaview",
- @"wmf": @"application/x-msmetafile",
- @"mny": @"application/x-msmoney",
- @"pub": @"application/x-mspublisher",
- @"scd": @"application/x-msschedule",
- @"trm": @"application/x-msterminal",
- @"wri": @"application/x-mswrite",
- @"nc": @"application/x-netcdf",
- @"p12": @"application/x-pkcs12",
- @"p7b": @"application/x-pkcs7-certificates",
- @"p7r": @"application/x-pkcs7-certreqresp",
- @"rar": @"application/x-rar-compressed",
- @"sh": @"application/x-sh",
- @"shar": @"application/x-shar",
- @"swf": @"application/x-shockwave-flash",
- @"xap": @"application/x-silverlight-app",
- @"sit": @"application/x-stuffit",
- @"sitx": @"application/x-stuffitx",
- @"sv4cpio": @"application/x-sv4cpio",
- @"sv4crc": @"application/x-sv4crc",
- @"tar": @"application/x-tar",
- @"tcl": @"application/x-tcl",
- @"tex": @"application/x-tex",
- @"tfm": @"application/x-tex-tfm",
- @"texinfo": @"application/x-texinfo",
- @"ustar": @"application/x-ustar",
- @"src": @"application/x-wais-source",
- @"der": @"application/x-x509-ca-cert",
- @"fig": @"application/x-xfig",
- @"xpi": @"application/x-xpinstall",
- @"xdf": @"application/xcap-diff+xml",
- @"xenc": @"application/xenc+xml",
- @"xhtml": @"application/xhtml+xml",
- @"xml": @"application/xml",
- @"dtd": @"application/xml-dtd",
- @"xop": @"application/xop+xml",
- @"xslt": @"application/xslt+xml",
- @"xspf": @"application/xspf+xml",
- @"mxml": @"application/xv+xml",
- @"yang": @"application/yang",
- @"yin": @"application/yin+xml",
- @"zip": @"application/zip",
- @"adp": @"audio/adpcm",
- @"au": @"audio/basic",
- @"mid": @"audio/midi",
- @"mp4a": @"audio/mp4",
- @"mpga": @"audio/mpeg",
- @"oga": @"audio/ogg",
- @"uva": @"audio/vnd.dece.audio",
- @"eol": @"audio/vnd.digital-winds",
- @"dra": @"audio/vnd.dra",
- @"dts": @"audio/vnd.dts",
- @"dtshd": @"audio/vnd.dts.hd",
- @"lvp": @"audio/vnd.lucent.voice",
- @"pya": @"audio/vnd.ms-playready.media.pya",
- @"ecelp4800": @"audio/vnd.nuera.ecelp4800",
- @"ecelp7470": @"audio/vnd.nuera.ecelp7470",
- @"ecelp9600": @"audio/vnd.nuera.ecelp9600",
- @"rip": @"audio/vnd.rip",
- @"weba": @"audio/webm",
- @"aac": @"audio/x-aac",
- @"aif": @"audio/x-aiff",
- @"m3u": @"audio/x-mpegurl",
- @"wax": @"audio/x-ms-wax",
- @"wma": @"audio/x-ms-wma",
- @"ram": @"audio/x-pn-realaudio",
- @"rmp": @"audio/x-pn-realaudio-plugin",
- @"wav": @"audio/x-wav",
- @"cdx": @"chemical/x-cdx",
- @"cif": @"chemical/x-cif",
- @"cmdf": @"chemical/x-cmdf",
- @"cml": @"chemical/x-cml",
- @"csml": @"chemical/x-csml",
- @"xyz": @"chemical/x-xyz",
- @"bmp": @"image/bmp",
- @"cgm": @"image/cgm",
- @"g3": @"image/g3fax",
- @"gif": @"image/gif",
- @"ief": @"image/ief",
- @"jpeg": @"image/jpeg",
- @"jpg" : @"image/jpeg",
- @"ktx": @"image/ktx",
- @"png": @"image/png",
- @"btif": @"image/prs.btif",
- @"svg": @"image/svg+xml",
- @"tiff": @"image/tiff",
- @"psd": @"image/vnd.adobe.photoshop",
- @"uvi": @"image/vnd.dece.graphic",
- @"sub": @"image/vnd.dvb.subtitle",
- @"djvu": @"image/vnd.djvu",
- @"dwg": @"image/vnd.dwg",
- @"dxf": @"image/vnd.dxf",
- @"fbs": @"image/vnd.fastbidsheet",
- @"fpx": @"image/vnd.fpx",
- @"fst": @"image/vnd.fst",
- @"mmr": @"image/vnd.fujixerox.edmics-mmr",
- @"rlc": @"image/vnd.fujixerox.edmics-rlc",
- @"mdi": @"image/vnd.ms-modi",
- @"npx": @"image/vnd.net-fpx",
- @"wbmp": @"image/vnd.wap.wbmp",
- @"xif": @"image/vnd.xiff",
- @"webp": @"image/webp",
- @"ras": @"image/x-cmu-raster",
- @"cmx": @"image/x-cmx",
- @"fh": @"image/x-freehand",
- @"ico": @"image/x-icon",
- @"pcx": @"image/x-pcx",
- @"pic": @"image/x-pict",
- @"pnm": @"image/x-portable-anymap",
- @"pbm": @"image/x-portable-bitmap",
- @"pgm": @"image/x-portable-graymap",
- @"ppm": @"image/x-portable-pixmap",
- @"rgb": @"image/x-rgb",
- @"xbm": @"image/x-xbitmap",
- @"xpm": @"image/x-xpixmap",
- @"xwd": @"image/x-xwindowdump",
- @"eml": @"message/rfc822",
- @"igs": @"model/iges",
- @"msh": @"model/mesh",
- @"dae": @"model/vnd.collada+xml",
- @"dwf": @"model/vnd.dwf",
- @"gdl": @"model/vnd.gdl",
- @"gtw": @"model/vnd.gtw",
- @"mts": @"model/vnd.mts",
- @"vtu": @"model/vnd.vtu",
- @"wrl": @"model/vrml",
- @"ics": @"text/calendar",
- @"css": @"text/css",
- @"csv": @"text/csv",
- @"html": @"text/html",
- @"n3": @"text/n3",
- @"txt": @"text/plain",
- @"dsc": @"text/prs.lines.tag",
- @"rtx": @"text/richtext",
- @"sgml": @"text/sgml",
- @"tsv": @"text/tab-separated-values",
- @"t": @"text/troff",
- @"ttl": @"text/turtle",
- @"uri": @"text/uri-list",
- @"curl": @"text/vnd.curl",
- @"dcurl": @"text/vnd.curl.dcurl",
- @"scurl": @"text/vnd.curl.scurl",
- @"mcurl": @"text/vnd.curl.mcurl",
- @"fly": @"text/vnd.fly",
- @"flx": @"text/vnd.fmi.flexstor",
- @"gv": @"text/vnd.graphviz",
- @"3dml": @"text/vnd.in3d.3dml",
- @"spot": @"text/vnd.in3d.spot",
- @"jad": @"text/vnd.sun.j2me.app-descriptor",
- @"wml": @"text/vnd.wap.wml",
- @"wmls": @"text/vnd.wap.wmlscript",
- @"s": @"text/x-asm",
- @"c": @"text/x-c",
- @"f": @"text/x-fortran",
- @"p": @"text/x-pascal",
- @"java": @"text/x-java-source",
- @"etx": @"text/x-setext",
- @"uu": @"text/x-uuencode",
- @"vcs": @"text/x-vcalendar",
- @"vcf": @"text/x-vcard",
- @"3gp": @"video/3gpp",
- @"3g2": @"video/3gpp2",
- @"h261": @"video/h261",
- @"h263": @"video/h263",
- @"h264": @"video/h264",
- @"jpgv": @"video/jpeg",
- @"jpm": @"video/jpm",
- @"mj2": @"video/mj2",
- @"mp4": @"video/mp4",
- @"mpeg": @"video/mpeg",
- @"ogv": @"video/ogg",
- @"qt": @"video/quicktime",
- @"uvh": @"video/vnd.dece.hd",
- @"uvm": @"video/vnd.dece.mobile",
- @"uvp": @"video/vnd.dece.pd",
- @"uvs": @"video/vnd.dece.sd",
- @"uvv": @"video/vnd.dece.video",
- @"fvt": @"video/vnd.fvt",
- @"mxu": @"video/vnd.mpegurl",
- @"pyv": @"video/vnd.ms-playready.media.pyv",
- @"uvu": @"video/vnd.uvvu.mp4",
- @"viv": @"video/vnd.vivo",
- @"webm": @"video/webm",
- @"f4v": @"video/x-f4v",
- @"fli": @"video/x-fli",
- @"flv": @"video/x-flv",
- @"m4v": @"video/x-m4v",
- @"asf": @"video/x-ms-asf",
- @"wm": @"video/x-ms-wm",
- @"wmv": @"video/x-ms-wmv",
- @"wmx": @"video/x-ms-wmx",
- @"wvx": @"video/x-ms-wvx",
- @"avi": @"video/x-msvideo",
- @"movie": @"video/x-sgi-movie",
- @"ice": @"x-conference/x-cooltalk",
- @"par ": @"text/plain-bas",
- @"yaml": @"text/yaml"
- };
- });
- NSString * extention = nil;
- if (filePath) {
- extention = [filePath pathExtension];
- }
- if (![extention oss_isNotEmpty] && uploadName) {
- extention = [uploadName pathExtension];
- }
- if (![extention oss_isNotEmpty]) {
- return @"application/octet-stream";
- }
- NSString * mimeType = [mimeMap objectForKey:extention.lowercaseString];
- return mimeType ? mimeType : @"application/octet-stream";
- }
- + (BOOL)hasPhoneFreeSpace{
- NSError *error;
- NSDictionary *attrs = [[NSFileManager defaultManager] attributesOfFileSystemForPath:NSHomeDirectory() error:&error];
- if(error) return NO;
- long long space = [[attrs objectForKey:NSFileSystemFreeSize] longLongValue];
- if(space < 0) return NO;
- if(space < osskDDDefaultLogMaxFileSize) return NO;
- return YES;
- }
- + (NSString*)buildNetWorkConnectedMsg{
- NSString *tempMessage = @"[network_state]: disconnected";
- OSSReachability *reach=[OSSReachability reachabilityWithHostName:@"www.apple.com"];
- if(reach){
- switch([reach currentReachabilityStatus]){
- case OSSReachableViaWWAN:
- tempMessage = @"[network_state]: connected";
- break;
- case OSSReachableViaWiFi:
- tempMessage = @"[network_state]: connected";
- break;
- default:
- tempMessage = @"[network_state]: disconnected";
- break;
-
- }
- }
- return tempMessage;
- }
- + (NSString*)buildOperatorMsg{
- NSString *currentCountry;
- #if TARGET_OS_IOS
- CTTelephonyNetworkInfo *telephonyInfo = [[CTTelephonyNetworkInfo alloc] init];
- CTCarrier *carrier = [telephonyInfo subscriberCellularProvider];
- if(carrier){
- currentCountry = [carrier carrierName];
- if(currentCountry){
- currentCountry = [@"[operator]: " stringByAppendingString:currentCountry];
- }
- }
- #endif
- if (!currentCountry) {
- currentCountry = @"Unknown";
- }
-
- return currentCountry;
- }
- + (uint64_t)crc64ecma:(uint64_t)crc1 buffer:(void *)buffer length:(size_t)len
- {
- return aos_crc64(crc1, buffer, len);
- }
- + (uint64_t)crc64ForCombineCRC1:(uint64_t)crc1 CRC2:(uint64_t)crc2 length:(size_t)len2
- {
- return aos_crc64_combine(crc1, crc2, len2);
- }
- + (NSString *)sha1WithString:(NSString *)string
- {
- NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
- return [self sha1WithData:data];
- }
- + (NSString *)sha1WithData:(NSData *)data
- {
- unsigned char *digest = NULL;
-
- // Malloc a buffer to hold hash.
- digest = malloc(CC_SHA1_DIGEST_LENGTH * sizeof(unsigned char));
- memset(digest, 0x0, CC_SHA1_DIGEST_LENGTH);
- CC_SHA1(data.bytes, (CC_LONG)data.length, digest);
-
- NSString *result = [self sha1WithDigest:digest];
- if (digest) {
- free(digest);
- }
-
- return result;
- }
- + (NSString *)sha1WithDigest:(const unsigned char *)digest
- {
- if (!digest) {
- return nil;
- }
- NSMutableString *result = [NSMutableString stringWithCapacity:CC_SHA1_DIGEST_LENGTH * sizeof(unsigned char)];
- for (int i = 0; i < CC_SHA1_DIGEST_LENGTH; i++) {
- [result appendFormat:@"%02x",digest[i]];
- }
-
- return result;
- }
- + (NSString *)sha1WithFilePath:(NSString *)filePath
- {
- NSFileHandle *handle = [NSFileHandle fileHandleForReadingAtPath:filePath];
- if(!handle) {
- return nil;
- }
- CC_SHA1_CTX sha1;
- CC_SHA1_Init(&sha1);
- BOOL done = NO;
- unsigned char *digest = NULL;
-
- while(!done) {
- @autoreleasepool{
- NSData* fileData = [handle readDataOfLength: CHUNK_SIZE];
- if(fileData.length == 0) {
- break;
- }
- // Malloc a buffer to hold hash.
- digest = malloc(CC_SHA1_DIGEST_LENGTH * sizeof(unsigned char));
- memset(digest, 0x0, CC_SHA1_DIGEST_LENGTH);
- CC_SHA1_Update(&sha1, fileData.bytes, (CC_LONG)[fileData length]);
- }
- }
-
- // Malloc a buffer to hold hash.
- digest = malloc(CC_SHA1_DIGEST_LENGTH * sizeof(unsigned char));
- memset(digest, 0x0, CC_SHA1_DIGEST_LENGTH);
- CC_SHA1_Final(digest, &sha1);
-
- NSString *result = [self sha1WithDigest:digest];
- if (digest) {
- free(digest);
- }
-
- return result;
- }
- + (NSData *)constructHttpBodyForTriggerCallback:(NSString *)callbackParams callbackVaribles:(NSString *)callbackVaribles
- {
- NSMutableString *bodyString = [NSMutableString string];
-
- [bodyString appendString:@"x-oss-process=trigger/callback,callback_"];
- if ([callbackParams oss_isNotEmpty])
- {
- [bodyString appendString:callbackParams];
- }
-
- [bodyString appendString:@",callback-var_"];
- if ([callbackVaribles oss_isNotEmpty])
- {
- [bodyString appendString:callbackVaribles];
- }
-
- return [bodyString dataUsingEncoding:NSUTF8StringEncoding];
- }
- + (NSData *)constructHttpBodyForImagePersist:(NSString *)action toBucket:(NSString *)toBucket toObjectKey:(NSString *)toObjectKey
- {
- /*
- * parameter has checked before
- */
- NSMutableString *bodyString = [NSMutableString string];
- [bodyString appendString:@"x-oss-process="];
- if ([action rangeOfString:@"image/"].location == NSNotFound)
- {
- [bodyString appendString:@"image/"];
-
- }
- [bodyString appendString:action];
- [bodyString appendString:@"|sys/"];
-
-
- NSString * bucket_base64 = [[toBucket dataUsingEncoding:NSUTF8StringEncoding] base64EncodedStringWithOptions:0];
-
- NSString * objectkey_base64 = [[toObjectKey dataUsingEncoding:NSUTF8StringEncoding] base64EncodedStringWithOptions:0];
-
- [bodyString appendString:@"saveas,o_"];
- [bodyString appendString:objectkey_base64];
- [bodyString appendString:@",b_"];
- [bodyString appendString:bucket_base64];
- return [bodyString dataUsingEncoding:NSUTF8StringEncoding];
- }
- @end
- @implementation NSString (OSS)
- - (NSString *)oss_trim {
- return [self stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
- }
- - (BOOL)oss_isNotEmpty
- {
- return ![[self oss_trim] isEqualToString:@""];
- }
- - (NSString *)oss_stringByAppendingPathComponentForURL:(NSString *)aString
- {
- if ([self hasSuffix:@"/"]) {
- return [NSString stringWithFormat:@"%@%@", self, aString];
- } else {
- return [NSString stringWithFormat:@"%@/%@", self, aString];
- }
- }
- + (NSString *)oss_documentDirectory
- {
- static NSString *documentDirectory = nil;
- static dispatch_once_t onceToken;
- dispatch_once(&onceToken, ^{
- documentDirectory = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject;
- });
- return documentDirectory;
- }
- - (NSString *)oss_urlEncodedString {
- static NSCharacterSet *allowCharacterSet = nil;
- static dispatch_once_t onceToken;
- dispatch_once(&onceToken, ^{
- allowCharacterSet = [[NSCharacterSet characterSetWithCharactersInString:@"!*'();:@&=+$,/?#[]"] invertedSet];
- });
-
- return [self stringByAddingPercentEncodingWithAllowedCharacters:allowCharacterSet];
- }
- @end
|