From 21d3023a9b7b6aff68c1170e345951396b1c6cfd Mon Sep 17 00:00:00 2001 From: 单军华 Date: Tue, 31 Jul 2018 13:35:21 +0800 Subject: [PATCH] no message --- screendisplay/Pods/ASIHTTPRequest/Classes/S3/ASIS3Request.m | 312 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 312 insertions(+), 0 deletions(-) diff --git a/screendisplay/Pods/ASIHTTPRequest/Classes/S3/ASIS3Request.m b/screendisplay/Pods/ASIHTTPRequest/Classes/S3/ASIS3Request.m new file mode 100755 index 0000000..d07000c --- /dev/null +++ b/screendisplay/Pods/ASIHTTPRequest/Classes/S3/ASIS3Request.m @@ -0,0 +1,312 @@ +// +// ASIS3Request.m +// Part of ASIHTTPRequest -> http://allseeing-i.com/ASIHTTPRequest +// +// Created by Ben Copsey on 30/06/2009. +// Copyright 2009 All-Seeing Interactive. All rights reserved. +// + +#import "ASIS3Request.h" +#import <CommonCrypto/CommonHMAC.h> + +NSString *const ASIS3AccessPolicyPrivate = @"private"; +NSString *const ASIS3AccessPolicyPublicRead = @"public-read"; +NSString *const ASIS3AccessPolicyPublicReadWrite = @"public-read-write"; +NSString *const ASIS3AccessPolicyAuthenticatedRead = @"authenticated-read"; +NSString *const ASIS3AccessPolicyBucketOwnerRead = @"bucket-owner-read"; +NSString *const ASIS3AccessPolicyBucketOwnerFullControl = @"bucket-owner-full-control"; + +NSString *const ASIS3RequestSchemeHTTP = @"http"; +NSString *const ASIS3RequestSchemeHTTPS = @"https"; + +static NSString *sharedAccessKey = nil; +static NSString *sharedSecretAccessKey = nil; + +// Private stuff +@interface ASIS3Request () + + (NSData *)HMACSHA1withKey:(NSString *)key forString:(NSString *)string; +@end + +@implementation ASIS3Request + +- (id)initWithURL:(NSURL *)newURL +{ + self = [super initWithURL:newURL]; + // After a bit of experimentation/guesswork, this number seems to reduce the chance of a 'RequestTimeout' error + [self setPersistentConnectionTimeoutSeconds:20]; + [self setRequestScheme:ASIS3RequestSchemeHTTP]; + return self; +} + + +- (void)dealloc +{ + [currentXMLElementContent release]; + [currentXMLElementStack release]; + [dateString release]; + [accessKey release]; + [secretAccessKey release]; + [accessPolicy release]; + [requestScheme release]; + [super dealloc]; +} + + +- (void)setDate:(NSDate *)date +{ + [self setDateString:[[ASIS3Request S3RequestDateFormatter] stringFromDate:date]]; +} + +- (ASIHTTPRequest *)HEADRequest +{ + ASIS3Request *headRequest = (ASIS3Request *)[super HEADRequest]; + [headRequest setAccessKey:[self accessKey]]; + [headRequest setSecretAccessKey:[self secretAccessKey]]; + return headRequest; +} + +- (NSMutableDictionary *)S3Headers +{ + NSMutableDictionary *headers = [NSMutableDictionary dictionary]; + if ([self accessPolicy]) { + [headers setObject:[self accessPolicy] forKey:@"x-amz-acl"]; + } + return headers; +} + +- (void)main +{ + if (![self url]) { + [self buildURL]; + } + [super main]; +} + +- (NSString *)canonicalizedResource +{ + return @"/"; +} + +- (NSString *)stringToSignForHeaders:(NSString *)canonicalizedAmzHeaders resource:(NSString *)canonicalizedResource +{ + return [NSString stringWithFormat:@"%@\n\n\n%@\n%@%@",[self requestMethod],[self dateString],canonicalizedAmzHeaders,canonicalizedResource]; +} + +- (void)buildRequestHeaders +{ + if (![self url]) { + [self buildURL]; + } + [super buildRequestHeaders]; + + // If an access key / secret access key haven't been set for this request, let's use the shared keys + if (![self accessKey]) { + [self setAccessKey:[ASIS3Request sharedAccessKey]]; + } + if (![self secretAccessKey]) { + [self setSecretAccessKey:[ASIS3Request sharedSecretAccessKey]]; + } + // If a date string hasn't been set, we'll create one from the current time + if (![self dateString]) { + [self setDate:[NSDate date]]; + } + [self addRequestHeader:@"Date" value:[self dateString]]; + + // Ensure our formatted string doesn't use '(null)' for the empty path + NSString *canonicalizedResource = [self canonicalizedResource]; + + // Add a header for the access policy if one was set, otherwise we won't add one (and S3 will default to private) + NSMutableDictionary *amzHeaders = [self S3Headers]; + NSString *canonicalizedAmzHeaders = @""; + for (NSString *header in [amzHeaders keysSortedByValueUsingSelector:@selector(compare:)]) { + canonicalizedAmzHeaders = [NSString stringWithFormat:@"%@%@:%@\n",canonicalizedAmzHeaders,[header lowercaseString],[amzHeaders objectForKey:header]]; + [self addRequestHeader:header value:[amzHeaders objectForKey:header]]; + } + + // Jump through hoops while eating hot food + NSString *stringToSign = [self stringToSignForHeaders:canonicalizedAmzHeaders resource:canonicalizedResource]; + NSString *signature = [ASIHTTPRequest base64forData:[ASIS3Request HMACSHA1withKey:[self secretAccessKey] forString:stringToSign]]; + NSString *authorizationString = [NSString stringWithFormat:@"AWS %@:%@",[self accessKey],signature]; + [self addRequestHeader:@"Authorization" value:authorizationString]; + + +} + +- (void)requestFinished +{ + if ([[[self responseHeaders] objectForKey:@"Content-Type"] isEqualToString:@"application/xml"]) { + [self parseResponseXML]; + } + if (![self error]) { + [super requestFinished]; + } +} + +#pragma mark Error XML parsing + +- (void)parseResponseXML +{ + NSData* xmlData = [self responseData]; + if (![xmlData length]) { + return; + } + NSXMLParser *parser = [[[NSXMLParser alloc] initWithData:xmlData] autorelease]; + [self setCurrentXMLElementStack:[NSMutableArray array]]; + [parser setDelegate:self]; + [parser setShouldProcessNamespaces:NO]; + [parser setShouldReportNamespacePrefixes:NO]; + [parser setShouldResolveExternalEntities:NO]; + [parser parse]; + +} + +- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError +{ + [self failWithError:[NSError errorWithDomain:NetworkRequestErrorDomain code:ASIS3ResponseParsingFailedType userInfo:[NSDictionary dictionaryWithObjectsAndKeys:@"Parsing the resposnse failed",NSLocalizedDescriptionKey,parseError,NSUnderlyingErrorKey,nil]]]; +} + +- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict +{ + [self setCurrentXMLElementContent:@""]; + [[self currentXMLElementStack] addObject:elementName]; +} + +- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName +{ + [[self currentXMLElementStack] removeLastObject]; + if ([elementName isEqualToString:@"Message"]) { + [self failWithError:[NSError errorWithDomain:NetworkRequestErrorDomain code:ASIS3ResponseErrorType userInfo:[NSDictionary dictionaryWithObjectsAndKeys:[self currentXMLElementContent],NSLocalizedDescriptionKey,nil]]]; + // Handle S3 connection expiry errors + } else if ([elementName isEqualToString:@"Code"]) { + if ([[self currentXMLElementContent] isEqualToString:@"RequestTimeout"]) { + if ([self retryUsingNewConnection]) { + [parser abortParsing]; + return; + } + } + } +} + +- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string +{ + [self setCurrentXMLElementContent:[[self currentXMLElementContent] stringByAppendingString:string]]; +} + +- (id)copyWithZone:(NSZone *)zone +{ + ASIS3Request *newRequest = [super copyWithZone:zone]; + [newRequest setAccessKey:[self accessKey]]; + [newRequest setSecretAccessKey:[self secretAccessKey]]; + [newRequest setRequestScheme:[self requestScheme]]; + [newRequest setAccessPolicy:[self accessPolicy]]; + return newRequest; +} + + +#pragma mark Shared access keys + ++ (NSString *)sharedAccessKey +{ + return sharedAccessKey; +} + ++ (void)setSharedAccessKey:(NSString *)newAccessKey +{ + [sharedAccessKey release]; + sharedAccessKey = [newAccessKey retain]; +} + ++ (NSString *)sharedSecretAccessKey +{ + return sharedSecretAccessKey; +} + ++ (void)setSharedSecretAccessKey:(NSString *)newAccessKey +{ + [sharedSecretAccessKey release]; + sharedSecretAccessKey = [newAccessKey retain]; +} + + +#pragma mark helpers + ++ (NSString *)stringByURLEncodingForS3Path:(NSString *)key +{ + if (!key) { + return @"/"; + } + NSString *path = [(NSString *)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)key, NULL, CFSTR(":?#[]@!$ &'()*+,;=\"<>%{}|\\^~`"), CFStringConvertNSStringEncodingToEncoding(NSUTF8StringEncoding)) autorelease]; + if (![[path substringWithRange:NSMakeRange(0, 1)] isEqualToString:@"/"]) { + path = [@"/" stringByAppendingString:path]; + } + return path; +} + +// Thanks to Tom Andersen for pointing out the threading issues and providing this code! ++ (NSDateFormatter*)S3ResponseDateFormatter +{ + // We store our date formatter in the calling thread's dictionary + // NSDateFormatter is not thread-safe, this approach ensures each formatter is only used on a single thread + // This formatter can be reused 1000 times in parsing a single response, so it would be expensive to keep creating new date formatters + NSMutableDictionary *threadDict = [[NSThread currentThread] threadDictionary]; + NSDateFormatter *dateFormatter = [threadDict objectForKey:@"ASIS3ResponseDateFormatter"]; + if (dateFormatter == nil) { + dateFormatter = [[[NSDateFormatter alloc] init] autorelease]; + [dateFormatter setLocale:[[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"] autorelease]]; + [dateFormatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]]; + [dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss'.000Z'"]; + [threadDict setObject:dateFormatter forKey:@"ASIS3ResponseDateFormatter"]; + } + return dateFormatter; +} + ++ (NSDateFormatter*)S3RequestDateFormatter +{ + NSMutableDictionary *threadDict = [[NSThread currentThread] threadDictionary]; + NSDateFormatter *dateFormatter = [threadDict objectForKey:@"ASIS3RequestHeaderDateFormatter"]; + if (dateFormatter == nil) { + dateFormatter = [[[NSDateFormatter alloc] init] autorelease]; + // Prevent problems with dates generated by other locales (tip from: http://rel.me/t/date/) + [dateFormatter setLocale:[[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"] autorelease]]; + [dateFormatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]]; + [dateFormatter setDateFormat:@"EEE, d MMM yyyy HH:mm:ss Z"]; + [threadDict setObject:dateFormatter forKey:@"ASIS3RequestHeaderDateFormatter"]; + } + return dateFormatter; + +} + +// From: http://stackoverflow.com/questions/476455/is-there-a-library-for-iphone-to-work-with-hmac-sha-1-encoding + ++ (NSData *)HMACSHA1withKey:(NSString *)key forString:(NSString *)string +{ + NSData *clearTextData = [string dataUsingEncoding:NSUTF8StringEncoding]; + NSData *keyData = [key dataUsingEncoding:NSUTF8StringEncoding]; + + uint8_t digest[CC_SHA1_DIGEST_LENGTH] = {0}; + + CCHmacContext hmacContext; + CCHmacInit(&hmacContext, kCCHmacAlgSHA1, keyData.bytes, keyData.length); + CCHmacUpdate(&hmacContext, clearTextData.bytes, clearTextData.length); + CCHmacFinal(&hmacContext, digest); + + return [NSData dataWithBytes:digest length:CC_SHA1_DIGEST_LENGTH]; +} + ++ (NSString *)S3Host +{ + return @"s3.amazonaws.com"; +} + +- (void)buildURL +{ +} + +@synthesize dateString; +@synthesize accessKey; +@synthesize secretAccessKey; +@synthesize currentXMLElementContent; +@synthesize currentXMLElementStack; +@synthesize accessPolicy; +@synthesize requestScheme; +@end -- Gitblit v1.8.0