123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193 |
- /* Copyright 2014 Google Inc. All rights reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
- // For best performance and convenient usage, fetchers should be generated by a common
- // GTMSessionFetcherService instance, like
- //
- // _fetcherService = [[GTMSessionFetcherService alloc] init];
- // GTMSessionFetcher* myFirstFetcher = [_fetcherService fetcherWithRequest:request1];
- // GTMSessionFetcher* mySecondFetcher = [_fetcherService fetcherWithRequest:request2];
-
- #import "GTMSessionFetcher.h"
-
- GTM_ASSUME_NONNULL_BEGIN
-
- // Notifications.
-
- // This notification indicates a reusable session has become invalid. It is intended mainly for the
- // service's unit tests.
- //
- // The notification object is the fetcher service.
- // The invalid session is provided via the userInfo kGTMSessionFetcherServiceSessionKey key.
- extern NSString *const kGTMSessionFetcherServiceSessionBecameInvalidNotification;
- extern NSString *const kGTMSessionFetcherServiceSessionKey;
-
- @interface GTMSessionFetcherService : NSObject<GTMSessionFetcherServiceProtocol>
-
- // Queues of delayed and running fetchers. Each dictionary contains arrays
- // of GTMSessionFetcher *fetchers, keyed by NSString *host
- @property(atomic, strong, readonly, GTM_NULLABLE) GTM_NSDictionaryOf(NSString *, NSArray *) *delayedFetchersByHost;
- @property(atomic, strong, readonly, GTM_NULLABLE) GTM_NSDictionaryOf(NSString *, NSArray *) *runningFetchersByHost;
-
- // A max value of 0 means no fetchers should be delayed.
- // The default limit is 10 simultaneous fetchers targeting each host.
- // This does not apply to fetchers whose useBackgroundSession property is YES. Since services are
- // not resurrected on an app relaunch, delayed fetchers would effectively be abandoned.
- @property(atomic, assign) NSUInteger maxRunningFetchersPerHost;
-
- // Properties to be applied to each fetcher; see GTMSessionFetcher.h for descriptions
- @property(atomic, strong, GTM_NULLABLE) NSURLSessionConfiguration *configuration;
- @property(atomic, copy, GTM_NULLABLE) GTMSessionFetcherConfigurationBlock configurationBlock;
- @property(atomic, strong, GTM_NULLABLE) NSHTTPCookieStorage *cookieStorage;
- @property(atomic, strong, GTM_NULL_RESETTABLE) dispatch_queue_t callbackQueue;
- @property(atomic, copy, GTM_NULLABLE) GTMSessionFetcherChallengeBlock challengeBlock;
- @property(atomic, strong, GTM_NULLABLE) NSURLCredential *credential;
- @property(atomic, strong) NSURLCredential *proxyCredential;
- @property(atomic, copy, GTM_NULLABLE) GTM_NSArrayOf(NSString *) *allowedInsecureSchemes;
- @property(atomic, assign) BOOL allowLocalhostRequest;
- @property(atomic, assign) BOOL allowInvalidServerCertificates;
- @property(atomic, assign, getter=isRetryEnabled) BOOL retryEnabled;
- @property(atomic, copy, GTM_NULLABLE) GTMSessionFetcherRetryBlock retryBlock;
- @property(atomic, assign) NSTimeInterval maxRetryInterval;
- @property(atomic, assign) NSTimeInterval minRetryInterval;
- @property(atomic, copy, GTM_NULLABLE) GTM_NSDictionaryOf(NSString *, id) *properties;
-
- #if GTM_BACKGROUND_TASK_FETCHING
- @property(atomic, assign) BOOL skipBackgroundTask;
- #endif
-
- // A default useragent of GTMFetcherStandardUserAgentString(nil) will be given to each fetcher
- // created by this service unless the request already has a user-agent header set.
- // This default will be added starting with builds with the SDKs for OS X 10.11 and iOS 9.
- //
- // To use the configuration's default user agent, set this property to nil.
- @property(atomic, copy, GTM_NULLABLE) NSString *userAgent;
-
- // The authorizer to attach to the created fetchers. If a specific fetcher should
- // not authorize its requests, the fetcher's authorizer property may be set to nil
- // before the fetch begins.
- @property(atomic, strong, GTM_NULLABLE) id<GTMFetcherAuthorizationProtocol> authorizer;
-
- // Delegate queue used by the session when calling back to the fetcher. The default
- // is the main queue. Changing this does not affect the queue used to call back to the
- // application; that is specified by the callbackQueue property above.
- @property(atomic, strong, GTM_NULL_RESETTABLE) NSOperationQueue *sessionDelegateQueue;
-
- // When enabled, indicates the same session should be used by subsequent fetchers.
- //
- // This is enabled by default.
- @property(atomic, assign) BOOL reuseSession;
-
- // Sets the delay until an unused session is invalidated.
- // The default interval is 60 seconds.
- //
- // If the interval is set to 0, then any reused session is not invalidated except by
- // explicitly invoking -resetSession. Be aware that setting the interval to 0 thus
- // causes the session's delegate to be retained until the session is explicitly reset.
- @property(atomic, assign) NSTimeInterval unusedSessionTimeout;
-
- // If shouldReuseSession is enabled, this will force creation of a new session when future
- // fetchers begin.
- - (void)resetSession;
-
- // Create a fetcher
- //
- // These methods will return a fetcher. If successfully created, the connection
- // will hold a strong reference to it for the life of the connection as well.
- // So the caller doesn't have to hold onto the fetcher explicitly unless they
- // want to be able to monitor or cancel it.
- - (GTMSessionFetcher *)fetcherWithRequest:(NSURLRequest *)request;
- - (GTMSessionFetcher *)fetcherWithURL:(NSURL *)requestURL;
- - (GTMSessionFetcher *)fetcherWithURLString:(NSString *)requestURLString;
-
- // Common method for fetcher creation.
- //
- // -fetcherWithRequest:fetcherClass: may be overridden to customize creation of
- // fetchers. This is the ONLY method in the GTMSessionFetcher library intended to
- // be overridden.
- - (id)fetcherWithRequest:(NSURLRequest *)request
- fetcherClass:(Class)fetcherClass;
-
- - (BOOL)isDelayingFetcher:(GTMSessionFetcher *)fetcher;
-
- - (NSUInteger)numberOfFetchers; // running + delayed fetchers
- - (NSUInteger)numberOfRunningFetchers;
- - (NSUInteger)numberOfDelayedFetchers;
-
- // Return a list of all running or delayed fetchers. This includes fetchers created
- // by the service which have been started and have not yet stopped.
- //
- // Returns an array of fetcher objects, or nil if none.
- - (GTM_NULLABLE GTM_NSArrayOf(GTMSessionFetcher *) *)issuedFetchers;
-
- // Search for running or delayed fetchers with the specified URL.
- //
- // Returns an array of fetcher objects found, or nil if none found.
- - (GTM_NULLABLE GTM_NSArrayOf(GTMSessionFetcher *) *)issuedFetchersWithRequestURL:(NSURL *)requestURL;
-
- - (void)stopAllFetchers;
-
- // Methods for use by the fetcher class only.
- - (GTM_NULLABLE NSURLSession *)session;
- - (GTM_NULLABLE NSURLSession *)sessionForFetcherCreation;
- - (GTM_NULLABLE id<NSURLSessionDelegate>)sessionDelegate;
- - (GTM_NULLABLE NSDate *)stoppedAllFetchersDate;
-
- // The testBlock can inspect its fetcher parameter's request property to
- // determine which fetcher is being faked.
- @property(atomic, copy, GTM_NULLABLE) GTMSessionFetcherTestBlock testBlock;
-
- @end
-
- @interface GTMSessionFetcherService (TestingSupport)
-
- // Convenience methods to create a fetcher service for testing.
- //
- // Fetchers generated by this mock fetcher service will not perform any
- // network operation, but will invoke callbacks and provide the supplied data
- // or error to the completion handler.
- //
- // You can make more customized mocks by setting the test block property of the service
- // or fetcher; the test block can inspect the fetcher's request or other properties.
- //
- // See the description of the testBlock property below.
- + (instancetype)mockFetcherServiceWithFakedData:(GTM_NULLABLE NSData *)fakedDataOrNil
- fakedError:(GTM_NULLABLE NSError *)fakedErrorOrNil;
- + (instancetype)mockFetcherServiceWithFakedData:(GTM_NULLABLE NSData *)fakedDataOrNil
- fakedResponse:(NSHTTPURLResponse *)fakedResponse
- fakedError:(GTM_NULLABLE NSError *)fakedErrorOrNil;
-
- // Spin the run loop and discard events (or, if not on the main thread, just sleep the thread)
- // until all running and delayed fetchers have completed.
- //
- // This is only for use in testing or in tools without a user interface.
- //
- // Synchronous fetches should never be done by shipping apps; they are
- // sufficient reason for rejection from the app store.
- //
- // Returns NO if timed out.
- - (BOOL)waitForCompletionOfAllFetchersWithTimeout:(NSTimeInterval)timeoutInSeconds;
-
- @end
-
- @interface GTMSessionFetcherService (BackwardsCompatibilityOnly)
-
- // Clients using GTMSessionFetcher should set the cookie storage explicitly themselves.
- // This method is just for compatibility with the old fetcher.
- @property(atomic, assign) NSInteger cookieStorageMethod;
-
- @end
-
- GTM_ASSUME_NONNULL_END
|