#import "HTTPMessage.h"

#if ! __has_feature(objc_arc)
#warning This file must be compiled with ARC. Use -fobjc-arc flag (or convert project to ARC).
#endif


@implementation HTTPMessage

- (id)initEmptyRequest
{
    if ((self = [super init]))
    {
        message = CFHTTPMessageCreateEmpty(NULL, YES);
    }
    return self;
}

- (id)initRequestWithMethod:(NSString *)method URL:(NSURL *)url version:(NSString *)version
{
    if ((self = [super init]))
    {
        message = CFHTTPMessageCreateRequest(NULL,
                                            (__bridge CFStringRef)method,
                                            (__bridge CFURLRef)url,
                                            (__bridge CFStringRef)version);
    }
    return self;
}

- (id)initResponseWithStatusCode:(NSInteger)code description:(NSString *)description version:(NSString *)version
{
    if ((self = [super init]))
    {
        message = CFHTTPMessageCreateResponse(NULL,
                                              (CFIndex)code,
                                              (__bridge CFStringRef)description,
                                              (__bridge CFStringRef)version);
    }
    return self;
}

- (void)dealloc
{
    if (message)
    {
        CFRelease(message);
    }
}

- (BOOL)appendData:(NSData *)data
{
    return CFHTTPMessageAppendBytes(message, [data bytes], [data length]);
}

- (BOOL)isHeaderComplete
{
    return CFHTTPMessageIsHeaderComplete(message);
}

- (NSString *)version
{
    return (__bridge_transfer NSString *)CFHTTPMessageCopyVersion(message);
}

- (NSString *)method
{
    return (__bridge_transfer NSString *)CFHTTPMessageCopyRequestMethod(message);
}

- (NSURL *)url
{
    return (__bridge_transfer NSURL *)CFHTTPMessageCopyRequestURL(message);
}

- (NSInteger)statusCode
{
    return (NSInteger)CFHTTPMessageGetResponseStatusCode(message);
}

- (NSDictionary *)allHeaderFields
{
    return (__bridge_transfer NSDictionary *)CFHTTPMessageCopyAllHeaderFields(message);
}

- (NSString *)headerField:(NSString *)headerField
{
    return (__bridge_transfer NSString *)CFHTTPMessageCopyHeaderFieldValue(message, (__bridge CFStringRef)headerField);
}

- (void)setHeaderField:(NSString *)headerField value:(NSString *)headerFieldValue
{
    CFHTTPMessageSetHeaderFieldValue(message,
                                     (__bridge CFStringRef)headerField,
                                     (__bridge CFStringRef)headerFieldValue);
}

- (NSData *)messageData
{
    return (__bridge_transfer NSData *)CFHTTPMessageCopySerializedMessage(message);
}

- (NSData *)body
{
    return (__bridge_transfer NSData *)CFHTTPMessageCopyBody(message);
}

- (void)setBody:(NSData *)body
{
    CFHTTPMessageSetBody(message, (__bridge CFDataRef)body);
}

@end
