1 /*
2 * Copyright 2014 The Netty Project
3 *
4 * The Netty Project licenses this file to you under the Apache License, version 2.0 (the
5 * "License"); you may not use this file except in compliance with the License. You may obtain a
6 * copy of the License at:
7 *
8 * https://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software distributed under the License
11 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
12 * or implied. See the License for the specific language governing permissions and limitations under
13 * the License.
14 */
15 package io.netty5.handler.codec;
16
17 import java.util.Iterator;
18 import java.util.List;
19 import java.util.Map.Entry;
20 import java.util.Set;
21
22 /**
23 * Common interface for {@link Headers} which represents a mapping of key to value.
24 * Duplicate keys may be allowed by implementations.
25 *
26 * @param <K> the type of the header name.
27 * @param <V> the type of the header value.
28 * @param <T> the type to use for return values when the intention is to return {@code this} object.
29 */
30 public interface Headers<K, V, T extends Headers<K, V, T>> extends Iterable<Entry<K, V>> {
31 /**
32 * Returns the value of a header with the specified name. If there is more than one value for the specified name,
33 * the first value in insertion order is returned.
34 *
35 * @param name the name of the header to retrieve
36 * @return the first header value if the header is found. {@code null} if there's no such header
37 */
38 V get(K name);
39
40 /**
41 * Returns the value of a header with the specified name. If there is more than one value for the specified name,
42 * the first value in insertion order is returned.
43 *
44 * @param name the name of the header to retrieve
45 * @param defaultValue the default value
46 * @return the first header value or {@code defaultValue} if there is no such header
47 */
48 V get(K name, V defaultValue);
49
50 /**
51 * Returns the value of a header with the specified name and removes it from this object. If there is more than
52 * one value for the specified name, the first value in insertion order is returned.
53 *
54 * @param name the name of the header to retrieve
55 * @return the first header value or {@code null} if there is no such header
56 */
57 V getAndRemove(K name);
58
59 /**
60 * Returns the value of a header with the specified name and removes it from this object. If there is more than
61 * one value for the specified name, the first value in insertion order is returned.
62 *
63 * @param name the name of the header to retrieve
64 * @param defaultValue the default value
65 * @return the first header value or {@code defaultValue} if there is no such header
66 */
67 V getAndRemove(K name, V defaultValue);
68
69 /**
70 * Returns all values for the header with the specified name. The returned {@link List} can't be modified.
71 *
72 * @param name the name of the header to retrieve
73 * @return a {@link List} of header values or an empty {@link List} if no values are found.
74 */
75 List<V> getAll(K name);
76
77 /**
78 * Returns all values for the header with the specified name and removes them from this object.
79 * The returned {@link List} can't be modified.
80 *
81 * @param name the name of the header to retrieve
82 * @return a {@link List} of header values or an empty {@link List} if no values are found.
83 */
84 List<V> getAllAndRemove(K name);
85
86 /**
87 * Returns the {@code boolean} value of a header with the specified name. If there is more than one value for the
88 * specified name, the first value in insertion order is returned.
89 *
90 * @param name the name of the header to retrieve
91 * @return the {@code boolean} value of the first value in insertion order or {@code null} if there is no such
92 * value or it can't be converted to {@code boolean}.
93 */
94 Boolean getBoolean(K name);
95
96 /**
97 * Returns the {@code boolean} value of a header with the specified name. If there is more than one value for the
98 * specified name, the first value in insertion order is returned.
99 *
100 * @param name the name of the header to retrieve
101 * @param defaultValue the default value
102 * @return the {@code boolean} value of the first value in insertion order or {@code defaultValue} if there is no
103 * such value or it can't be converted to {@code boolean}.
104 */
105 boolean getBoolean(K name, boolean defaultValue);
106
107 /**
108 * Returns the {@code byte} value of a header with the specified name. If there is more than one value for the
109 * specified name, the first value in insertion order is returned.
110 *
111 * @param name the name of the header to retrieve
112 * @return the {@code byte} value of the first value in insertion order or {@code null} if there is no such
113 * value or it can't be converted to {@code byte}.
114 */
115 Byte getByte(K name);
116
117 /**
118 * Returns the {@code byte} value of a header with the specified name. If there is more than one value for the
119 * specified name, the first value in insertion order is returned.
120 *
121 * @param name the name of the header to retrieve
122 * @param defaultValue the default value
123 * @return the {@code byte} value of the first value in insertion order or {@code defaultValue} if there is no
124 * such value or it can't be converted to {@code byte}.
125 */
126 byte getByte(K name, byte defaultValue);
127
128 /**
129 * Returns the {@code char} value of a header with the specified name. If there is more than one value for the
130 * specified name, the first value in insertion order is returned.
131 *
132 * @param name the name of the header to retrieve
133 * @return the {@code char} value of the first value in insertion order or {@code null} if there is no such
134 * value or it can't be converted to {@code char}.
135 */
136 Character getChar(K name);
137
138 /**
139 * Returns the {@code char} value of a header with the specified name. If there is more than one value for the
140 * specified name, the first value in insertion order is returned.
141 *
142 * @param name the name of the header to retrieve
143 * @param defaultValue the default value
144 * @return the {@code char} value of the first value in insertion order or {@code defaultValue} if there is no
145 * such value or it can't be converted to {@code char}.
146 */
147 char getChar(K name, char defaultValue);
148
149 /**
150 * Returns the {@code short} value of a header with the specified name. If there is more than one value for the
151 * specified name, the first value in insertion order is returned.
152 *
153 * @param name the name of the header to retrieve
154 * @return the {@code short} value of the first value in insertion order or {@code null} if there is no such
155 * value or it can't be converted to {@code short}.
156 */
157 Short getShort(K name);
158
159 /**
160 * Returns the {@code short} value of a header with the specified name. If there is more than one value for the
161 * specified name, the first value in insertion order is returned.
162 *
163 * @param name the name of the header to retrieve
164 * @param defaultValue the default value
165 * @return the {@code short} value of the first value in insertion order or {@code defaultValue} if there is no
166 * such value or it can't be converted to {@code short}.
167 */
168 short getShort(K name, short defaultValue);
169
170 /**
171 * Returns the {@code int} value of a header with the specified name. If there is more than one value for the
172 * specified name, the first value in insertion order is returned.
173 *
174 * @param name the name of the header to retrieve
175 * @return the {@code int} value of the first value in insertion order or {@code null} if there is no such
176 * value or it can't be converted to {@code int}.
177 */
178 Integer getInt(K name);
179
180 /**
181 * Returns the {@code int} value of a header with the specified name. If there is more than one value for the
182 * specified name, the first value in insertion order is returned.
183 *
184 * @param name the name of the header to retrieve
185 * @param defaultValue the default value
186 * @return the {@code int} value of the first value in insertion order or {@code defaultValue} if there is no
187 * such value or it can't be converted to {@code int}.
188 */
189 int getInt(K name, int defaultValue);
190
191 /**
192 * Returns the {@code long} value of a header with the specified name. If there is more than one value for the
193 * specified name, the first value in insertion order is returned.
194 *
195 * @param name the name of the header to retrieve
196 * @return the {@code long} value of the first value in insertion order or {@code null} if there is no such
197 * value or it can't be converted to {@code long}.
198 */
199 Long getLong(K name);
200
201 /**
202 * Returns the {@code long} value of a header with the specified name. If there is more than one value for the
203 * specified name, the first value in insertion order is returned.
204 *
205 * @param name the name of the header to retrieve
206 * @param defaultValue the default value
207 * @return the {@code long} value of the first value in insertion order or {@code defaultValue} if there is no
208 * such value or it can't be converted to {@code long}.
209 */
210 long getLong(K name, long defaultValue);
211
212 /**
213 * Returns the {@code float} value of a header with the specified name. If there is more than one value for the
214 * specified name, the first value in insertion order is returned.
215 *
216 * @param name the name of the header to retrieve
217 * @return the {@code float} value of the first value in insertion order or {@code null} if there is no such
218 * value or it can't be converted to {@code float}.
219 */
220 Float getFloat(K name);
221
222 /**
223 * Returns the {@code float} value of a header with the specified name. If there is more than one value for the
224 * specified name, the first value in insertion order is returned.
225 *
226 * @param name the name of the header to retrieve
227 * @param defaultValue the default value
228 * @return the {@code float} value of the first value in insertion order or {@code defaultValue} if there is no
229 * such value or it can't be converted to {@code float}.
230 */
231 float getFloat(K name, float defaultValue);
232
233 /**
234 * Returns the {@code double} value of a header with the specified name. If there is more than one value for the
235 * specified name, the first value in insertion order is returned.
236 *
237 * @param name the name of the header to retrieve
238 * @return the {@code double} value of the first value in insertion order or {@code null} if there is no such
239 * value or it can't be converted to {@code double}.
240 */
241 Double getDouble(K name);
242
243 /**
244 * Returns the {@code double} value of a header with the specified name. If there is more than one value for the
245 * specified name, the first value in insertion order is returned.
246 *
247 * @param name the name of the header to retrieve
248 * @param defaultValue the default value
249 * @return the {@code double} value of the first value in insertion order or {@code defaultValue} if there is no
250 * such value or it can't be converted to {@code double}.
251 */
252 double getDouble(K name, double defaultValue);
253
254 /**
255 * Returns the value of a header with the specified name in milliseconds. If there is more than one value for the
256 * specified name, the first value in insertion order is returned.
257 *
258 * @param name the name of the header to retrieve
259 * @return the milliseconds value of the first value in insertion order or {@code null} if there is no such
260 * value or it can't be converted to milliseconds.
261 */
262 Long getTimeMillis(K name);
263
264 /**
265 * Returns the value of a header with the specified name in milliseconds. If there is more than one value for the
266 * specified name, the first value in insertion order is returned.
267 *
268 * @param name the name of the header to retrieve
269 * @param defaultValue the default value
270 * @return the milliseconds value of the first value in insertion order or {@code defaultValue} if there is no such
271 * value or it can't be converted to milliseconds.
272 */
273 long getTimeMillis(K name, long defaultValue);
274
275 /**
276 * Returns the {@code boolean} value of a header with the specified {@code name} and removes the header from this
277 * object. If there is more than one value for the specified name, the first value in insertion order is returned.
278 * In any case all values for {@code name} are removed.
279 * <p>
280 * If an exception occurs during the translation from type {@code T} all entries with {@code name} may still
281 * be removed.
282 * @param name the name of the header to retrieve
283 * @return the {@code boolean} value of the first value in insertion order or {@code null} if there is no
284 * such value or it can't be converted to {@code boolean}.
285 */
286 Boolean getBooleanAndRemove(K name);
287
288 /**
289 * Returns the {@code boolean} value of a header with the specified {@code name} and removes the header from this
290 * object. If there is more than one value for the specified name, the first value in insertion order is returned.
291 * In any case all values for {@code name} are removed.
292 * <p>
293 * If an exception occurs during the translation from type {@code T} all entries with {@code name} may still
294 * be removed.
295 * @param name the name of the header to search
296 * @param defaultValue the default value
297 * @return the {@code boolean} value of the first value in insertion order or {@code defaultValue} if there is no
298 * such value or it can't be converted to {@code boolean}.
299 */
300 boolean getBooleanAndRemove(K name, boolean defaultValue);
301
302 /**
303 * Returns the {@code byte} value of a header with the specified {@code name} and removes the header from this
304 * object. If there is more than one value for the specified name, the first value in insertion order is returned.
305 * In any case all values for {@code name} are removed.
306 * <p>
307 * If an exception occurs during the translation from type {@code T} all entries with {@code name} may still
308 * be removed.
309 * @param name the name of the header to search
310 * @return the {@code byte} value of the first value in insertion order or {@code null} if there is no
311 * such value or it can't be converted to {@code byte}.
312 */
313 Byte getByteAndRemove(K name);
314
315 /**
316 * Returns the {@code byte} value of a header with the specified {@code name} and removes the header from this
317 * object. If there is more than one value for the specified name, the first value in insertion order is returned.
318 * In any case all values for {@code name} are removed.
319 * <p>
320 * If an exception occurs during the translation from type {@code T} all entries with {@code name} may still
321 * be removed.
322 * @param name the name of the header to search
323 * @param defaultValue the default value
324 * @return the {@code byte} value of the first value in insertion order or {@code defaultValue} if there is no
325 * such value or it can't be converted to {@code byte}.
326 */
327 byte getByteAndRemove(K name, byte defaultValue);
328
329 /**
330 * Returns the {@code char} value of a header with the specified {@code name} and removes the header from this
331 * object. If there is more than one value for the specified name, the first value in insertion order is returned.
332 * In any case all values for {@code name} are removed.
333 * <p>
334 * If an exception occurs during the translation from type {@code T} all entries with {@code name} may still
335 * be removed.
336 * @param name the name of the header to search
337 * @return the {@code char} value of the first value in insertion order or {@code null} if there is no
338 * such value or it can't be converted to {@code char}.
339 */
340 Character getCharAndRemove(K name);
341
342 /**
343 * Returns the {@code char} value of a header with the specified {@code name} and removes the header from this
344 * object. If there is more than one value for the specified name, the first value in insertion order is returned.
345 * In any case all values for {@code name} are removed.
346 * <p>
347 * If an exception occurs during the translation from type {@code T} all entries with {@code name} may still
348 * be removed.
349 * @param name the name of the header to search
350 * @param defaultValue the default value
351 * @return the {@code char} value of the first value in insertion order or {@code defaultValue} if there is no
352 * such value or it can't be converted to {@code char}.
353 */
354 char getCharAndRemove(K name, char defaultValue);
355
356 /**
357 * Returns the {@code short} value of a header with the specified {@code name} and removes the header from this
358 * object. If there is more than one value for the specified name, the first value in insertion order is returned.
359 * In any case all values for {@code name} are removed.
360 * <p>
361 * If an exception occurs during the translation from type {@code T} all entries with {@code name} may still
362 * be removed.
363 * @param name the name of the header to search
364 * @return the {@code short} value of the first value in insertion order or {@code null} if there is no
365 * such value or it can't be converted to {@code short}.
366 */
367 Short getShortAndRemove(K name);
368
369 /**
370 * Returns the {@code short} value of a header with the specified {@code name} and removes the header from this
371 * object. If there is more than one value for the specified name, the first value in insertion order is returned.
372 * In any case all values for {@code name} are removed.
373 * <p>
374 * If an exception occurs during the translation from type {@code T} all entries with {@code name} may still
375 * be removed.
376 * @param name the name of the header to search
377 * @param defaultValue the default value
378 * @return the {@code short} value of the first value in insertion order or {@code defaultValue} if there is no
379 * such value or it can't be converted to {@code short}.
380 */
381 short getShortAndRemove(K name, short defaultValue);
382
383 /**
384 * Returns the {@code int} value of a header with the specified {@code name} and removes the header from this
385 * object. If there is more than one value for the specified name, the first value in insertion order is returned.
386 * In any case all values for {@code name} are removed.
387 * <p>
388 * If an exception occurs during the translation from type {@code T} all entries with {@code name} may still
389 * be removed.
390 * @param name the name of the header to search
391 * @return the {@code int} value of the first value in insertion order or {@code null} if there is no
392 * such value or it can't be converted to {@code int}.
393 */
394 Integer getIntAndRemove(K name);
395
396 /**
397 * Returns the {@code int} value of a header with the specified {@code name} and removes the header from this
398 * object. If there is more than one value for the specified name, the first value in insertion order is returned.
399 * In any case all values for {@code name} are removed.
400 * <p>
401 * If an exception occurs during the translation from type {@code T} all entries with {@code name} may still
402 * be removed.
403 * @param name the name of the header to search
404 * @param defaultValue the default value
405 * @return the {@code int} value of the first value in insertion order or {@code defaultValue} if there is no
406 * such value or it can't be converted to {@code int}.
407 */
408 int getIntAndRemove(K name, int defaultValue);
409
410 /**
411 * Returns the {@code long} value of a header with the specified {@code name} and removes the header from this
412 * object. If there is more than one value for the specified name, the first value in insertion order is returned.
413 * In any case all values for {@code name} are removed.
414 * <p>
415 * If an exception occurs during the translation from type {@code T} all entries with {@code name} may still
416 * be removed.
417 * @param name the name of the header to search
418 * @return the {@code long} value of the first value in insertion order or {@code null} if there is no
419 * such value or it can't be converted to {@code long}.
420 */
421 Long getLongAndRemove(K name);
422
423 /**
424 * Returns the {@code long} value of a header with the specified {@code name} and removes the header from this
425 * object. If there is more than one value for the specified name, the first value in insertion order is returned.
426 * In any case all values for {@code name} are removed.
427 * <p>
428 * If an exception occurs during the translation from type {@code T} all entries with {@code name} may still
429 * be removed.
430 * @param name the name of the header to search
431 * @param defaultValue the default value
432 * @return the {@code long} value of the first value in insertion order or {@code defaultValue} if there is no
433 * such value or it can't be converted to {@code long}.
434 */
435 long getLongAndRemove(K name, long defaultValue);
436
437 /**
438 * Returns the {@code float} value of a header with the specified {@code name} and removes the header from this
439 * object. If there is more than one value for the specified name, the first value in insertion order is returned.
440 * In any case all values for {@code name} are removed.
441 * <p>
442 * If an exception occurs during the translation from type {@code T} all entries with {@code name} may still
443 * be removed.
444 * @param name the name of the header to search
445 * @return the {@code float} value of the first value in insertion order or {@code null} if there is no
446 * such value or it can't be converted to {@code float}.
447 */
448 Float getFloatAndRemove(K name);
449
450 /**
451 * Returns the {@code float} value of a header with the specified {@code name} and removes the header from this
452 * object. If there is more than one value for the specified name, the first value in insertion order is returned.
453 * In any case all values for {@code name} are removed.
454 * <p>
455 * If an exception occurs during the translation from type {@code T} all entries with {@code name} may still
456 * be removed.
457 * @param name the name of the header to search
458 * @param defaultValue the default value
459 * @return the {@code float} value of the first value in insertion order or {@code defaultValue} if there is no
460 * such value or it can't be converted to {@code float}.
461 */
462 float getFloatAndRemove(K name, float defaultValue);
463
464 /**
465 * Returns the {@code double} value of a header with the specified {@code name} and removes the header from this
466 * object. If there is more than one value for the specified name, the first value in insertion order is returned.
467 * In any case all values for {@code name} are removed.
468 * <p>
469 * If an exception occurs during the translation from type {@code T} all entries with {@code name} may still
470 * be removed.
471 * @param name the name of the header to search
472 * @return the {@code double} value of the first value in insertion order or {@code null} if there is no
473 * such value or it can't be converted to {@code double}.
474 */
475 Double getDoubleAndRemove(K name);
476
477 /**
478 * Returns the {@code double} value of a header with the specified {@code name} and removes the header from this
479 * object. If there is more than one value for the specified name, the first value in insertion order is returned.
480 * In any case all values for {@code name} are removed.
481 * <p>
482 * If an exception occurs during the translation from type {@code T} all entries with {@code name} may still
483 * be removed.
484 * @param name the name of the header to search
485 * @param defaultValue the default value
486 * @return the {@code double} value of the first value in insertion order or {@code defaultValue} if there is no
487 * such value or it can't be converted to {@code double}.
488 */
489 double getDoubleAndRemove(K name, double defaultValue);
490
491 /**
492 * Returns the value of a header with the specified {@code name} in milliseconds and removes the header from this
493 * object. If there is more than one value for the specified {@code name}, the first value in insertion order is
494 * returned. In any case all values for {@code name} are removed.
495 * <p>
496 * If an exception occurs during the translation from type {@code T} all entries with {@code name} may still
497 * be removed.
498 * @param name the name of the header to retrieve
499 * @return the milliseconds value of the first value in insertion order or {@code null} if there is no such
500 * value or it can't be converted to milliseconds.
501 */
502 Long getTimeMillisAndRemove(K name);
503
504 /**
505 * Returns the value of a header with the specified {@code name} in milliseconds and removes the header from this
506 * object. If there is more than one value for the specified {@code name}, the first value in insertion order is
507 * returned. In any case all values for {@code name} are removed.
508 * <p>
509 * If an exception occurs during the translation from type {@code T} all entries with {@code name} may still
510 * be removed.
511 * @param name the name of the header to retrieve
512 * @param defaultValue the default value
513 * @return the milliseconds value of the first value in insertion order or {@code defaultValue} if there is no such
514 * value or it can't be converted to milliseconds.
515 */
516 long getTimeMillisAndRemove(K name, long defaultValue);
517
518 /**
519 * Returns {@code true} if a header with the {@code name} exists, {@code false} otherwise.
520 *
521 * @param name the header name
522 */
523 boolean contains(K name);
524
525 /**
526 * Returns {@code true} if a header with the {@code name} and {@code value} exists, {@code false} otherwise.
527 * <p>
528 * The {@link Object#equals(Object)} method is used to test for equality of {@code value}.
529 * </p>
530 * @param name the header name
531 * @param value the header value of the header to find
532 */
533 boolean contains(K name, V value);
534
535 /**
536 * Returns {@code true} if a header with the name and value exists.
537 *
538 * @param name the header name
539 * @param value the header value
540 * @return {@code true} if it contains it {@code false} otherwise
541 */
542 boolean containsObject(K name, Object value);
543
544 /**
545 * Returns {@code true} if a header with the name and value exists.
546 *
547 * @param name the header name
548 * @param value the header value
549 * @return {@code true} if it contains it {@code false} otherwise
550 */
551 boolean containsBoolean(K name, boolean value);
552
553 /**
554 * Returns {@code true} if a header with the name and value exists.
555 *
556 * @param name the header name
557 * @param value the header value
558 * @return {@code true} if it contains it {@code false} otherwise
559 */
560 boolean containsByte(K name, byte value);
561
562 /**
563 * Returns {@code true} if a header with the name and value exists.
564 *
565 * @param name the header name
566 * @param value the header value
567 * @return {@code true} if it contains it {@code false} otherwise
568 */
569 boolean containsChar(K name, char value);
570
571 /**
572 * Returns {@code true} if a header with the name and value exists.
573 *
574 * @param name the header name
575 * @param value the header value
576 * @return {@code true} if it contains it {@code false} otherwise
577 */
578 boolean containsShort(K name, short value);
579
580 /**
581 * Returns {@code true} if a header with the name and value exists.
582 *
583 * @param name the header name
584 * @param value the header value
585 * @return {@code true} if it contains it {@code false} otherwise
586 */
587 boolean containsInt(K name, int value);
588
589 /**
590 * Returns {@code true} if a header with the name and value exists.
591 *
592 * @param name the header name
593 * @param value the header value
594 * @return {@code true} if it contains it {@code false} otherwise
595 */
596 boolean containsLong(K name, long value);
597
598 /**
599 * Returns {@code true} if a header with the name and value exists.
600 *
601 * @param name the header name
602 * @param value the header value
603 * @return {@code true} if it contains it {@code false} otherwise
604 */
605 boolean containsFloat(K name, float value);
606
607 /**
608 * Returns {@code true} if a header with the name and value exists.
609 *
610 * @param name the header name
611 * @param value the header value
612 * @return {@code true} if it contains it {@code false} otherwise
613 */
614 boolean containsDouble(K name, double value);
615
616 /**
617 * Returns {@code true} if a header with the name and value exists.
618 *
619 * @param name the header name
620 * @param value the header value
621 * @return {@code true} if it contains it {@code false} otherwise
622 */
623 boolean containsTimeMillis(K name, long value);
624
625 /**
626 * Returns the number of headers in this object.
627 */
628 int size();
629
630 /**
631 * Returns {@code true} if {@link #size()} equals {@code 0}.
632 */
633 boolean isEmpty();
634
635 /**
636 * Returns a {@link Set} of all header names in this object. The returned {@link Set} cannot be modified.
637 */
638 Set<K> names();
639
640 /**
641 * Adds a new header with the specified {@code name} and {@code value}.
642 *
643 * @param name the name of the header
644 * @param value the value of the header
645 * @return {@code this}
646 */
647 T add(K name, V value);
648
649 /**
650 * Adds new headers with the specified {@code name} and {@code values}. This method is semantically equivalent to
651 *
652 * <pre>
653 * for (T value : values) {
654 * headers.add(name, value);
655 * }
656 * </pre>
657 *
658 * @param name the header name
659 * @param values the values of the header
660 * @return {@code this}
661 */
662 T add(K name, Iterable<? extends V> values);
663
664 /**
665 * Adds new headers with the specified {@code name} and {@code values}. This method is semantically equivalent to
666 *
667 * <pre>
668 * for (T value : values) {
669 * headers.add(name, value);
670 * }
671 * </pre>
672 *
673 * @param name the header name
674 * @param values the values of the header
675 * @return {@code this}
676 */
677 T add(K name, V... values);
678
679 /**
680 * Adds a new header. Before the {@code value} is added, it's converted to type {@code T}.
681 *
682 * @param name the header name
683 * @param value the value of the header
684 * @return {@code this}
685 */
686 T addObject(K name, Object value);
687
688 /**
689 * Adds a new header with the specified name and values. This method is equivalent to
690 *
691 * <pre>
692 * for (Object v : values) {
693 * headers.addObject(name, v);
694 * }
695 * </pre>
696 *
697 * @param name the header name
698 * @param values the value of the header
699 * @return {@code this}
700 */
701 T addObject(K name, Iterable<?> values);
702
703 /**
704 * Adds a new header with the specified name and values. This method is equivalent to
705 *
706 * <pre>
707 * for (Object v : values) {
708 * headers.addObject(name, v);
709 * }
710 * </pre>
711 *
712 * @param name the header name
713 * @param values the value of the header
714 * @return {@code this}
715 */
716 T addObject(K name, Object... values);
717
718 /**
719 * Adds a new header.
720 *
721 * @param name the header name
722 * @param value the value of the header
723 * @return {@code this}
724 */
725 T addBoolean(K name, boolean value);
726
727 /**
728 * Adds a new header.
729 *
730 * @param name the header name
731 * @param value the value of the header
732 * @return {@code this}
733 */
734 T addByte(K name, byte value);
735
736 /**
737 * Adds a new header.
738 *
739 * @param name the header name
740 * @param value the value of the header
741 * @return {@code this}
742 */
743 T addChar(K name, char value);
744
745 /**
746 * Adds a new header.
747 *
748 * @param name the header name
749 * @param value the value of the header
750 * @return {@code this}
751 */
752 T addShort(K name, short value);
753
754 /**
755 * Adds a new header.
756 *
757 * @param name the header name
758 * @param value the value of the header
759 * @return {@code this}
760 */
761 T addInt(K name, int value);
762
763 /**
764 * Adds a new header.
765 *
766 * @param name the header name
767 * @param value the value of the header
768 * @return {@code this}
769 */
770 T addLong(K name, long value);
771
772 /**
773 * Adds a new header.
774 *
775 * @param name the header name
776 * @param value the value of the header
777 * @return {@code this}
778 */
779 T addFloat(K name, float value);
780
781 /**
782 * Adds a new header.
783 *
784 * @param name the header name
785 * @param value the value of the header
786 * @return {@code this}
787 */
788 T addDouble(K name, double value);
789
790 /**
791 * Adds a new header.
792 *
793 * @param name the header name
794 * @param value the value of the header
795 * @return {@code this}
796 */
797 T addTimeMillis(K name, long value);
798
799 /**
800 * Adds all header names and values of {@code headers} to this object.
801 *
802 * @throws IllegalArgumentException if {@code headers == this}.
803 * @return {@code this}
804 */
805 T add(Headers<? extends K, ? extends V, ?> headers);
806
807 /**
808 * Sets a header with the specified name and value. Any existing headers with the same name are overwritten.
809 *
810 * @param name the header name
811 * @param value the value of the header
812 * @return {@code this}
813 */
814 T set(K name, V value);
815
816 /**
817 * Sets a new header with the specified name and values. This method is equivalent to
818 *
819 * <pre>
820 * for (T v : values) {
821 * headers.addObject(name, v);
822 * }
823 * </pre>
824 *
825 * @param name the header name
826 * @param values the value of the header
827 * @return {@code this}
828 */
829 T set(K name, Iterable<? extends V> values);
830
831 /**
832 * Sets a header with the specified name and values. Any existing headers with this name are removed. This method
833 * is equivalent to:
834 *
835 * <pre>
836 * headers.remove(name);
837 * for (T v : values) {
838 * headers.add(name, v);
839 * }
840 * </pre>
841 *
842 * @param name the header name
843 * @param values the value of the header
844 * @return {@code this}
845 */
846 T set(K name, V... values);
847
848 /**
849 * Sets a new header. Any existing headers with this name are removed. Before the {@code value} is add, it's
850 * converted to type {@code T}.
851 *
852 * @param name the header name
853 * @param value the value of the header
854 * @throws NullPointerException if either {@code name} or {@code value} before or after its conversion is
855 * {@code null}.
856 * @return {@code this}
857 */
858 T setObject(K name, Object value);
859
860 /**
861 * Sets a header with the specified name and values. Any existing headers with this name are removed. This method
862 * is equivalent to:
863 *
864 * <pre>
865 * headers.remove(name);
866 * for (Object v : values) {
867 * headers.addObject(name, v);
868 * }
869 * </pre>
870 *
871 * @param name the header name
872 * @param values the values of the header
873 * @return {@code this}
874 */
875 T setObject(K name, Iterable<?> values);
876
877 /**
878 * Sets a header with the specified name and values. Any existing headers with this name are removed. This method
879 * is equivalent to:
880 *
881 * <pre>
882 * headers.remove(name);
883 * for (Object v : values) {
884 * headers.addObject(name, v);
885 * }
886 * </pre>
887 *
888 * @param name the header name
889 * @param values the values of the header
890 * @return {@code this}
891 */
892 T setObject(K name, Object... values);
893
894 /**
895 * Set the {@code name} to {@code value}. This will remove all previous values associated with {@code name}.
896 * @param name The name to modify
897 * @param value The value
898 * @return {@code this}
899 */
900 T setBoolean(K name, boolean value);
901
902 /**
903 * Set the {@code name} to {@code value}. This will remove all previous values associated with {@code name}.
904 * @param name The name to modify
905 * @param value The value
906 * @return {@code this}
907 */
908 T setByte(K name, byte value);
909
910 /**
911 * Set the {@code name} to {@code value}. This will remove all previous values associated with {@code name}.
912 * @param name The name to modify
913 * @param value The value
914 * @return {@code this}
915 */
916 T setChar(K name, char value);
917
918 /**
919 * Set the {@code name} to {@code value}. This will remove all previous values associated with {@code name}.
920 * @param name The name to modify
921 * @param value The value
922 * @return {@code this}
923 */
924 T setShort(K name, short value);
925
926 /**
927 * Set the {@code name} to {@code value}. This will remove all previous values associated with {@code name}.
928 * @param name The name to modify
929 * @param value The value
930 * @return {@code this}
931 */
932 T setInt(K name, int value);
933
934 /**
935 * Set the {@code name} to {@code value}. This will remove all previous values associated with {@code name}.
936 * @param name The name to modify
937 * @param value The value
938 * @return {@code this}
939 */
940 T setLong(K name, long value);
941
942 /**
943 * Set the {@code name} to {@code value}. This will remove all previous values associated with {@code name}.
944 * @param name The name to modify
945 * @param value The value
946 * @return {@code this}
947 */
948 T setFloat(K name, float value);
949
950 /**
951 * Set the {@code name} to {@code value}. This will remove all previous values associated with {@code name}.
952 * @param name The name to modify
953 * @param value The value
954 * @return {@code this}
955 */
956 T setDouble(K name, double value);
957
958 /**
959 * Set the {@code name} to {@code value}. This will remove all previous values associated with {@code name}.
960 * @param name The name to modify
961 * @param value The value
962 * @return {@code this}
963 */
964 T setTimeMillis(K name, long value);
965
966 /**
967 * Clears the current header entries and copies all header entries of the specified {@code headers}.
968 *
969 * @return {@code this}
970 */
971 T set(Headers<? extends K, ? extends V, ?> headers);
972
973 /**
974 * Retains all current headers but calls {@link #set(K, V)} for each entry in {@code headers}.
975 *
976 * @param headers The headers used to {@link #set(K, V)} values in this instance
977 * @return {@code this}
978 */
979 T setAll(Headers<? extends K, ? extends V, ?> headers);
980
981 /**
982 * Removes all headers with the specified {@code name}.
983 *
984 * @param name the header name
985 * @return {@code true} if at least one entry has been removed.
986 */
987 boolean remove(K name);
988
989 /**
990 * Removes all headers. After a call to this method {@link #size()} equals {@code 0}.
991 *
992 * @return {@code this}
993 */
994 T clear();
995
996 @Override
997 Iterator<Entry<K, V>> iterator();
998 }