Skip to content

Commit 3e60951

Browse files
committed
Support for parsing of headers representing a list of complex elements
1 parent ebbc7b5 commit 3e60951

File tree

1 file changed

+57
-48
lines changed

1 file changed

+57
-48
lines changed

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

Lines changed: 57 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,10 @@
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

41+
import org.apache.hc.core5.annotation.Internal;
4042
import org.apache.hc.core5.http.EntityDetails;
4143
import org.apache.hc.core5.http.FormattedHeader;
4244
import org.apache.hc.core5.http.Header;
@@ -167,49 +169,75 @@ public static Header format(final String name, final String... tokens) {
167169
return headerOfTokens(name, Arrays.asList(tokens));
168170
}
169171

170-
/**
171-
* @since 5.3
172-
*/
173-
public static void parseTokens(final CharSequence src, final ParserCursor cursor, final Consumer<String> consumer) {
172+
@Internal
173+
public static void parseHeader(final Header header, final BiConsumer<CharSequence, ParserCursor> consumer) {
174+
Args.notNull(header, "Header");
175+
if (header instanceof FormattedHeader) {
176+
final CharArrayBuffer buf = ((FormattedHeader) header).getBuffer();
177+
final ParserCursor cursor = new ParserCursor(0, buf.length());
178+
cursor.updatePos(((FormattedHeader) header).getValuePos());
179+
consumer.accept(buf, cursor);
180+
} else {
181+
final String value = header.getValue();
182+
final ParserCursor cursor = new ParserCursor(0, value.length());
183+
consumer.accept(value, cursor);
184+
}
185+
}
186+
187+
@Internal
188+
public static void parseHeaders(final MessageHeaders headers, final String name, final BiConsumer<CharSequence, ParserCursor> consumer) {
189+
Args.notNull(headers, "Message headers");
190+
Args.notBlank(name, "Header name");
191+
final Iterator<Header> it = headers.headerIterator(name);
192+
while (it.hasNext()) {
193+
parseHeader(it.next(), consumer);
194+
}
195+
}
196+
197+
@Internal
198+
public static void parseElementList(final CharSequence src,
199+
final ParserCursor cursor,
200+
final BiConsumer<CharSequence, ParserCursor> consumer) {
174201
Args.notNull(src, "Source");
175202
Args.notNull(cursor, "Cursor");
176203
Args.notNull(consumer, "Consumer");
177204
while (!cursor.atEnd()) {
178-
final int pos = cursor.getPos();
179-
if (src.charAt(pos) == ',') {
180-
cursor.updatePos(pos + 1);
205+
consumer.accept(src, cursor);
206+
if (!cursor.atEnd()) {
207+
final char ch = src.charAt(cursor.getPos());
208+
if (ch == ',') {
209+
cursor.updatePos(cursor.getPos() + 1);
210+
}
181211
}
182-
final String token = Tokenizer.INSTANCE.parseToken(src, cursor, COMMA);
183-
consumer.accept(token);
184212
}
185213
}
186214

215+
/**
216+
* @since 5.3
217+
*/
218+
public static void parseTokens(final CharSequence src, final ParserCursor cursor, final Consumer<String> consumer) {
219+
parseElementList(src, cursor, (sequence, c) -> {
220+
final String token = Tokenizer.INSTANCE.parseToken(src, c, COMMA);
221+
consumer.accept(token);
222+
});
223+
}
224+
187225
/**
188226
* @since 5.3
189227
*/
190228
public static void parseTokens(final Header header, final Consumer<String> consumer) {
191229
Args.notNull(header, "Header");
192-
if (header instanceof FormattedHeader) {
193-
final CharArrayBuffer buf = ((FormattedHeader) header).getBuffer();
194-
final ParserCursor cursor = new ParserCursor(0, buf.length());
195-
cursor.updatePos(((FormattedHeader) header).getValuePos());
196-
parseTokens(buf, cursor, consumer);
197-
} else {
198-
final String value = header.getValue();
199-
final ParserCursor cursor = new ParserCursor(0, value.length());
200-
parseTokens(value, cursor, consumer);
201-
}
230+
parseHeader(header, (sequence, cursor) ->
231+
parseTokens(sequence, cursor, consumer));
202232
}
203233

204234
/**
205235
* @since 5.3
206236
*/
207237
public static void parseTokens(final MessageHeaders headers, final String headerName, final Consumer<String> consumer) {
208238
Args.notNull(headers, "Headers");
209-
final Iterator<Header> it = headers.headerIterator(headerName);
210-
while (it.hasNext()) {
211-
parseTokens(it.next(), consumer);
212-
}
239+
parseHeaders(headers, headerName, (sequence, cursor) ->
240+
parseTokens(sequence, cursor, consumer));
213241
}
214242

215243
public static Set<String> parseTokens(final CharSequence src, final ParserCursor cursor) {
@@ -291,47 +319,28 @@ public static Header header(final String name, final HeaderElement... elements)
291319
* @since 5.3
292320
*/
293321
public static void parseElements(final CharSequence buffer, final ParserCursor cursor, final Consumer<HeaderElement> consumer) {
294-
Args.notNull(buffer, "Char sequence");
295-
Args.notNull(cursor, "Parser cursor");
296-
Args.notNull(consumer, "Consumer");
297-
while (!cursor.atEnd()) {
322+
parseElementList(buffer, cursor, (sequence, c) -> {
298323
final HeaderElement element = BasicHeaderValueParser.INSTANCE.parseHeaderElement(buffer, cursor);
299324
consumer.accept(element);
300-
if (!cursor.atEnd()) {
301-
final char ch = buffer.charAt(cursor.getPos());
302-
if (ch == ',') {
303-
cursor.updatePos(cursor.getPos() + 1);
304-
}
305-
}
306-
}
325+
});
307326
}
308327

309328
/**
310329
* @since 5.3
311330
*/
312331
public static void parseElements(final Header header, final Consumer<HeaderElement> consumer) {
313332
Args.notNull(header, "Header");
314-
if (header instanceof FormattedHeader) {
315-
final CharArrayBuffer buf = ((FormattedHeader) header).getBuffer();
316-
final ParserCursor cursor = new ParserCursor(0, buf.length());
317-
cursor.updatePos(((FormattedHeader) header).getValuePos());
318-
parseElements(buf, cursor, consumer);
319-
} else {
320-
final String value = header.getValue();
321-
final ParserCursor cursor = new ParserCursor(0, value.length());
322-
parseElements(value, cursor, consumer);
323-
}
333+
parseHeader(header, (sequence, cursor) ->
334+
parseElements(sequence, cursor, consumer));
324335
}
325336

326337
/**
327338
* @since 5.3
328339
*/
329340
public static void parseElements(final MessageHeaders headers, final String headerName, final Consumer<HeaderElement> consumer) {
330341
Args.notNull(headers, "Headers");
331-
final Iterator<Header> it = headers.headerIterator(headerName);
332-
while (it.hasNext()) {
333-
parseElements(it.next(), consumer);
334-
}
342+
parseHeaders(headers, headerName, (sequence, cursor) ->
343+
parseElements(sequence, cursor, consumer));
335344
}
336345

337346
/**

0 commit comments

Comments
 (0)