// ***************************************************************************************************************************
// * 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.                                              *
// ***************************************************************************************************************************
package org.apache.juneau.http;

import static org.apache.juneau.internal.ClassUtils.*;
import static org.apache.juneau.internal.ExceptionUtils.*;
import static org.apache.juneau.internal.StringUtils.*;

import java.net.*;
import java.time.*;
import java.util.*;
import java.util.function.*;

import org.apache.http.*;
import org.apache.juneau.http.header.*;
import org.apache.juneau.http.header.Date;
import org.apache.juneau.http.part.*;
import org.apache.juneau.httppart.*;
import org.apache.juneau.internal.*;
import org.apache.juneau.oapi.*;
import org.apache.juneau.reflect.*;

/**
 * Standard predefined HTTP headers.
 * {@review}
 */
public class HttpHeaders {

	@SuppressWarnings("javadoc")
	public static final Accept
		ACCEPT_APPLICATION_ATOM_XML = Accept.APPLICATION_ATOM_XML,
		ACCEPT_APPLICATION_FORM_URLENCODED = Accept.APPLICATION_FORM_URLENCODED,
		ACCEPT_APPLICATION_JSON = Accept.APPLICATION_JSON,
		ACCEPT_APPLICATION_OCTET_STREAM = Accept.APPLICATION_OCTET_STREAM,
		ACCEPT_APPLICATION_SOAP_XML = Accept.APPLICATION_SOAP_XML,
		ACCEPT_APPLICATION_SVG_XML = Accept.APPLICATION_SVG_XML,
		ACCEPT_APPLICATION_XHTML_XML = Accept.APPLICATION_XHTML_XML,
		ACCEPT_APPLICATION_XML = Accept.APPLICATION_XML,
		ACCEPT_IMAGE_BMP = Accept.IMAGE_BMP,
		ACCEPT_IMAGE_GIF = Accept.IMAGE_GIF,
		ACCEPT_IMAGE_JPEG = Accept.IMAGE_JPEG,
		ACCEPT_IMAGE_PNG = Accept.IMAGE_PNG,
		ACCEPT_IMAGE_SVG = Accept.IMAGE_SVG,
		ACCEPT_IMAGE_TIFF = Accept.IMAGE_TIFF,
		ACCEPT_IMAGE_WEBP = Accept.IMAGE_WEBP,
		ACCEPT_MULTIPART_FORM_DATA = Accept.MULTIPART_FORM_DATA,
		ACCEPT_TEXT_HTML = Accept.TEXT_HTML,
		ACCEPT_TEXT_PLAIN = Accept.TEXT_PLAIN,
		ACCEPT_TEXT_XML = Accept.TEXT_XML,
		ACCEPT_WILDCARD = Accept.WILDCARD;

	@SuppressWarnings("javadoc")
	public static final ContentType
		CONTENTTYPE_APPLICATION_ATOM_XML = ContentType.APPLICATION_ATOM_XML,
		CONTENTTYPE_APPLICATION_FORM_URLENCODED = ContentType.APPLICATION_FORM_URLENCODED,
		CONTENTTYPE_APPLICATION_JSON = ContentType.APPLICATION_JSON,
		CONTENTTYPE_APPLICATION_OCTET_STREAM = ContentType.APPLICATION_OCTET_STREAM,
		CONTENTTYPE_APPLICATION_SOAP_XML = ContentType.APPLICATION_SOAP_XML,
		CONTENTTYPE_APPLICATION_SVG_XML = ContentType.APPLICATION_SVG_XML,
		CONTENTTYPE_APPLICATION_XHTML_XML = ContentType.APPLICATION_XHTML_XML,
		CONTENTTYPE_APPLICATION_XML = ContentType.APPLICATION_XML,
		CONTENTTYPE_IMAGE_BMP = ContentType.IMAGE_BMP,
		CONTENTTYPE_IMAGE_GIF = ContentType.IMAGE_GIF,
		CONTENTTYPE_IMAGE_JPEG = ContentType.IMAGE_JPEG,
		CONTENTTYPE_IMAGE_PNG = ContentType.IMAGE_PNG,
		CONTENTTYPE_IMAGE_SVG = ContentType.IMAGE_SVG,
		CONTENTTYPE_IMAGE_TIFF = ContentType.IMAGE_TIFF,
		CONTENTTYPE_IMAGE_WEBP = ContentType.IMAGE_WEBP,
		CONTENTTYPE_MULTIPART_FORM_DATA = ContentType.MULTIPART_FORM_DATA,
		CONTENTTYPE_TEXT_HTML = ContentType.TEXT_HTML,
		CONTENTTYPE_TEXT_PLAIN = ContentType.TEXT_PLAIN,
		CONTENTTYPE_TEXT_XML = ContentType.TEXT_XML,
		CONTENTTYPE_WILDCARD = ContentType.WILDCARD;

	//-----------------------------------------------------------------------------------------------------------------
	// Standard HTTP headers
	//-----------------------------------------------------------------------------------------------------------------

	/**
	 * Creates a new {@link Accept} header.
	 *
	 * @param value
	 * 	The header value.
	 * 	<br>Must be parsable by {@link MediaRanges#of(String)}.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final Accept accept(String value) {
		return Accept.of(value);
	}

	/**
	 * Creates a new {@link Accept} header.
	 *
	 * @param value
	 * 	The header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final Accept accept(MediaRanges value) {
		return Accept.of(value);
	}

	/**
	 * Creates a new {@link Accept} header.
	 *
	 * @param value
	 * 	The header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final Accept accept(MediaType value) {
		return Accept.of(value);
	}

	/**
	 * Creates a new {@link Accept} header with a delayed value.
	 *
	 * <p>
	 * Header value is re-evaluated on each call to {@link Header#getValue()}.
	 *
	 * @param value
	 * 	The header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final Accept accept(Supplier<MediaRanges> value) {
		return Accept.of(value);
	}

	/**
	 * Creates a new {@link AcceptCharset} header.
	 *
	 * @param value
	 * 	The header value.
	 * 	<br>Must be parsable by {@link StringRanges#of(String)}.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final AcceptCharset acceptCharset(String value) {
		return AcceptCharset.of(value);
	}

	/**
	 * Creates a new {@link AcceptCharset} header.
	 *
	 * @param value
	 * 	The header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final AcceptCharset acceptCharset(StringRanges value) {
		return AcceptCharset.of(value);
	}

	/**
	 * Creates a new {@link AcceptCharset} header with a delayed value.
	 *
	 * <p>
	 * Header value is re-evaluated on each call to {@link Header#getValue()}.
	 *
	 * @param value
	 * 	The supplier of the header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final AcceptCharset acceptCharset(Supplier<StringRanges> value) {
		return AcceptCharset.of(value);
	}

	/**
	 * Creates a new {@link AcceptEncoding} header.
	 *
	 * @param value
	 * 	The header value.
	 * 	<br>Must be parsable by {@link StringRanges#of(String)}.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final AcceptEncoding acceptEncoding(String value) {
		return AcceptEncoding.of(value);
	}

	/**
	 * Creates a new {@link AcceptEncoding} header.
	 *
	 * @param value
	 * 	The header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final AcceptEncoding acceptEncoding(StringRanges value) {
		return AcceptEncoding.of(value);
	}

	/**
	 * Creates a new {@link AcceptEncoding} header with a delayed value.
	 *
	 * <p>
	 * Header value is re-evaluated on each call to {@link Header#getValue()}.
	 *
	 * @param value
	 * 	The supplier of the header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final AcceptEncoding acceptEncoding(Supplier<StringRanges> value) {
		return AcceptEncoding.of(value);
	}

	/**
	 * Creates a new {@link AcceptLanguage} header.
	 *
	 * @param value
	 * 	The header value.
	 * 	<br>Must be parsable by {@link StringRanges#of(String)}.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final AcceptLanguage acceptLanguage(String value) {
		return AcceptLanguage.of(value);
	}

	/**
	 * Creates a new {@link AcceptLanguage} header.
	 *
	 * @param value
	 * 	The header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final AcceptLanguage acceptLanguage(StringRanges value) {
		return AcceptLanguage.of(value);
	}

	/**
	 * Creates a new {@link AcceptLanguage} header with a delayed value.
	 *
	 * <p>
	 * Header value is re-evaluated on each call to {@link Header#getValue()}.
	 *
	 * @param value
	 * 	The supplier of the header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final AcceptLanguage acceptLanguage(Supplier<StringRanges> value) {
		return AcceptLanguage.of(value);
	}

	/**
	 * Creates a new {@link AcceptRanges} header.
	 *
	 * @param value
	 * 	The header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final AcceptRanges acceptRanges(String value) {
		return AcceptRanges.of(value);
	}

	/**
	 * Creates a new {@link AcceptRanges} header with a delayed value.
	 *
	 * <p>
	 * Header value is re-evaluated on each call to {@link Header#getValue()}.
	 *
	 * @param value
	 * 	The supplier of the header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final AcceptRanges acceptRanges(Supplier<String> value) {
		return AcceptRanges.of(value);
	}

	/**
	 * Creates a new {@link Age} header.
	 *
	 * @param value
	 * 	The header value.
	 * 	<br>Must be parsable using {@link Integer#parseInt(String)}.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final Age age(String value) {
		return Age.of(value);
	}

	/**
	 * Creates a new {@link Age} header.
	 *
	 * @param value
	 * 	The header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final Age age(Integer value) {
		return Age.of(value);
	}

	/**
	 * Creates a new {@link Age} header with a delayed value.
	 *
	 * <p>
	 * Header value is re-evaluated on each call to {@link Header#getValue()}.
	 *
	 * @param value
	 * 	The supplier of the header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final Age age(Supplier<Integer> value) {
		return Age.of(value);
	}

	/**
	 * Creates a new {@link Allow} header.
	 *
	 * @param value
	 * 	The header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final Allow allow(String value) {
		return Allow.of(value);
	}

	/**
	 * Creates a new {@link Allow} header.
	 *
	 * @param value
	 * 	The header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final Allow allow(List<String> value) {
		return Allow.of(value);
	}

	/**
	 * Creates a new {@link Allow} header with a delayed value.
	 *
	 * <p>
	 * Header value is re-evaluated on each call to {@link Header#getValue()}.
	 *
	 * @param value
	 * 	The supplier of the header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final Allow allow(Supplier<List<String>> value) {
		return Allow.of(value);
	}

	/**
	 * Creates a new {@link Authorization} header.
	 *
	 * @param value
	 * 	The header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final Authorization authorization(String value) {
		return Authorization.of(value);
	}

	/**
	 * Creates a new {@link Authorization} header with a delayed value.
	 *
	 * <p>
	 * Header value is re-evaluated on each call to {@link Header#getValue()}.
	 *
	 * @param value
	 * 	The supplier of the header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final Authorization authorization(Supplier<String> value) {
		return Authorization.of(value);
	}

	/**
	 * Creates a new {@link CacheControl} header.
	 *
	 * @param value
	 * 	The header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final CacheControl cacheControl(String value) {
		return CacheControl.of(value);
	}

	/**
	 * Creates a new {@link CacheControl} header with a delayed value.
	 *
	 * <p>
	 * Header value is re-evaluated on each call to {@link Header#getValue()}.
	 *
	 * @param value
	 * 	The supplier of the header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final CacheControl cacheControl(Supplier<String> value) {
		return CacheControl.of(value);
	}

	/**
	 * Creates a new {@link ClientVersion} header.
	 *
	 * @param value
	 * 	The header value.
	 * 	<br>Must be parsable by {@link Version#of(String)}
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final ClientVersion clientVersion(String value) {
		return ClientVersion.of(value);
	}

	/**
	 * Creates a new {@link ClientVersion} header.
	 *
	 * @param value
	 * 	The header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final ClientVersion clientVersion(Version value) {
		return ClientVersion.of(value);
	}

	/**
	 * Creates a new {@link ClientVersion} header with a delayed value.
	 *
	 * <p>
	 * Header value is re-evaluated on each call to {@link Header#getValue()}.
	 *
	 * @param value
	 * 	The supplier of the header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final ClientVersion clientVersion(Supplier<Version> value) {
		return ClientVersion.of(value);
	}

	/**
	 * Creates a new {@link Connection} header.
	 *
	 * @param value
	 * 	The header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final Connection connection(String value) {
		return Connection.of(value);
	}

	/**
	 * Creates a new {@link Connection} header with a delayed value.
	 *
	 * <p>
	 * Header value is re-evaluated on each call to {@link Header#getValue()}.
	 *
	 * @param value
	 * 	The supplier of the header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final Connection connection(Supplier<String> value) {
		return Connection.of(value);
	}

	/**
	 * Creates a new {@link ContentDisposition} header.
	 *
	 * @param value
	 * 	The header value.
	 * 	<br>Must be parsable by {@link StringRanges#of(String)}.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final ContentDisposition contentDisposition(String value) {
		return ContentDisposition.of(value);
	}

	/**
	 * Creates a new {@link ContentDisposition} header.
	 *
	 * @param value
	 * 	The header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final ContentDisposition contentDisposition(StringRanges value) {
		return ContentDisposition.of(value);
	}

	/**
	 * Creates a new {@link ContentDisposition} header with a delayed value.
	 *
	 * <p>
	 * Header value is re-evaluated on each call to {@link Header#getValue()}.
	 *
	 * @param value
	 * 	The supplier of the header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final ContentDisposition contentDisposition(Supplier<StringRanges> value) {
		return ContentDisposition.of(value);
	}

	/**
	 * Creates a new {@link ContentEncoding} header.
	 *
	 * @param value
	 * 	The header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final ContentEncoding contentEncoding(String value) {
		return ContentEncoding.of(value);
	}

	/**
	 * Creates a new {@link ContentEncoding} header with a delayed value.
	 *
	 * <p>
	 * Header value is re-evaluated on each call to {@link Header#getValue()}.
	 *
	 * @param value
	 * 	The supplier of the header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final ContentEncoding contentEncoding(Supplier<String> value) {
		return ContentEncoding.of(value);
	}

	/**
	 * Creates a new {@link ContentLanguage} header.
	 *
	 * @param value
	 * 	The header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final ContentLanguage contentLanguage(String value) {
		return ContentLanguage.of(value);
	}

	/**
	 * Creates a new {@link ContentLanguage} header.
	 *
	 * @param value
	 * 	The header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final ContentLanguage contentLanguage(List<String> value) {
		return ContentLanguage.of(value);
	}

	/**
	 * Creates a new {@link ContentLanguage} header with a delayed value.
	 *
	 * <p>
	 * Header value is re-evaluated on each call to {@link Header#getValue()}.
	 *
	 * @param value
	 * 	The supplier of the header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final ContentLanguage contentLanguage(Supplier<List<String>> value) {
		return ContentLanguage.of(value);
	}

	/**
	 * Creates a new {@link ContentLength} header.
	 *
	 * @param value
	 * 	The header value.
	 * 	<br>Must be parsable using {@link Long#parseLong(String)}.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final ContentLength contentLength(String value) {
		return ContentLength.of(value);
	}

	/**
	 * Creates a new {@link ContentLength} header.
	 *
	 * @param value
	 * 	The header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final ContentLength contentLength(Long value) {
		return ContentLength.of(value);
	}

	/**
	 * Creates a new {@link ContentLength} header with a delayed value.
	 *
	 * <p>
	 * Header value is re-evaluated on each call to {@link Header#getValue()}.
	 *
	 * @param value
	 * 	The supplier of the header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final ContentLength contentLength(Supplier<Long> value) {
		return ContentLength.of(value);
	}

	/**
	 * Creates a new {@link ContentLocation} header.
	 *
	 * @param value
	 * 	The header value.
	 * 	<br>Must be parsable by {@link URI#create(String)}.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final ContentLocation contentLocation(String value) {
		return ContentLocation.of(value);
	}

	/**
	 * Creates a new {@link ContentLocation} header.
	 *
	 * @param value
	 * 	The header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final ContentLocation contentLocation(URI value) {
		return ContentLocation.of(value);
	}

	/**
	 * Creates a new {@link ContentLocation} header with a delayed value.
	 *
	 * <p>
	 * Header value is re-evaluated on each call to {@link Header#getValue()}.
	 *
	 * @param value
	 * 	The supplier of the header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final ContentLocation contentLocation(Supplier<URI> value) {
		return ContentLocation.of(value);
	}

	/**
	 * Creates a new {@link ContentRange} header.
	 *
	 * @param value
	 * 	The header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final ContentRange contentRange(String value) {
		return ContentRange.of(value);
	}

	/**
	 * Creates a new {@link ContentRange} header with a delayed value.
	 *
	 * <p>
	 * Header value is re-evaluated on each call to {@link Header#getValue()}.
	 *
	 * @param value
	 * 	The supplier of the header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final ContentRange contentRange(Supplier<String> value) {
		return ContentRange.of(value);
	}

	/**
	 * Creates a new {@link ContentType} header.
	 *
	 * @param value
	 * 	The header value.
	 * 	<br>Must be parsable by {@link MediaType#of(String)}.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final ContentType contentType(String value) {
		return ContentType.of(value);
	}

	/**
	 * Creates a new {@link ContentType} header.
	 *
	 * @param value
	 * 	The header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final ContentType contentType(MediaType value) {
		return ContentType.of(value);
	}

	/**
	 * Creates a new {@link ContentType} header with a delayed value.
	 *
	 * <p>
	 * Header value is re-evaluated on each call to {@link Header#getValue()}.
	 *
	 * @param value
	 * 	The header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final ContentType contentType(Supplier<MediaType> value) {
		return ContentType.of(value);
	}

	/**
	 * Creates a new {@link Date} header.
	 *
	 * @param value
	 * 	The header value.
	 * 	<br>Must be an RFC-1123 formated string (e.g. <js>"Sat, 29 Oct 1994 19:43:31 GMT"</js>).
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the name is <jk>null</jk> or empty or the value is <jk>null</jk>.
	 */
	public static final Date date(String value) {
		return Date.of(value);
	}

	/**
	 * Creates a new {@link Date} header.
	 *
	 * @param value
	 * 	The header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the name is <jk>null</jk> or empty or the value is <jk>null</jk>.
	 */
	public static final Date date(ZonedDateTime value) {
		return Date.of(value);
	}

	/**
	 * Creates a new {@link Date} header with a delayed value.
	 *
	 * <p>
	 * Header value is re-evaluated on each call to {@link Header#getValue()}.
	 *
	 * @param value
	 * 	The supplier of the header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the name is <jk>null</jk> or empty or the value is <jk>null</jk>.
	 */
	public static final Date date(Supplier<ZonedDateTime> value) {
		return Date.of(value);
	}

	/**
	 * Creates a new {@link Debug} header.
	 *
	 * @param value
	 * 	The header value.
	 * 	<br>Must be parsable by {@link Boolean#parseBoolean(String)}.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value was <jk>null</jk>.
	 */
	public static final Debug debug(String value) {
		return Debug.of(value);
	}

	/**
	 * Creates a new {@link Debug} header.
	 *
	 * @param value
	 * 	The header value.
	 * 	<br>Must be parsable by {@link Boolean#parseBoolean(String)}.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value was <jk>null</jk>.
	 */
	public static final Debug debug(Boolean value) {
		return Debug.of(value);
	}

	/**
	 * Creates a new {@link Debug} header with a delayed value.
	 *
	 * <p>
	 * Header value is re-evaluated on each call to {@link Header#getValue()}.
	 *
	 * @param value
	 * 	The header value supplier.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value was <jk>null</jk>.
	 */
	public static final Debug debug(Supplier<Boolean> value) {
		return Debug.of(value);
	}

	/**
	 * Creates a new {@link ETag} header.
	 *
	 * @param value
	 * 	The header value.
	 * 	<br>Must be an entity tag value (e.g. <js>"\"xyzzy\""</js>).
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final ETag eTag(String value) {
		return ETag.of(value);
	}

	/**
	 * Creates a new {@link ETag} header.
	 *
	 * @param value
	 * 	The header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final ETag eTag(EntityTag value) {
		return ETag.of(value);
	}

	/**
	 * Creates a new {@link ETag} header with a delayed value.
	 *
	 * <p>
	 * Header value is re-evaluated on each call to {@link Header#getValue()}.
	 *
	 * @param value
	 * 	The supplier of the header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final ETag eTag(Supplier<EntityTag> value) {
		return ETag.of(value);
	}

	/**
	 * Creates a new {@link Expect} header.
	 *
	 * @param value
	 * 	The header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final Expect expect(String value) {
		return Expect.of(value);
	}

	/**
	 * Creates a new {@link Expect} header with a delayed value.
	 *
	 * <p>
	 * Header value is re-evaluated on each call to {@link Header#getValue()}.
	 *
	 * @param value
	 * 	The supplier of the header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final Expect expect(Supplier<String> value) {
		return Expect.of(value);
	}

	/**
	 * Creates a new {@link Expires} header.
	 *
	 * @param value
	 * 	The header value.
	 * 	<br>Must be an RFC-1123 formated string (e.g. <js>"Sat, 29 Oct 1994 19:43:31 GMT"</js>).
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the name is <jk>null</jk> or empty or the value is <jk>null</jk>.
	 */
	public static final Expires expires(String value) {
		return Expires.of(value);
	}

	/**
	 * Creates a new {@link Expires} header.
	 *
	 * @param value
	 * 	The header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the name is <jk>null</jk> or empty or the value is <jk>null</jk>.
	 */
	public static final Expires expires(ZonedDateTime value) {
		return Expires.of(value);
	}

	/**
	 * Creates a new {@link Expires} header with a delayed value.
	 *
	 * <p>
	 * Header value is re-evaluated on each call to {@link Header#getValue()}.
	 *
	 * @param value
	 * 	The supplier of the header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the name is <jk>null</jk> or empty or the value is <jk>null</jk>.
	 */
	public static final Expires expires(Supplier<ZonedDateTime> value) {
		return Expires.of(value);
	}

	/**
	 * Creates a new {@link Forwarded} header.
	 *
	 * @param value
	 * 	The header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final Forwarded forwarded(String value) {
		return Forwarded.of(value);
	}

	/**
	 * Creates a new {@link Forwarded} header with a delayed value.
	 *
	 * <p>
	 * Header value is re-evaluated on each call to {@link Header#getValue()}.
	 *
	 * @param value
	 * 	The supplier of the header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final Forwarded forwarded(Supplier<String> value) {
		return Forwarded.of(value);
	}

	/**
	 * Creates a new {@link From} header.
	 *
	 * @param value
	 * 	The header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final From from(String value) {
		return From.of(value);
	}

	/**
	 * Creates a new {@link From} header with a delayed value.
	 *
	 * <p>
	 * Header value is re-evaluated on each call to {@link Header#getValue()}.
	 *
	 * @param value
	 * 	The supplier of the header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final From from(Supplier<String> value) {
		return From.of(value);
	}

	/**
	 * Creates a new {@link Host} header.
	 *
	 * @param value
	 * 	The header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final Host host(String value) {
		return Host.of(value);
	}

	/**
	 * Creates a new {@link Host} header with a delayed value.
	 *
	 * <p>
	 * Header value is re-evaluated on each call to {@link Header#getValue()}.
	 *
	 * @param value
	 * 	The supplier of the header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final Host host(Supplier<String> value) {
		return Host.of(value);
	}

	/**
	 * Creates a new {@link IfMatch} header.
	 *
	 * @param value
	 * 	The header value.
	 * 	<br>Must be a comma-delimited list of entity validator values (e.g. <js>"\"xyzzy\", \"r2d2xxxx\", \"c3piozzzz\""</js>).
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final IfMatch ifMatch(String value) {
		return IfMatch.of(value);
	}

	/**
	 * Creates a new {@link IfMatch} header.
	 *
	 * @param value
	 * 	The header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final IfMatch ifMatch(List<EntityTag> value) {
		return IfMatch.of(value);
	}

	/**
	 * Creates a new {@link IfMatch} header with a delayed value.
	 *
	 * <p>
	 * Header value is re-evaluated on each call to {@link Header#getValue()}.
	 *
	 * @param value
	 * 	The supplier of the header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final IfMatch ifMatch(Supplier<List<EntityTag>> value) {
		return IfMatch.of(value);
	}

	/**
	 * Creates a new {@link IfModifiedSince} header.
	 *
	 * @param value
	 * 	The header value.
	 * 	<br>Must be an RFC-1123 formated string (e.g. <js>"Sat, 29 Oct 1994 19:43:31 GMT"</js>).
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the name is <jk>null</jk> or empty or the value is <jk>null</jk>.
	 */
	public static final IfModifiedSince ifModifiedSince(String value) {
		return IfModifiedSince.of(value);
	}

	/**
	 * Creates a new {@link IfModifiedSince} header.
	 *
	 * @param value
	 * 	The header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the name is <jk>null</jk> or empty or the value is <jk>null</jk>.
	 */
	public static final IfModifiedSince ifModifiedSince(ZonedDateTime value) {
		return IfModifiedSince.of(value);
	}

	/**
	 * Creates a new {@link IfModifiedSince} header with a delayed value.
	 *
	 * <p>
	 * Header value is re-evaluated on each call to {@link Header#getValue()}.
	 *
	 * @param value
	 * 	The supplier of the header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the name is <jk>null</jk> or empty or the value is <jk>null</jk>.
	 */
	public static final IfModifiedSince ifModifiedSince(Supplier<ZonedDateTime> value) {
		return IfModifiedSince.of(value);
	}

	/**
	 * Creates a new {@link IfNoneMatch} header.
	 *
	 * @param value
	 * 	The header value.
	 * 	<br>Must be a comma-delimited list of entity validator values (e.g. <js>"\"xyzzy\", \"r2d2xxxx\", \"c3piozzzz\""</js>).
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final IfNoneMatch ifNoneMatch(String value) {
		return IfNoneMatch.of(value);
	}

	/**
	 * Creates a new {@link IfNoneMatch} header.
	 *
	 * @param value
	 * 	The header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final IfNoneMatch ifNoneMatch(List<EntityTag> value) {
		return IfNoneMatch.of(value);
	}

	/**
	 * Creates a new {@link IfNoneMatch} header with a delayed value.
	 *
	 * <p>
	 * Header value is re-evaluated on each call to {@link Header#getValue()}.
	 *
	 * @param value
	 * 	The supplier of the header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final IfNoneMatch ifNoneMatch(Supplier<List<EntityTag>> value) {
		return IfNoneMatch.of(value);
	}

	/**
	 * Creates a new {@link IfRange} header.
	 *
	 * @param value
	 * 	The header value.
	 * 	<br>Must be an RFC-1123 formated string (e.g. <js>"Sat, 29 Oct 1994 19:43:31 GMT"</js>).
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the name is <jk>null</jk> or empty or the value is <jk>null</jk>.
	 */
	public static final IfRange ifRange(String value) {
		return IfRange.of(value);
	}

	/**
	 * Creates a new {@link IfRange} header.
	 *
	 * @param value
	 * 	The header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the name is <jk>null</jk> or empty or the value is <jk>null</jk>.
	 */
	public static final IfRange ifRange(ZonedDateTime value) {
		return IfRange.of(value);
	}

	/**
	 * Creates a new {@link IfRange} header.
	 *
	 * @param value
	 * 	The header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the name is <jk>null</jk> or empty or the value is <jk>null</jk>.
	 */
	public static final IfRange ifRange(EntityTag value) {
		return IfRange.of(value);
	}

	/**
	 * Creates a new {@link IfRange} header with a delayed value.
	 *
	 * <p>
	 * Header value is re-evaluated on each call to {@link Header#getValue()}.
	 *
	 * @param value
	 * 	The supplier of the header value.
	 * 	<br>Supplier must supply either {@link EntityTag} or {@link ZonedDateTime} objects.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the name is <jk>null</jk> or empty or the value is <jk>null</jk>.
	 */
	public static final IfRange ifRange(Supplier<?> value) {
		return IfRange.of(value);
	}

	/**
	 * Creates a new {@link IfUnmodifiedSince} header.
	 *
	 * @param value
	 * 	The header value.
	 * 	<br>Must be an RFC-1123 formated string (e.g. <js>"Sat, 29 Oct 1994 19:43:31 GMT"</js>).
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the name is <jk>null</jk> or empty or the value is <jk>null</jk>.
	 */
	public static final IfUnmodifiedSince ifUnmodifiedSince(String value) {
		return IfUnmodifiedSince.of(value);
	}

	/**
	 * Creates a new {@link IfUnmodifiedSince} header.
	 *
	 * @param value
	 * 	The header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the name is <jk>null</jk> or empty or the value is <jk>null</jk>.
	 */
	public static final IfUnmodifiedSince ifUnmodifiedSince(ZonedDateTime value) {
		return IfUnmodifiedSince.of(value);
	}

	/**
	 * Creates a new {@link IfUnmodifiedSince} header with a delayed value.
	 *
	 * <p>
	 * Header value is re-evaluated on each call to {@link Header#getValue()}.
	 *
	 * @param value
	 * 	The supplier of the header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the name is <jk>null</jk> or empty or the value is <jk>null</jk>.
	 */
	public static final IfUnmodifiedSince ifUnmodifiedSince(Supplier<ZonedDateTime> value) {
		return IfUnmodifiedSince.of(value);
	}

	/**
	 * Creates a new {@link LastModified} header.
	 *
	 * @param value
	 * 	The header value.
	 * 	<br>Must be an RFC-1123 formated string (e.g. <js>"Sat, 29 Oct 1994 19:43:31 GMT"</js>).
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the name is <jk>null</jk> or empty or the value is <jk>null</jk>.
	 */
	public static final LastModified lastModified(String value) {
		return LastModified.of(value);
	}

	/**
	 * Creates a new {@link LastModified} header.
	 *
	 * @param value
	 * 	The header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the name is <jk>null</jk> or empty or the value is <jk>null</jk>.
	 */
	public static final LastModified lastModified(ZonedDateTime value) {
		return LastModified.of(value);
	}

	/**
	 * Creates a new {@link LastModified} header with a delayed value.
	 *
	 * <p>
	 * Header value is re-evaluated on each call to {@link Header#getValue()}.
	 *
	 * @param value
	 * 	The supplier of the header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the name is <jk>null</jk> or empty or the value is <jk>null</jk>.
	 */
	public static final LastModified lastModified(Supplier<ZonedDateTime> value) {
		return LastModified.of(value);
	}

	/**
	 * Creates a new {@link Location} header.
	 *
	 * @param value
	 * 	The header value.
	 * 	<br>Must be parsable by {@link URI#create(String)}.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final Location location(String value) {
		return Location.of(value);
	}

	/**
	 * Creates a new {@link Location} header.
	 *
	 * @param value
	 * 	The header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final Location location(URI value) {
		return Location.of(value);
	}

	/**
	 * Creates a new {@link Location} header with a delayed value.
	 *
	 * <p>
	 * Header value is re-evaluated on each call to {@link Header#getValue()}.
	 *
	 * @param value
	 * 	The supplier of the header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final Location location(Supplier<URI> value) {
		return Location.of(value);
	}

	/**
	 * Creates a new {@link MaxForwards} header.
	 *
	 * @param value
	 * 	The header value.
	 * 	<br>Must be parsable using {@link Integer#parseInt(String)}.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final MaxForwards maxForwards(String value) {
		return MaxForwards.of(value);
	}

	/**
	 * Creates a new {@link MaxForwards} header.
	 *
	 * @param value
	 * 	The header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final MaxForwards maxForwards(Integer value) {
		return MaxForwards.of(value);
	}

	/**
	 * Creates a new {@link MaxForwards} header with a delayed value.
	 *
	 * <p>
	 * Header value is re-evaluated on each call to {@link Header#getValue()}.
	 *
	 * @param value
	 * 	The supplier of the header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final MaxForwards maxForwards(Supplier<Integer> value) {
		return MaxForwards.of(value);
	}

	/**
	 * Creates a new {@link NoTrace} header.
	 *
	 * @param value
	 * 	The header value.
	 * 	<br>Must be parsable by {@link Boolean#parseBoolean(String)}.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value was <jk>null</jk>.
	 */
	public static final NoTrace noTrace(String value) {
		return NoTrace.of(value);
	}

	/**
	 * Creates a new {@link NoTrace} header.
	 *
	 * @param value
	 * 	The header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value was <jk>null</jk>.
	 */
	public static final NoTrace noTrace(Boolean value) {
		return NoTrace.of(value);
	}

	/**
	 * Creates a new {@link NoTrace} header with a delayed value.
	 *
	 * <p>
	 * Header value is re-evaluated on each call to {@link Header#getValue()}.
	 *
	 * @param value
	 * 	The header value supplier.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value was <jk>null</jk>.
	 */
	public static final NoTrace noTrace(Supplier<Boolean> value) {
		return NoTrace.of(value);
	}

	/**
	 * Creates a new {@link Origin} header.
	 *
	 * @param value
	 * 	The header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final Origin origin(String value) {
		return Origin.of(value);
	}

	/**
	 * Creates a new {@link Origin} header with a delayed value.
	 *
	 * <p>
	 * Header value is re-evaluated on each call to {@link Header#getValue()}.
	 *
	 * @param value
	 * 	The supplier of the header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final Origin origin(Supplier<String> value) {
		return Origin.of(value);
	}

	/**
	 * Creates a new {@link Pragma} header.
	 *
	 * @param value
	 * 	The header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final Pragma pragma(String value) {
		return Pragma.of(value);
	}

	/**
	 * Creates a new {@link Pragma} header with a delayed value.
	 *
	 * <p>
	 * Header value is re-evaluated on each call to {@link Header#getValue()}.
	 *
	 * @param value
	 * 	The header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final Pragma pragma(Supplier<String> value) {
		return Pragma.of(value);
	}

	/**
	 * Creates a new {@link ProxyAuthenticate} header.
	 *
	 * @param value
	 * 	The header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final ProxyAuthenticate proxyAuthenticate(String value) {
		return ProxyAuthenticate.of(value);
	}

	/**
	 * Creates a new {@link ProxyAuthenticate} header with a delayed value.
	 *
	 * <p>
	 * Header value is re-evaluated on each call to {@link Header#getValue()}.
	 *
	 * @param value
	 * 	The supplier of the header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final ProxyAuthenticate proxyAuthenticate(Supplier<String> value) {
		return ProxyAuthenticate.of(value);
	}

	/**
	 * Creates a new {@link ProxyAuthorization} header.
	 *
	 * @param value
	 * 	The header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final ProxyAuthorization proxyAuthorization(String value) {
		return ProxyAuthorization.of(value);
	}

	/**
	 * Creates a new {@link ProxyAuthorization} header with a delayed value.
	 *
	 * <p>
	 * Header value is re-evaluated on each call to {@link Header#getValue()}.
	 *
	 * @param value
	 * 	The supplier of the header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final ProxyAuthorization proxyAuthorization(Supplier<String> value) {
		return ProxyAuthorization.of(value);
	}

	/**
	 * Creates a new {@link Range} header.
	 *
	 * @param value
	 * 	The header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final Range range(String value) {
		return Range.of(value);
	}

	/**
	 * Creates a new {@link Range} header with a delayed value.
	 *
	 * <p>
	 * Header value is re-evaluated on each call to {@link Header#getValue()}.
	 *
	 * @param value
	 * 	The supplier of the header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final Range range(Supplier<String> value) {
		return Range.of(value);
	}

	/**
	 * Creates a new {@link Referer} header.
	 *
	 * @param value
	 * 	The header value.
	 * 	<br>Must be parsable by {@link URI#create(String)}.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final Referer referer(String value) {
		return Referer.of(value);
	}

	/**
	 * Creates a new {@link Referer} header.
	 *
	 * @param value
	 * 	The header value.
	 * 	<br>Must be parsable by {@link URI#create(String)}.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final Referer referer(URI value) {
		return Referer.of(value);
	}

	/**
	 * Creates a new {@link Referer} header with a delayed value.
	 *
	 * <p>
	 * Header value is re-evaluated on each call to {@link Header#getValue()}.
	 *
	 * @param value
	 * 	The supplier of the header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final Referer referer(Supplier<URI> value) {
		return Referer.of(value);
	}

	/**
	 * Creates a new {@link RetryAfter} header.
	 *
	 * @param value
	 * 	The header value.
	 * 	<br>Must be an RFC-1123 formated string (e.g. <js>"Sat, 29 Oct 1994 19:43:31 GMT"</js>) or an integer.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the name is <jk>null</jk> or empty or the value is <jk>null</jk>.
	 */
	public static final RetryAfter retryAfter(String value) {
		return RetryAfter.of(value);
	}

	/**
	 * Creates a new {@link RetryAfter} header.
	 *
	 * @param value
	 * 	The header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the name is <jk>null</jk> or empty or the value is <jk>null</jk>.
	 */
	public static final RetryAfter retryAfter(ZonedDateTime value) {
		return RetryAfter.of(value);
	}

	/**
	 * Creates a new {@link RetryAfter} header.
	 *
	 * @param value
	 * 	The header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the name is <jk>null</jk> or empty or the value is <jk>null</jk>.
	 */
	public static final RetryAfter retryAfter(Integer value) {
		return RetryAfter.of(value);
	}

	/**
	 * Creates a new {@link RetryAfter} header with a delayed value.
	 *
	 * <p>
	 * Header value is re-evaluated on each call to {@link Header#getValue()}.
	 *
	 * @param value
	 * 	The supplier of the header value.
	 * 	<br>Supplier must supply either {@link Integer} or {@link ZonedDateTime} objects.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the name is <jk>null</jk> or empty or the value is <jk>null</jk>.
	 */
	public static final RetryAfter retryAfter(Supplier<?> value) {
		return RetryAfter.of(value);
	}

	/**
	 * Creates a new {@link Server} header.
	 *
	 * @param value
	 * 	The header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final Server server(String value) {
		return Server.of(value);
	}

	/**
	 * Creates a new {@link Server} header with a delayed value.
	 *
	 * <p>
	 * Header value is re-evaluated on each call to {@link Header#getValue()}.
	 *
	 * @param value
	 * 	The supplier of the header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final Server server(Supplier<String> value) {
		return Server.of(value);
	}

	/**
	 * Creates a new {@link TE} header.
	 *
	 * @param value
	 * 	The header value.
	 * 	<br>Must be parsable by {@link StringRanges#of(String)}.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final TE te(String value) {
		return TE.of(value);
	}

	/**
	 * Creates a new {@link TE} header.
	 *
	 * @param value
	 * 	The header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final TE te(StringRanges value) {
		return TE.of(value);
	}

	/**
	 * Creates a new {@link TE} header with a delayed value.
	 *
	 * <p>
	 * Header value is re-evaluated on each call to {@link Header#getValue()}.
	 *
	 * @param value
	 * 	The supplier of the header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final TE te(Supplier<StringRanges> value) {
		return TE.of(value);
	}

	/**
	 * Creates a new {@link Thrown} header.
	 *
	 * @param value
	 * 	The header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final Thrown thrown(String value) {
		return Thrown.of(value);
	}

	/**
	 * Creates a new {@link Thrown} header.
	 *
	 * @param value
	 * 	The header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final Thrown thrown(Throwable...value) {
		return Thrown.of(value);
	}

	/**
	 * Creates a new {@link Trailer} header.
	 *
	 * @param value
	 * 	The header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final Trailer trailer(String value) {
		return Trailer.of(value);
	}

	/**
	 * Creates a new {@link Trailer} header with a delayed value.
	 *
	 * <p>
	 * Header value is re-evaluated on each call to {@link Header#getValue()}.
	 *
	 * @param value
	 * 	The supplier of the header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final Trailer trailer(Supplier<String> value) {
		return Trailer.of(value);
	}

	/**
	 * Creates a new {@link TransferEncoding} header.
	 *
	 * @param value
	 * 	The header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final TransferEncoding transferEncoding(String value) {
		return TransferEncoding.of(value);
	}

	/**
	 * Creates a new {@link TransferEncoding} header with a delayed value.
	 *
	 * <p>
	 * Header value is re-evaluated on each call to {@link Header#getValue()}.
	 *
	 * @param value
	 * 	The supplier of the header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final TransferEncoding transferEncoding(Supplier<String> value) {
		return TransferEncoding.of(value);
	}

	/**
	 * Creates a new {@link Upgrade} header.
	 *
	 * @param value
	 * 	The header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final Upgrade upgrade(String value) {
		return Upgrade.of(value);
	}

	/**
	 * Creates a new {@link Upgrade} header.
	 *
	 * @param value
	 * 	The header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final Upgrade upgrade(List<String> value) {
		return Upgrade.of(value);
	}

	/**
	 * Creates a new {@link Upgrade} header with a delayed value.
	 *
	 * <p>
	 * Header value is re-evaluated on each call to {@link Header#getValue()}.
	 *
	 * @param value
	 * 	The supplier of the header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final Upgrade upgrade(Supplier<List<String>> value) {
		return Upgrade.of(value);
	}

	/**
	 * Creates a new {@link UserAgent} header.
	 *
	 * @param value
	 * 	The header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final UserAgent userAgent(String value) {
		return UserAgent.of(value);
	}

	/**
	 * Creates a new {@link UserAgent} header with a delayed value.
	 *
	 * <p>
	 * Header value is re-evaluated on each call to {@link Header#getValue()}.
	 *
	 * @param value
	 * 	The supplier of the header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final UserAgent userAgent(Supplier<String> value) {
		return UserAgent.of(value);
	}

	/**
	 * Creates a new {@link Vary} header.
	 *
	 * @param value
	 * 	The header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final Vary vary(String value) {
		return Vary.of(value);
	}

	/**
	 * Creates a new {@link Vary} header with a delayed value.
	 *
	 * <p>
	 * Header value is re-evaluated on each call to {@link Header#getValue()}.
	 *
	 * @param value
	 * 	The supplier of the header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final Vary vary(Supplier<String> value) {
		return Vary.of(value);
	}

	/**
	 * Creates a new {@link Via} header.
	 *
	 * @param value
	 * 	The header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final Via via(String value) {
		return Via.of(value);
	}

	/**
	 * Creates a new {@link Via} header.
	 *
	 * @param value
	 * 	The header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final Via via(List<String> value) {
		return Via.of(value);
	}

	/**
	 * Creates a new {@link Via} header with a delayed value.
	 *
	 * <p>
	 * Header value is re-evaluated on each call to {@link Header#getValue()}.
	 *
	 * @param value
	 * 	The supplier of the header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final Via via(Supplier<List<String>> value) {
		return Via.of(value);
	}

	/**
	 * Creates a new {@link Warning} header.
	 *
	 * @param value
	 * 	The header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final Warning warning(String value) {
		return Warning.of(value);
	}

	/**
	 * Creates a new {@link Warning} header with a delayed value.
	 *
	 * <p>
	 * Header value is re-evaluated on each call to {@link Header#getValue()}.
	 *
	 * @param value
	 * 	The supplier of the header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final Warning warning(Supplier<String> value) {
		return Warning.of(value);
	}

	/**
	 * Creates a new {@link WwwAuthenticate} header.
	 *
	 * @param value
	 * 	The header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final WwwAuthenticate wwwAuthenticate(String value) {
		return WwwAuthenticate.of(value);
	}

	/**
	 * Creates a new {@link WwwAuthenticate} header with a delayed value.
	 *
	 * <p>
	 * Header value is re-evaluated on each call to {@link Header#getValue()}.
	 *
	 * @param value
	 * 	The supplier of the header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the value is <jk>null</jk>.
	 */
	public static final WwwAuthenticate wwwAuthenticate(Supplier<String> value) {
		return WwwAuthenticate.of(value);
	}

	//-----------------------------------------------------------------------------------------------------------------
	// Custom headers
	//-----------------------------------------------------------------------------------------------------------------

	/**
	 * Creates a new {@link BasicBooleanHeader} header.
	 *
	 * @param name The header name.
	 * @param value
	 * 	The header value.
	 * 	<br>Must be parsable by {@link Boolean#parseBoolean(String)}.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the name is <jk>null</jk> or empty or the value is <jk>null</jk>.
	 */
	public static final BasicBooleanHeader booleanHeader(String name, String value) {
		return BasicBooleanHeader.of(name, value);
	}

	/**
	 * Creates a new {@link BasicBooleanHeader} header.
	 *
	 * @param name The header name.
	 * @param value
	 * 	The header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the name is <jk>null</jk> or empty or the value is <jk>null</jk>.
	 */
	public static final BasicBooleanHeader booleanHeader(String name, Boolean value) {
		return BasicBooleanHeader.of(name, value);
	}

	/**
	 * Creates a new {@link BasicBooleanHeader} header with a delayed value.
	 *
	 * <p>
	 * Header value is re-evaluated on each call to {@link Header#getValue()}.
	 *
	 * @param name The header name.
	 * @param value
	 * 	The supplier of the header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the name is <jk>null</jk> or empty or the value is <jk>null</jk>.
	 */
	public static final BasicBooleanHeader booleanHeader(String name, Supplier<Boolean> value) {
		return BasicBooleanHeader.of(name, value);
	}

	/**
	 * Creates a new {@link BasicCsvArrayHeader} header.
	 *
	 * @param name The header name.
	 * @param value
	 * 	The header value.
	 * 	<br>Must be a comma-delimited list.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the name is <jk>null</jk> or empty or the value is <jk>null</jk>.
	 */
	public static final BasicCsvArrayHeader csvArrayHeader(String name, String value) {
		return BasicCsvArrayHeader.of(name, value);
	}

	/**
	 * Creates a new {@link BasicCsvArrayHeader} header.
	 *
	 * @param name The header name.
	 * @param value
	 * 	The header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the name is <jk>null</jk> or empty or the value is <jk>null</jk>.
	 */
	public static final BasicCsvArrayHeader csvArrayHeader(String name, List<String> value) {
		return BasicCsvArrayHeader.of(name, value);
	}

	/**
	 * Creates a new {@link BasicCsvArrayHeader} header with a delayed value.
	 *
	 * <p>
	 * Header value is re-evaluated on each call to {@link Header#getValue()}.
	 *
	 * @param name The header name.
	 * @param value
	 * 	The supplier of the header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the name is <jk>null</jk> or empty or the value is <jk>null</jk>.
	 */
	public static final BasicCsvArrayHeader csvArrayHeader(String name, Supplier<List<String>> value) {
		return BasicCsvArrayHeader.of(name, value);
	}

	/**
	 * Creates a new {@link BasicDateHeader} header.
	 *
	 * @param name The header name.
	 * @param value
	 * 	The header value.
	 * 	<br>Must be an RFC-1123 formated string (e.g. <js>"Sat, 29 Oct 1994 19:43:31 GMT"</js>).
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the name is <jk>null</jk> or empty or the value is <jk>null</jk>.
	 */
	public static final BasicDateHeader dateHeader(String name, String value) {
		return BasicDateHeader.of(name, value);
	}

	/**
	 * Creates a new {@link BasicDateHeader} header.
	 *
	 * @param name The header name.
	 * @param value
	 * 	The header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the name is <jk>null</jk> or empty or the value is <jk>null</jk>.
	 */
	public static final BasicDateHeader dateHeader(String name, ZonedDateTime value) {
		return BasicDateHeader.of(name, value);
	}

	/**
	 * Creates a new {@link BasicDateHeader} header with a delayed value.
	 *
	 * <p>
	 * Header value is re-evaluated on each call to {@link Header#getValue()}.
	 *
	 * @param name The header name.
	 * @param value
	 * 	The supplier of the header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the name is <jk>null</jk> or empty or the value is <jk>null</jk>.
	 */
	public static final BasicDateHeader dateHeader(String name, Supplier<ZonedDateTime> value) {
		return BasicDateHeader.of(name, value);
	}

	/**
	 * Creates a new {@link BasicEntityTagArrayHeader} header.
	 *
	 * @param name The header name.
	 * @param value
	 * 	The header value.
	 * 	<br>Must be a comma-delimited list of entity validator values (e.g. <js>"\"xyzzy\", \"r2d2xxxx\", \"c3piozzzz\""</js>).
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the name is <jk>null</jk> or empty or the value is <jk>null</jk>.
	 */
	public static final BasicEntityTagArrayHeader entityTagArrayHeader(String name, String value) {
		return BasicEntityTagArrayHeader.of(name, value);
	}

	/**
	 * Creates a new {@link BasicEntityTagArrayHeader} header.
	 *
	 * @param name The header name.
	 * @param value
	 * 	The header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the name is <jk>null</jk> or empty or the value is <jk>null</jk>.
	 */
	public static final BasicEntityTagArrayHeader entityTagArrayHeader(String name, List<EntityTag> value) {
		return BasicEntityTagArrayHeader.of(name, value);
	}

	/**
	 * Creates a new {@link BasicEntityTagArrayHeader} header with a delayed value.
	 *
	 * <p>
	 * Header value is re-evaluated on each call to {@link Header#getValue()}.
	 *
	 * @param name The header name.
	 * @param value
	 * 	The supplier of the header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the name is <jk>null</jk> or empty or the value is <jk>null</jk>.
	 */
	public static final BasicEntityTagArrayHeader entityTagArrayHeader(String name, Supplier<List<EntityTag>> value) {
		return BasicEntityTagArrayHeader.of(name, value);
	}

	/**
	 * Creates a new {@link BasicEntityTagHeader} header.
	 *
	 * @param name The header name.
	 * @param value
	 * 	The header value.
	 * 	<br>Must be an entity tag value (e.g. <js>"\"xyzzy\""</js>).
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the name is <jk>null</jk> or empty or the value is <jk>null</jk>.
	 */
	public static final BasicEntityTagHeader entityTagHeader(String name, String value) {
		return BasicEntityTagHeader.of(name, value);
	}

	/**
	 * Creates a new {@link BasicEntityTagHeader} header.
	 *
	 * @param name The header name.
	 * @param value
	 * 	The header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the name is <jk>null</jk> or empty or the value is <jk>null</jk>.
	 */
	public static final BasicEntityTagHeader entityTagHeader(String name, EntityTag value) {
		return BasicEntityTagHeader.of(name, value);
	}

	/**
	 * Creates a new {@link BasicEntityTagHeader} header with a delayed value.
	 *
	 * <p>
	 * Header value is re-evaluated on each call to {@link Header#getValue()}.
	 *
	 * @param name The header name.
	 * @param value
	 * 	The supplier of the header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the name is <jk>null</jk> or empty or the value is <jk>null</jk>.
	 */
	public static final BasicEntityTagHeader entityTagHeader(String name, Supplier<EntityTag> value) {
		return BasicEntityTagHeader.of(name, value);
	}

	/**
	 * Creates a new {@link BasicIntegerHeader} header.
	 *
	 * @param name The header name.
	 * @param value
	 * 	The header value.
	 * 	<br>Must be parsable using {@link Integer#parseInt(String)}.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the name is <jk>null</jk> or empty or the value is <jk>null</jk>.
	 */
	public static final BasicIntegerHeader integerHeader(String name, String value) {
		return BasicIntegerHeader.of(name, value);
	}

	/**
	 * Creates a new {@link BasicIntegerHeader} header.
	 *
	 * @param name The header name.
	 * @param value
	 * 	The header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the name is <jk>null</jk> or empty or the value is <jk>null</jk>.
	 */
	public static final BasicIntegerHeader integerHeader(String name, Integer value) {
		return BasicIntegerHeader.of(name, value);
	}

	/**
	 * Creates a new {@link BasicIntegerHeader} header with a delayed value.
	 *
	 * <p>
	 * Header value is re-evaluated on each call to {@link Header#getValue()}.
	 *
	 * @param name The header name.
	 * @param value
	 * 	The supplier of the header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the name is <jk>null</jk> or empty or the value is <jk>null</jk>.
	 */
	public static final BasicIntegerHeader integerHeader(String name, Supplier<Integer> value) {
		return BasicIntegerHeader.of(name, value);
	}

	/**
	 * Creates a new {@link BasicLongHeader} header.
	 *
	 * @param name The header name.
	 * @param value
	 * 	The header value.
	 * 	<br>Must be parsable by {@link Long#parseLong(String)}.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the name is <jk>null</jk> or empty or the value is <jk>null</jk>.
	 */
	public static final BasicLongHeader longHeader(String name, String value) {
		return BasicLongHeader.of(name, value);
	}

	/**
	 * Creates a new {@link BasicLongHeader} header.
	 *
	 * @param name The header name.
	 * @param value
	 * 	The header value.
	 * 	<br>Must be parsable by {@link Long#parseLong(String)}.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the name is <jk>null</jk> or empty or the value is <jk>null</jk>.
	 */
	public static final BasicLongHeader longHeader(String name, Long value) {
		return BasicLongHeader.of(name, value);
	}

	/**
	 * Creates a new {@link BasicLongHeader} header with a delayed value.
	 *
	 * <p>
	 * Header value is re-evaluated on each call to {@link Header#getValue()}.
	 *
	 * @param name The header name.
	 * @param value
	 * 	The supplier of the header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the name is <jk>null</jk> or empty or the value is <jk>null</jk>.
	 */
	public static final BasicLongHeader longHeader(String name, Supplier<Long> value) {
		return BasicLongHeader.of(name, value);
	}

	/**
	 * Creates a new {@link BasicMediaRangeArrayHeader} header.
	 *
	 * @param name The header name.
	 * @param value
	 * 	The header value.
	 * 	<br>Must be parsable by {@link MediaRanges#of(String)}.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the name is <jk>null</jk> or empty or the value is <jk>null</jk>.
	 */
	public static final BasicMediaRangeArrayHeader mediaRangeArrayHeader(String name, String value) {
		return BasicMediaRangeArrayHeader.of(name, value);
	}

	/**
	 * Creates a new {@link BasicMediaRangeArrayHeader} header.
	 *
	 * @param name The header name.
	 * @param value
	 * 	The header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the name is <jk>null</jk> or empty or the value is <jk>null</jk>.
	 */
	public static final BasicMediaRangeArrayHeader mediaRangeArrayHeader(String name, MediaRanges value) {
		return BasicMediaRangeArrayHeader.of(name, value);
	}

	/**
	 * Creates a new {@link BasicMediaRangeArrayHeader} header with a delayed value.
	 *
	 * <p>
	 * Header value is re-evaluated on each call to {@link Header#getValue()}.
	 *
	 * @param name The header name.
	 * @param value
	 * 	The header value.
	 * 	<br>Must be parsable by {@link MediaRanges#of(String)}.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the name is <jk>null</jk> or empty or the value is <jk>null</jk>.
	 */
	public static final BasicMediaRangeArrayHeader mediaRangeArrayHeader(String name, Supplier<MediaRanges> value) {
		if (isEmpty(name) || value == null)
			return null;
		return new BasicMediaRangeArrayHeader(name, value);
	}

	/**
	 * Creates a new {@link BasicMediaTypeHeader} header.
	 *
	 * @param name The header name.
	 * @param value
	 * 	The header value.
	 * 	<br>Must be parsable by {@link MediaType#of(String)}.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the name is <jk>null</jk> or empty or the value is <jk>null</jk>.
	 */
	public static final BasicMediaTypeHeader mediaTypeHeader(String name, String value) {
		return BasicMediaTypeHeader.of(name, value);
	}

	/**
	 * Creates a new {@link BasicMediaTypeHeader} header.
	 *
	 * @param name The header name.
	 * @param value
	 * 	The header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the name is <jk>null</jk> or empty or the value is <jk>null</jk>.
	 */
	public static final BasicMediaTypeHeader mediaTypeHeader(String name, MediaType value) {
		return BasicMediaTypeHeader.of(name, value);
	}

	/**
	 * Creates a new {@link BasicMediaTypeHeader} header with a delayed value.
	 *
	 * <p>
	 * Header value is re-evaluated on each call to {@link Header#getValue()}.
	 *
	 * @param name The header name.
	 * @param value
	 * 	The header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the name is <jk>null</jk> or empty or the value is <jk>null</jk>.
	 */
	public static final BasicMediaTypeHeader mediaTypeHeader(String name, Supplier<MediaType> value) {
		if (isEmpty(name) || value == null)
			return null;
		return new BasicMediaTypeHeader(name, value);
	}

	/**
	 * Creates a {@link BasicHeader} from a name/value pair string (e.g. <js>"Foo: bar"</js>)
	 *
	 * @param pair The pair string.
	 * @return A new header bean, or <jk>null</jk> if the value was <jk>null</jk>.
	 */
	public static final BasicStringHeader stringHeader(String pair) {
		return BasicStringHeader.ofPair(pair);
	}

	/**
	 * Creates a new {@link BasicHeader} header.
	 *
	 * @param name The parameter name.
	 * @param value
	 * 	The parameter value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the name is <jk>null</jk> or empty or the value is <jk>null</jk>.
	 */
	public static final BasicHeader basicHeader(String name, Object value) {
		return BasicHeader.of(name, value);
	}

	/**
	 * Creates a new {@link BasicHeader} header with a delayed value.
	 *
	 * <p>
	 * Header value is re-evaluated on each call to {@link Header#getValue()}.
	 *
	 * @param name The header name.
	 * @param value
	 * 	The supplier of the header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the name is <jk>null</jk> or empty or the value is <jk>null</jk>.
	 * */
	public static final BasicHeader basicHeader(String name, Supplier<?> value) {
		return new BasicHeader(name, value);
	}

	/**
	 * Creates a new {@link SerializedHeader} header.
	 *
	 * @param name The header name.
	 * @param value
	 * 	The POJO to serialize as the header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the name is <jk>null</jk> or empty.
	 */
	public static final SerializedHeader serializedHeader(String name, Object value) {
		return SerializedHeader.of(name, value);
	}

	/**
	 * Creates a new {@link SerializedHeader} header.
	 *
	 * @param name The HTTP header name name.
	 * @param value
	 * 	The POJO to serialize as the header value.
	 * @param serializer
	 * 	The serializer to use for serializing the value to a string value.
	 * @param schema
	 * 	The schema object that defines the format of the output.
	 * 	<br>If <jk>null</jk>, defaults to the schema defined on the serializer.
	 * 	<br>If that's also <jk>null</jk>, defaults to {@link HttpPartSchema#DEFAULT}.
	 * 	<br>Only used if serializer is schema-aware (e.g. {@link OpenApiSerializer}).
	 * 	<br>Can also be a {@link Supplier}.
	 * @param skipIfEmpty If value is a blank string, the value should return as <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the name is <jk>null</jk> or empty.
	 */
	public static SerializedHeader serializedHeader(String name, Object value, HttpPartSerializerSession serializer, HttpPartSchema schema, boolean skipIfEmpty) {
		return SerializedHeader.of(name, value, serializer, schema, skipIfEmpty);
	}

	/**
	 * Creates a new {@link SerializedHeader} header.
	 *
	 * <p>
	 * Header value is re-evaluated on each call to {@link Header#getValue()}.
	 *
	 * @param name The HTTP header name name.
	 * @param value
	 * 	The supplier of the POJO to serialize as the header value.
	 * @param serializer
	 * 	The serializer to use for serializing the value to a string value.
	 * @param schema
	 * 	The schema object that defines the format of the output.
	 * 	<br>If <jk>null</jk>, defaults to the schema defined on the serializer.
	 * 	<br>If that's also <jk>null</jk>, defaults to {@link HttpPartSchema#DEFAULT}.
	 * 	<br>Only used if serializer is schema-aware (e.g. {@link OpenApiSerializer}).
	 * 	<br>Can also be a {@link Supplier}.
	 * @param skipIfEmpty If value is a blank string, the value should return as <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the name is <jk>null</jk> or empty.
	 */
	public static SerializedHeader serializedHeader(String name, Supplier<?> value, HttpPartSerializerSession serializer, HttpPartSchema schema, boolean skipIfEmpty) {
		return SerializedHeader.of(name, value, serializer, schema, skipIfEmpty);
	}

	/**
	 * Creates a new {@link SerializedHeader} header with a delayed value.
	 *
	 * <p>
	 * Header value is re-evaluated on each call to {@link Header#getValue()}.
	 *
	 * @param name The header name.
	 * @param value
	 * 	The supplier of the POJO to serialize as the header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the name is <jk>null</jk> or empty.
	 */
	public static final SerializedHeader serializedHeader(String name, Supplier<?> value) {
		return SerializedHeader.of(name, value);
	}

	/**
	 * Creates a new {@link BasicStringHeader} header.
	 *
	 * @param name The header name.
	 * @param value
	 * 	The header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the name is <jk>null</jk> or empty or the value is <jk>null</jk>.
	 */
	public static final BasicStringHeader stringHeader(String name, String value) {
		return BasicStringHeader.of(name, value);
	}

	/**
	 * Creates a new {@link BasicStringHeader} header with a delayed value.
	 *
	 * <p>
	 * Header value is re-evaluated on each call to {@link Header#getValue()}.
	 *
	 * @param name The header name.
	 * @param value
	 * 	The supplier of the header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the name is <jk>null</jk> or empty or the value is <jk>null</jk>.
	 */
	public static final BasicStringHeader stringHeader(String name, Supplier<String> value) {
		return BasicStringHeader.of(name, value);
	}

	/**
	 * Creates a new {@link BasicStringRangeArrayHeader} header.
	 *
	 * @param name The header name.
	 * @param value
	 * 	The header value.
	 * 	<br>Must be parsable by {@link StringRanges#of(String)}.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the name is <jk>null</jk> or empty or the value is <jk>null</jk>.
	 */
	public static final BasicStringRangeArrayHeader stringRangeArrayHeader(String name, String value) {
		return BasicStringRangeArrayHeader.of(name, value);
	}

	/**
	 * Creates a new {@link BasicStringRangeArrayHeader} header.
	 *
	 * @param name The header name.
	 * @param value
	 * 	The header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the name is <jk>null</jk> or empty or the value is <jk>null</jk>.
	 */
	public static final BasicStringRangeArrayHeader stringRangeArrayHeader(String name, StringRanges value) {
		return BasicStringRangeArrayHeader.of(name, value);
	}

	/**
	 * Creates a new {@link BasicStringRangeArrayHeader} header with a delayed value.
	 *
	 * <p>
	 * Header value is re-evaluated on each call to {@link Header#getValue()}.
	 *
	 * @param name The header name.
	 * @param value
	 * 	The supplier of the header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the name is <jk>null</jk> or empty or the value is <jk>null</jk>.
	 */
	public static final BasicStringRangeArrayHeader stringRangeArrayHeader(String name, Supplier<StringRanges> value) {
		return BasicStringRangeArrayHeader.of(name, value);
	}

	/**
	 * Creates a new {@link BasicUriHeader} header.
	 *
	 * @param name The header name.
	 * @param value
	 * 	The header value.
	 * 	<br>Must be parsable by {@link URI#create(String)}.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the name is <jk>null</jk> or empty or the value is <jk>null</jk>.
	 */
	public static final BasicUriHeader uriHeader(String name, String value) {
		return BasicUriHeader.of(name, value);
	}

	/**
	 * Creates a new {@link BasicUriHeader} header.
	 *
	 * @param name The header name.
	 * @param value
	 * 	The header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the name is <jk>null</jk> or empty or the value is <jk>null</jk>.
	 */
	public static final BasicUriHeader uriHeader(String name, URI value) {
		return BasicUriHeader.of(name, value);
	}

	/**
	 * Creates a new {@link BasicUriHeader} header with a delayed value.
	 *
	 * <p>
	 * Header value is re-evaluated on each call to {@link Header#getValue()}.
	 *
	 * @param name The header name.
	 * @param value
	 * 	The supplier of the header value.
	 * 	<br>Can be <jk>null</jk>.
	 * @return A new header bean, or <jk>null</jk> if the name is <jk>null</jk> or empty or the value is <jk>null</jk>.
	 */
	public static final BasicUriHeader uriHeader(String name, Supplier<URI> value) {
		return BasicUriHeader.of(name, value);
	}

	/**
	 * Creates a new {@link Header} of the specified type.
	 *
	 * <p>
	 * The implementation class must have a public constructor taking in one of the following argument lists:
	 * <ul>
	 * 	<li><c><jk>public</jk> X(String <jv>headerValue</jv>)</c>
	 * 	<li><c><jk>public</jk> X(Object <jv>headerValue</jv>)</c>
	 * 	<li><c><jk>public</jk> X(String <jv>headerName</jv>, String <jv>headerValue</jv>)</c>
	 * 	<li><c><jk>public</jk> X(String <jv>headerName</jv>, Object <jv>headerValue</jv>)</c>
	 * </ul>
	 *
	 * @param type The header implementation class.
	 * @param name The header name.
	 * @param value The header value.
	 * @return A new unmodifiable instance, never <jk>null</jk>.
	 */
	public static final <T extends Header> T header(Class<T> type, String name, Object value) {
		return HeaderBeanMeta.of(type).construct(name, value);
	}

	/**
	 * Creates a new {@link Header} of the specified type.
	 *
	 * <p>
	 * Same as {@link #header(Class, String, Object)} but the header name is pulled from the {@link org.apache.juneau.http.annotation.Header#name() @Header(name)} or
	 * 	{@link org.apache.juneau.http.annotation.Header#value() @Header(value)} annotations.
	 *
	 * @param type The header implementation class.
	 * @param value The header value.
	 * @return A new unmodifiable instance, never <jk>null</jk>.
	 */
	public static final <T extends Header> T header(Class<T> type, Object value) {
		return HeaderBeanMeta.of(type).construct(null, value);
	}

	/**
	 * Instantiates a new {@link HeaderListBuilder}.
	 *
	 * @return A new empty builder.
	 */
	public static final HeaderListBuilder headerList() {
		return HeaderList.create();
	}

	/**
	 * Creates a new {@link HeaderList} initialized with the specified headers.
	 *
	 * @param headers The headers to add to the list.  Can be <jk>null</jk>.  <jk>null</jk> entries are ignored.
	 * @return A new unmodifiable instance, never <jk>null</jk>.
	 */
	public static final HeaderList headerList(List<Header> headers) {
		return HeaderList.of(headers);
	}

	/**
	 * Creates a new {@link HeaderList} initialized with the specified headers.
	 *
	 * @param headers The headers to add to the list.  <jk>null</jk> entries are ignored.
	 * @return A new unmodifiable instance, never <jk>null</jk>.
	 */
	public static final HeaderList headerList(Header...headers) {
		return HeaderList.of(headers);
	}

	/**
	 * Creates a new {@link HeaderList} initialized with the specified name/value pairs.
	 *
	 * @param pairs
	 * 	Initial list of pairs.
	 * 	<br>Must be an even number of parameters representing key/value pairs.
	 * @throws RuntimeException If odd number of parameters were specified.
	 * @return A new instance.
	 */
	public static HeaderList headerList(String...pairs) {
		return HeaderList.ofPairs(pairs);
	}

	//-----------------------------------------------------------------------------------------------------------------
	// Utility methods.
	//-----------------------------------------------------------------------------------------------------------------

	/**
	 * Returns <jk>true</jk> if the {@link #cast(Object)} method can be used on the specified object.
	 *
	 * @param o The object to check.
	 * @return <jk>true</jk> if the {@link #cast(Object)} method can be used on the specified object.
	 */
	public static boolean canCast(Object o) {
		ClassInfo ci = ClassInfo.of(o);
		return ci != null && ci.isChildOfAny(Header.class, Headerable.class, NameValuePair.class, NameValuePairable.class, Map.Entry.class);
	}

	/**
	 * Utility method for converting an arbitrary object to a {@link Header}.
	 *
	 * @param o
	 * 	The object to cast or convert to a {@link Header}.
	 * @return Either the same object cast as a {@link Header} or converted to a {@link Header}.
	 */
	@SuppressWarnings("rawtypes")
	public static Header cast(Object o) {
		if (o instanceof Header)
			return (Header)o;
		if (o instanceof Headerable)
			return ((Headerable)o).asHeader();
		if (o instanceof NameValuePair)
			return BasicHeader.of((NameValuePair)o);
		if (o instanceof NameValuePairable)
			return BasicHeader.of(((NameValuePairable)o).asNameValuePair());
		if (o instanceof Map.Entry) {
			Map.Entry e = (Map.Entry)o;
			return BasicHeader.of(stringify(e.getKey()), stringify(e.getValue()));
		}
		throw runtimeException("Object of type {0} could not be converted to a Header.", className(o));
	}
}
