/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.
 */

#import "WXResourceRequest.h"

static NSString * const kHTTPHeaderNameUserAgent = @"User-Agent";
static NSString * const kHTTPHeaderNameReferrer = @"Referer"; // The misspelling referer originated in the original proposal by computer "scientist" Phillip Hallam-Baker to incorporate the field into the HTTP specification. ╮(╯_╰)╭

@implementation WXResourceRequest

+ (instancetype)requestWithURL:(NSURL *)url
                  resourceType:(WXResourceType)type
                      referrer:(NSString *)referrer
                   cachePolicy:(NSURLRequestCachePolicy)cachePolicy
{
    return [[self alloc] initWithURL:url resourceType:type referrer:referrer cachePolicy:cachePolicy];
}

- (instancetype)initWithURL:(NSURL *)url
               resourceType:(WXResourceType)type
                   referrer:(NSString *)referrer cachePolicy:(NSURLRequestCachePolicy)cachePolicy
{
    if (self = [super initWithURL:url]) {
        self.type = type;
        self.cachePolicy = cachePolicy;
        [self setValue:referrer forHTTPHeaderField:kHTTPHeaderNameReferrer];
    }
    
    return self;
}

- (NSString *)referrer
{
    return [self valueForHTTPHeaderField:kHTTPHeaderNameReferrer];
}

- (void)setReferrer:(NSString *)referrer
{
    [self setValue:referrer forHTTPHeaderField:kHTTPHeaderNameReferrer];
}

- (NSString *)userAgent
{
    return [self valueForHTTPHeaderField:kHTTPHeaderNameUserAgent];
}

- (void)setUserAgent:(NSString *)userAgent
{
    [self setValue:userAgent forHTTPHeaderField:kHTTPHeaderNameUserAgent];
}

@end
