3535import java .util .List ;
3636import java .util .Set ;
3737import java .util .TreeSet ;
38+ import java .util .function .BiConsumer ;
3839import java .util .function .Consumer ;
3940
4041import org .apache .hc .core5 .http .EntityDetails ;
@@ -167,6 +168,35 @@ public static Header format(final String name, final String... tokens) {
167168 return headerOfTokens (name , Arrays .asList (tokens ));
168169 }
169170
171+ /**
172+ * @since 5.3
173+ */
174+ public static void parseHeader (final Header header , final BiConsumer <CharSequence , ParserCursor > consumer ) {
175+ Args .notNull (header , "Header" );
176+ if (header instanceof FormattedHeader ) {
177+ final CharArrayBuffer buf = ((FormattedHeader ) header ).getBuffer ();
178+ final ParserCursor cursor = new ParserCursor (0 , buf .length ());
179+ cursor .updatePos (((FormattedHeader ) header ).getValuePos ());
180+ consumer .accept (buf , cursor );
181+ } else {
182+ final String value = header .getValue ();
183+ final ParserCursor cursor = new ParserCursor (0 , value .length ());
184+ consumer .accept (value , cursor );
185+ }
186+ }
187+
188+ /**
189+ * @since 5.3
190+ */
191+ public static void parseHeaders (final MessageHeaders headers , final String name , final BiConsumer <CharSequence , ParserCursor > consumer ) {
192+ Args .notNull (headers , "Message headers" );
193+ Args .notBlank (name , "Header name" );
194+ final Iterator <Header > it = headers .headerIterator (name );
195+ while (it .hasNext ()) {
196+ parseHeader (it .next (), consumer );
197+ }
198+ }
199+
170200 /**
171201 * @since 5.4
172202 */
@@ -200,17 +230,8 @@ public static void parseTokens(final CharSequence src, final ParserCursor cursor
200230 public static void parseTokens (final Header header ,
201231 final Tokenizer .Delimiter delimiterPredicate ,
202232 final Consumer <String > consumer ) {
203- Args .notNull (header , "Header" );
204- if (header instanceof FormattedHeader ) {
205- final CharArrayBuffer buf = ((FormattedHeader ) header ).getBuffer ();
206- final ParserCursor cursor = new ParserCursor (0 , buf .length ());
207- cursor .updatePos (((FormattedHeader ) header ).getValuePos ());
208- parseTokens (buf , cursor , delimiterPredicate , consumer );
209- } else {
210- final String value = header .getValue ();
211- final ParserCursor cursor = new ParserCursor (0 , value .length ());
212- parseTokens (value , cursor , delimiterPredicate , consumer );
213- }
233+ parseHeader (header , (sequence , cursor ) ->
234+ parseTokens (sequence , cursor , delimiterPredicate , consumer ));
214235 }
215236
216237 /**
@@ -227,11 +248,8 @@ public static void parseTokens(final MessageHeaders headers,
227248 final String headerName ,
228249 final Tokenizer .Delimiter delimiterPredicate ,
229250 final Consumer <String > consumer ) {
230- Args .notNull (headers , "Headers" );
231- final Iterator <Header > it = headers .headerIterator (headerName );
232- while (it .hasNext ()) {
233- parseTokens (it .next (), delimiterPredicate , consumer );
234- }
251+ parseHeaders (headers , headerName , (sequence , cursor ) ->
252+ parseTokens (sequence , cursor , delimiterPredicate , consumer ));
235253 }
236254
237255 /**
@@ -340,27 +358,17 @@ public static void parseElements(final CharSequence buffer, final ParserCursor c
340358 */
341359 public static void parseElements (final Header header , final Consumer <HeaderElement > consumer ) {
342360 Args .notNull (header , "Header" );
343- if (header instanceof FormattedHeader ) {
344- final CharArrayBuffer buf = ((FormattedHeader ) header ).getBuffer ();
345- final ParserCursor cursor = new ParserCursor (0 , buf .length ());
346- cursor .updatePos (((FormattedHeader ) header ).getValuePos ());
347- parseElements (buf , cursor , consumer );
348- } else {
349- final String value = header .getValue ();
350- final ParserCursor cursor = new ParserCursor (0 , value .length ());
351- parseElements (value , cursor , consumer );
352- }
361+ parseHeader (header , (sequence , cursor ) ->
362+ parseElements (sequence , cursor , consumer ));
353363 }
354364
355365 /**
356366 * @since 5.3
357367 */
358368 public static void parseElements (final MessageHeaders headers , final String headerName , final Consumer <HeaderElement > consumer ) {
359369 Args .notNull (headers , "Headers" );
360- final Iterator <Header > it = headers .headerIterator (headerName );
361- while (it .hasNext ()) {
362- parseElements (it .next (), consumer );
363- }
370+ parseHeaders (headers , headerName , (sequence , cursor ) ->
371+ parseElements (sequence , cursor , consumer ));
364372 }
365373
366374 /**
0 commit comments