/*
 Copyright (c) 2012-2014, Pierre-Olivier Latour
 All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions are met:
 * Redistributions of source code must retain the above copyright
 notice, this list of conditions and the following disclaimer.
 * Redistributions in binary form must reproduce the above copyright
 notice, this list of conditions and the following disclaimer in the
 documentation and/or other materials provided with the distribution.
 * The name of Pierre-Olivier Latour may not be used to endorse
 or promote products derived from this software without specific
 prior written permission.
 
 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 DISCLAIMED. IN NO EVENT SHALL PIERRE-OLIVIER LATOUR BE LIABLE FOR ANY
 DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

#import <Foundation/Foundation.h>

/**
 *  This protocol is used by the GCDWebServerConnection to communicate with
 *  the GCDWebServerResponse and read the HTTP body data to send.
 *
 *  Note that multiple GCDWebServerBodyReader objects can be chained together
 *  internally e.g. to automatically apply gzip encoding to the content before
 *  passing it on to the GCDWebServerResponse.
 *
 *  @warning These methods can be called on any GCD thread.
 */
@protocol GCDWebServerBodyReader <NSObject>

/**
 *  This method is called before any body data is sent.
 *
 *  It should return YES on success or NO on failure and set the "error" argument
 *  which is guaranteed to be non-NULL.
 */
- (BOOL)open:(NSError**)error;

/**
 *  This method is called whenever body data is sent.
 *
 *  It should return a non-empty NSData if there is body data available,
 *  or an empty NSData there is no more body data, or nil on error and set
 *  the "error" argument which is guaranteed to be non-NULL.
 */
- (NSData*)readData:(NSError**)error;

/**
 *  This method is called after all body data has been sent.
 */
- (void)close;

@end

/**
 *  The GCDWebServerResponse class is used to wrap a single HTTP response.
 *  It is instantiated by the handler of the GCDWebServer that handled the request.
 *  If a body is present, the methods from the GCDWebServerBodyReader protocol
 *  will be called by the GCDWebServerConnection to send it.
 *
 *  The default implementation of the GCDWebServerBodyReader protocol
 *  on the class simply returns an empty body.
 *
 *  @warning GCDWebServerResponse instances can be created and used on any GCD thread.
 */
@interface GCDWebServerResponse : NSObject <GCDWebServerBodyReader>

/**
 *  Sets the content type for the body of the response.
 *
 *  The default value is nil i.e. the response has no body.
 *
 *  @warning This property must be set if a body is present.
 */
@property(nonatomic, copy) NSString* contentType;

/**
 *  Sets the content length for the body of the response. If a body is present
 *  but this property is set to "NSUIntegerMax", this means the length of the body
 *  cannot be known ahead of time. Chunked transfer encoding will be
 *  automatically enabled by the GCDWebServerConnection to comply with HTTP/1.1
 *  specifications.
 *
 *  The default value is "NSUIntegerMax" i.e. the response has no body or its length
 *  is undefined.
 */
@property(nonatomic) NSUInteger contentLength;

/**
 *  Sets the HTTP status code for the response.
 *
 *  The default value is 200 i.e. "OK".
 */
@property(nonatomic) NSInteger statusCode;

/**
 *  Sets the caching hint for the response using the "Cache-Control" header.
 *  This value is expressed in seconds.
 *
 *  The default value is 0 i.e. "no-cache".
 */
@property(nonatomic) NSUInteger cacheControlMaxAge;

/**
 *  Sets the last modified date for the response using the "Last-Modified" header.
 *
 *  The default value is nil.
 */
@property(nonatomic, retain) NSDate* lastModifiedDate;

/**
 *  Sets the ETag for the response using the "ETag" header.
 *
 *  The default value is nil.
 */
@property(nonatomic, copy) NSString* eTag;

/**
 *  Enables gzip encoding for the response body.
 *
 *  The default value is NO.
 *
 *  @warning Enabling gzip encoding will remove any "Content-Length" header
 *  since the length of the body is not known anymore. The client will still
 *  be able to determine the body length when connection is closed per
 *  HTTP/1.1 specifications.
 */
@property(nonatomic, getter=isGZipContentEncodingEnabled) BOOL gzipContentEncodingEnabled;

/**
 *  Creates an empty response.
 */
+ (instancetype)response;

/**
 *  This method is the designated initializer for the class.
 */
- (instancetype)init;

/**
 *  Sets an additional HTTP header on the response.
 *  Pass a nil value to remove an additional header.
 *
 *  @warning Do not attempt to override the primary headers used
 *  by GCDWebServerResponse like "Content-Type", "ETag", etc...
 */
- (void)setValue:(NSString*)value forAdditionalHeader:(NSString*)header;

/**
 *  Convenience method that checks if the contentType property is defined.
 */
- (BOOL)hasBody;

@end

@interface GCDWebServerResponse (Extensions)

/**
 *  Creates a empty response with a specific HTTP status code.
 */
+ (instancetype)responseWithStatusCode:(NSInteger)statusCode;

/**
 *  Creates an HTTP redirect response to a new URL.
 */
+ (instancetype)responseWithRedirect:(NSURL*)location permanent:(BOOL)permanent;

/**
 *  Initializes an empty response with a specific HTTP status code.
 */
- (instancetype)initWithStatusCode:(NSInteger)statusCode;

/**
 *  Initializes an HTTP redirect response to a new URL.
 */
- (instancetype)initWithRedirect:(NSURL*)location permanent:(BOOL)permanent;

@end
