Skip to content

Commit 99630f4

Browse files
committed
Support for parsing of headers representing a list of complex elements
1 parent 817b265 commit 99630f4

1 file changed

Lines changed: 38 additions & 30 deletions

File tree

httpcore5/src/main/java/org/apache/hc/core5/http/message/MessageSupport.java

Lines changed: 38 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import java.util.List;
3636
import java.util.Set;
3737
import java.util.TreeSet;
38+
import java.util.function.BiConsumer;
3839
import java.util.function.Consumer;
3940

4041
import 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

Comments
 (0)