001/* 002 * Licensed to the Apache Software Foundation (ASF) under one or more 003 * contributor license agreements. See the NOTICE file distributed with 004 * this work for additional information regarding copyright ownership. 005 * The ASF licenses this file to You under the Apache License, Version 2.0 006 * (the "License"); you may not use this file except in compliance with 007 * the License. You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the License for the specific language governing permissions and 015 * limitations under the License. 016 */ 017package org.apache.juneau.rest.server.httppart; 018 019import static org.apache.juneau.commons.httppart.HttpPartType.*; 020 021import java.lang.reflect.*; 022import java.util.regex.*; 023 024import org.apache.juneau.http.*; 025import org.apache.juneau.http.header.*; 026import org.apache.juneau.marshall.*; 027import org.apache.juneau.marshall.httppart.*; 028import org.apache.juneau.rest.server.*; 029 030/** 031 * Represents a single header on an HTTP request. 032 * 033 * <p> 034 * Typically accessed through the {@link RequestHeaderList} class. 035 * 036 * <p> 037 * Some important methods on this class are: 038 * </p> 039 * <ul class='javatree'> 040 * <li class='jc'>{@link RequestHeader} 041 * <ul class='spaced-list'> 042 * <li>Methods for retrieving simple string values: 043 * <ul class='javatreec'> 044 * <li class='jm'>{@link RequestHeader#asString() asString()} 045 * <li class='jm'>{@link RequestHeader#get() get()} 046 * <li class='jm'>{@link RequestHeader#isPresent() isPresent()} 047 * <li class='jm'>{@link RequestHeader#orElse(String) orElse(String)} 048 * </ul> 049 * <li>Methods for retrieving as other common types: 050 * <ul class='javatreec'> 051 * <li class='jm'>{@link RequestHeader#asBoolean() asBoolean()} 052 * <li class='jm'>{@link RequestHeader#asBooleanHeader() asBooleanHeader()} 053 * <li class='jm'>{@link RequestHeader#asCsvArray() asCsvArray()} 054 * <li class='jm'>{@link RequestHeader#asCsvHeader() asCsvHeader()} 055 * <li class='jm'>{@link RequestHeader#asDate() asDate()} 056 * <li class='jm'>{@link RequestHeader#asDateHeader() asDateHeader()} 057 * <li class='jm'>{@link RequestHeader#asEntityTagsHeader() asEntityTagsHeader()} 058 * <li class='jm'>{@link RequestHeader#asEntityTagHeader() asEntityTagHeader()} 059 * <li class='jm'>{@link RequestHeader#asInteger() asInteger()} 060 * <li class='jm'>{@link RequestHeader#asIntegerHeader() asIntegerHeader()} 061 * <li class='jm'>{@link RequestHeader#asLong() asLong()} 062 * <li class='jm'>{@link RequestHeader#asLongHeader() asLongHeader()} 063 * <li class='jm'>{@link RequestHeader#asMatcher(Pattern) asMatcher(Pattern)} 064 * <li class='jm'>{@link RequestHeader#asMatcher(String) asMatcher(String)} 065 * <li class='jm'>{@link RequestHeader#asMatcher(String,int) asMatcher(String,int)} 066 * <li class='jm'>{@link RequestHeader#asStringHeader() asStringHeader()} 067 * <li class='jm'>{@link RequestHeader#asStringRangesHeader() asStringRangesHeader()} 068 * <li class='jm'>{@link RequestHeader#asUriHeader() asUriHeader()} 069 * </ul> 070 * <li>Methods for retrieving as custom types: 071 * <ul class='javatreec'> 072 * <li class='jm'>{@link RequestHeader#as(Class) as(Class)} 073 * <li class='jm'>{@link RequestHeader#as(ClassMeta) as(ClassMeta)} 074 * <li class='jm'>{@link RequestHeader#as(Type,Type...) as(Type,Type...)} 075 * <li class='jm'>{@link RequestHeader#parser(HttpPartParserSession) parser(HttpPartParserSession)} 076 * <li class='jm'>{@link RequestHeader#schema(HttpPartSchema) schema(HttpPartSchema)} 077 * </ul> 078 * <li>Methods for performing assertion checks: 079 * <ul class='javatreec'> 080 * <li class='jm'>{@link RequestHeader#assertCsvArray() assertCsvArray()} 081 * <li class='jm'>{@link RequestHeader#assertDate() assertDate()} 082 * <li class='jm'>{@link RequestHeader#assertInteger() assertInteger()} 083 * <li class='jm'>{@link RequestHeader#assertLong() assertLong()} 084 * <li class='jm'>{@link RequestHeader#assertString() assertString()} 085 * </ul> 086 * <li>Other methods: 087 * <ul class='javatreec'> 088 * <li class='jm'>{@link RequestHeader#getName() getName()} 089 * <li class='jm'>{@link RequestHeader#getValue() getValue()} 090* </ul> 091 * </ul> 092 * 093 * <h5 class='section'>See Also:</h5><ul> 094 * <li class='link'><a class="doclink" href="https://juneau.apache.org/docs/topics/RestServerHttpParts">HTTP parts in REST servers</a> 095 * </ul> 096 */ 097public class RequestHeader extends RequestHttpPart implements HttpHeader { 098 099 /** 100 * Constructor. 101 * 102 * @param request The request object. 103 * @param name The header name. 104 * @param value The header value. 105 */ 106 public RequestHeader(RestRequest request, String name, String value) { 107 super(HEADER, request, name, value); 108 } 109 110 /** 111 * Returns the value of this header as an {@link HttpBooleanHeader}. 112 * 113 * @return The value of this header as an {@link HttpBooleanHeader}, never <jk>null</jk>. 114 */ 115 public HttpBooleanHeader asBooleanHeader() { 116 return HttpBooleanHeader.of(getName(), getValue()); 117 } 118 119 /** 120 * Returns the value of this header as an {@link HttpCsvHeader}. 121 * 122 * @return The value of this header as an {@link HttpCsvHeader}, never <jk>null</jk>. 123 */ 124 public HttpCsvHeader asCsvHeader() { 125 return HttpCsvHeader.of(getName(), getValue()); 126 } 127 128 /** 129 * Returns the value of this header as an {@link HttpDateHeader}. 130 * 131 * @return The value of this header as an {@link HttpDateHeader}, never <jk>null</jk>. 132 */ 133 public HttpDateHeader asDateHeader() { 134 return HttpDateHeader.of(getName(), getValue()); 135 } 136 137 /** 138 * Returns the value of this header as an {@link HttpEntityTagHeader}. 139 * 140 * @return The value of this header as an {@link HttpEntityTagHeader}, never <jk>null</jk>. 141 */ 142 public HttpEntityTagHeader asEntityTagHeader() { 143 return HttpEntityTagHeader.of(getName(), getValue()); 144 } 145 146 /** 147 * Returns the value of this header as an {@link HttpEntityTagsHeader}. 148 * 149 * @return The value of this header as an {@link HttpEntityTagsHeader}, never <jk>null</jk>. 150 */ 151 public HttpEntityTagsHeader asEntityTagsHeader() { 152 return HttpEntityTagsHeader.of(getName(), getValue()); 153 } 154 155 /** 156 * Returns the value of this header as an {@link HttpIntegerHeader}. 157 * 158 * @return The value of this header as an {@link HttpIntegerHeader}, never <jk>null</jk>. 159 */ 160 public HttpIntegerHeader asIntegerHeader() { 161 return HttpIntegerHeader.of(getName(), getValue()); 162 } 163 164 /** 165 * Returns the value of this header as an {@link HttpLongHeader}. 166 * 167 * @return The value of this header as an {@link HttpLongHeader}, never <jk>null</jk>. 168 */ 169 public HttpLongHeader asLongHeader() { 170 return HttpLongHeader.of(getName(), getValue()); 171 } 172 173 /** 174 * Returns the value of this header as an {@link HttpStringHeader}. 175 * 176 * @return The value of this header as an {@link HttpStringHeader}, never <jk>null</jk>. 177 */ 178 public HttpStringHeader asStringHeader() { 179 return HttpStringHeader.of(getName(), getValue()); 180 } 181 182 /** 183 * Returns the value of this header as an {@link HttpStringRangesHeader}. 184 * 185 * @return The value of this header as an {@link HttpStringRangesHeader}, never <jk>null</jk>. 186 */ 187 public HttpStringRangesHeader asStringRangesHeader() { 188 return HttpStringRangesHeader.of(getName(), getValue()); 189 } 190 191 /** 192 * Returns the value of this header as an {@link HttpUriHeader}. 193 * 194 * @return The value of this header as an {@link HttpUriHeader}, never <jk>null</jk>. 195 */ 196 public HttpUriHeader asUriHeader() { 197 return HttpUriHeader.of(getName(), getValue()); 198 } 199 200 @Override /* Overridden from RequestHttpPart */ 201 public RequestHeader def(String def) { 202 super.def(def); 203 return this; 204 } 205 206 @Override /* Overridden from RequestHttpPart */ 207 public RequestHeader parser(HttpPartParserSession value) { 208 super.parser(value); 209 return this; 210 } 211 212 @Override /* Overridden from RequestHttpPart */ 213 public RequestHeader schema(HttpPartSchema value) { 214 super.schema(value); 215 return this; 216 } 217 218 @Override /* Overridden from Object */ 219 public String toString() { 220 return getName() + ": " + getValue(); 221 } 222}