// 
// Decompiled by Procyon v0.6.0
// 

package io.netty.handler.codec.http;

import io.netty.util.internal.ObjectUtil;
import io.netty.handler.codec.DefaultHeaders;

public final class DefaultHttpHeadersFactory implements HttpHeadersFactory
{
    private static final DefaultHeaders.NameValidator<CharSequence> DEFAULT_NAME_VALIDATOR;
    private static final DefaultHeaders.ValueValidator<CharSequence> DEFAULT_VALUE_VALIDATOR;
    private static final DefaultHeaders.NameValidator<CharSequence> DEFAULT_TRAILER_NAME_VALIDATOR;
    private static final DefaultHeaders.NameValidator<CharSequence> NO_NAME_VALIDATOR;
    private static final DefaultHeaders.ValueValidator<CharSequence> NO_VALUE_VALIDATOR;
    private static final DefaultHttpHeadersFactory DEFAULT;
    private static final DefaultHttpHeadersFactory DEFAULT_TRAILER;
    private static final DefaultHttpHeadersFactory DEFAULT_COMBINING;
    private static final DefaultHttpHeadersFactory DEFAULT_NO_VALIDATION;
    private final DefaultHeaders.NameValidator<CharSequence> nameValidator;
    private final DefaultHeaders.ValueValidator<CharSequence> valueValidator;
    private final boolean combiningHeaders;
    
    private DefaultHttpHeadersFactory(final DefaultHeaders.NameValidator<CharSequence> nameValidator, final DefaultHeaders.ValueValidator<CharSequence> valueValidator, final boolean combiningHeaders) {
        this.nameValidator = ObjectUtil.checkNotNull(nameValidator, "nameValidator");
        this.valueValidator = ObjectUtil.checkNotNull(valueValidator, "valueValidator");
        this.combiningHeaders = combiningHeaders;
    }
    
    public static DefaultHttpHeadersFactory headersFactory() {
        return DefaultHttpHeadersFactory.DEFAULT;
    }
    
    public static DefaultHttpHeadersFactory trailersFactory() {
        return DefaultHttpHeadersFactory.DEFAULT_TRAILER;
    }
    
    @Override
    public HttpHeaders newHeaders() {
        if (this.isCombiningHeaders()) {
            return new CombinedHttpHeaders(this.getNameValidator(), this.getValueValidator());
        }
        return new DefaultHttpHeaders(this.getNameValidator(), this.getValueValidator());
    }
    
    @Override
    public HttpHeaders newEmptyHeaders() {
        if (this.isCombiningHeaders()) {
            return new CombinedHttpHeaders(this.getNameValidator(), this.getValueValidator(), 2);
        }
        return new DefaultHttpHeaders(this.getNameValidator(), this.getValueValidator(), 2);
    }
    
    public DefaultHttpHeadersFactory withNameValidation(final boolean validation) {
        return this.withNameValidator(validation ? DefaultHttpHeadersFactory.DEFAULT_NAME_VALIDATOR : DefaultHttpHeadersFactory.NO_NAME_VALIDATOR);
    }
    
    public DefaultHttpHeadersFactory withNameValidator(final DefaultHeaders.NameValidator<CharSequence> validator) {
        if (this.nameValidator == ObjectUtil.checkNotNull(validator, "validator")) {
            return this;
        }
        if (validator == DefaultHttpHeadersFactory.DEFAULT_NAME_VALIDATOR && this.valueValidator == DefaultHttpHeadersFactory.DEFAULT_VALUE_VALIDATOR) {
            return this.combiningHeaders ? DefaultHttpHeadersFactory.DEFAULT_COMBINING : DefaultHttpHeadersFactory.DEFAULT;
        }
        return new DefaultHttpHeadersFactory(validator, this.valueValidator, this.combiningHeaders);
    }
    
    public DefaultHttpHeadersFactory withValueValidation(final boolean validation) {
        return this.withValueValidator(validation ? DefaultHttpHeadersFactory.DEFAULT_VALUE_VALIDATOR : DefaultHttpHeadersFactory.NO_VALUE_VALIDATOR);
    }
    
    public DefaultHttpHeadersFactory withValueValidator(final DefaultHeaders.ValueValidator<CharSequence> validator) {
        if (this.valueValidator == ObjectUtil.checkNotNull(validator, "validator")) {
            return this;
        }
        if (this.nameValidator == DefaultHttpHeadersFactory.DEFAULT_NAME_VALIDATOR && validator == DefaultHttpHeadersFactory.DEFAULT_VALUE_VALIDATOR) {
            return this.combiningHeaders ? DefaultHttpHeadersFactory.DEFAULT_COMBINING : DefaultHttpHeadersFactory.DEFAULT;
        }
        return new DefaultHttpHeadersFactory(this.nameValidator, validator, this.combiningHeaders);
    }
    
    public DefaultHttpHeadersFactory withValidation(final boolean validation) {
        if (this == DefaultHttpHeadersFactory.DEFAULT && !validation) {
            return DefaultHttpHeadersFactory.DEFAULT_NO_VALIDATION;
        }
        if (this == DefaultHttpHeadersFactory.DEFAULT_NO_VALIDATION && validation) {
            return DefaultHttpHeadersFactory.DEFAULT;
        }
        return this.withNameValidation(validation).withValueValidation(validation);
    }
    
    public DefaultHttpHeadersFactory withCombiningHeaders(final boolean combiningHeaders) {
        if (this.combiningHeaders == combiningHeaders) {
            return this;
        }
        return new DefaultHttpHeadersFactory(this.nameValidator, this.valueValidator, combiningHeaders);
    }
    
    public DefaultHeaders.NameValidator<CharSequence> getNameValidator() {
        return this.nameValidator;
    }
    
    public DefaultHeaders.ValueValidator<CharSequence> getValueValidator() {
        return this.valueValidator;
    }
    
    public boolean isCombiningHeaders() {
        return this.combiningHeaders;
    }
    
    public boolean isValidatingHeaderNames() {
        return this.nameValidator != DefaultHttpHeadersFactory.NO_NAME_VALIDATOR;
    }
    
    public boolean isValidatingHeaderValues() {
        return this.valueValidator != DefaultHttpHeadersFactory.NO_VALUE_VALIDATOR;
    }
    
    static {
        DEFAULT_NAME_VALIDATOR = new DefaultHeaders.NameValidator<CharSequence>() {
            @Override
            public void validateName(final CharSequence name) {
                if (name == null || name.length() == 0) {
                    throw new IllegalArgumentException("empty headers are not allowed [" + (Object)name + ']');
                }
                final int index = HttpHeaderValidationUtil.validateToken(name);
                if (index != -1) {
                    throw new IllegalArgumentException("a header name can only contain \"token\" characters, but found invalid character 0x" + Integer.toHexString(name.charAt(index)) + " at index " + index + " of header '" + (Object)name + "'.");
                }
            }
        };
        DEFAULT_VALUE_VALIDATOR = new DefaultHeaders.ValueValidator<CharSequence>() {
            @Override
            public void validate(final CharSequence value) {
                final int index = HttpHeaderValidationUtil.validateValidHeaderValue(value);
                if (index != -1) {
                    throw new IllegalArgumentException("a header value contains prohibited character 0x" + Integer.toHexString(value.charAt(index)) + " at index " + index + '.');
                }
            }
        };
        DEFAULT_TRAILER_NAME_VALIDATOR = new DefaultHeaders.NameValidator<CharSequence>() {
            @Override
            public void validateName(final CharSequence name) {
                DefaultHttpHeadersFactory.DEFAULT_NAME_VALIDATOR.validateName(name);
                if (HttpHeaderNames.CONTENT_LENGTH.contentEqualsIgnoreCase(name) || HttpHeaderNames.TRANSFER_ENCODING.contentEqualsIgnoreCase(name) || HttpHeaderNames.TRAILER.contentEqualsIgnoreCase(name)) {
                    throw new IllegalArgumentException("prohibited trailing header: " + (Object)name);
                }
            }
        };
        NO_NAME_VALIDATOR = DefaultHeaders.NameValidator.NOT_NULL;
        NO_VALUE_VALIDATOR = DefaultHeaders.ValueValidator.NO_VALIDATION;
        DEFAULT = new DefaultHttpHeadersFactory(DefaultHttpHeadersFactory.DEFAULT_NAME_VALIDATOR, DefaultHttpHeadersFactory.DEFAULT_VALUE_VALIDATOR, false);
        DEFAULT_TRAILER = new DefaultHttpHeadersFactory(DefaultHttpHeadersFactory.DEFAULT_TRAILER_NAME_VALIDATOR, DefaultHttpHeadersFactory.DEFAULT_VALUE_VALIDATOR, false);
        DEFAULT_COMBINING = new DefaultHttpHeadersFactory(DefaultHttpHeadersFactory.DEFAULT.nameValidator, DefaultHttpHeadersFactory.DEFAULT.valueValidator, true);
        DEFAULT_NO_VALIDATION = new DefaultHttpHeadersFactory(DefaultHttpHeadersFactory.NO_NAME_VALIDATOR, DefaultHttpHeadersFactory.NO_VALUE_VALIDATOR, false);
    }
}
