|
35 | 35 | import java.util.List;
|
36 | 36 | import java.util.Set;
|
37 | 37 | import java.util.TreeSet;
|
| 38 | +import java.util.function.BiConsumer; |
38 | 39 | import java.util.function.Consumer;
|
39 | 40 |
|
| 41 | +import org.apache.hc.core5.annotation.Internal; |
40 | 42 | import org.apache.hc.core5.http.EntityDetails;
|
41 | 43 | import org.apache.hc.core5.http.FormattedHeader;
|
42 | 44 | import org.apache.hc.core5.http.Header;
|
@@ -167,49 +169,75 @@ public static Header format(final String name, final String... tokens) {
|
167 | 169 | return headerOfTokens(name, Arrays.asList(tokens));
|
168 | 170 | }
|
169 | 171 |
|
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) { |
174 | 201 | Args.notNull(src, "Source");
|
175 | 202 | Args.notNull(cursor, "Cursor");
|
176 | 203 | Args.notNull(consumer, "Consumer");
|
177 | 204 | 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 | + } |
181 | 211 | }
|
182 |
| - final String token = Tokenizer.INSTANCE.parseToken(src, cursor, COMMA); |
183 |
| - consumer.accept(token); |
184 | 212 | }
|
185 | 213 | }
|
186 | 214 |
|
| 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 | + |
187 | 225 | /**
|
188 | 226 | * @since 5.3
|
189 | 227 | */
|
190 | 228 | public static void parseTokens(final Header header, final Consumer<String> consumer) {
|
191 | 229 | 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)); |
202 | 232 | }
|
203 | 233 |
|
204 | 234 | /**
|
205 | 235 | * @since 5.3
|
206 | 236 | */
|
207 | 237 | public static void parseTokens(final MessageHeaders headers, final String headerName, final Consumer<String> consumer) {
|
208 | 238 | 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)); |
213 | 241 | }
|
214 | 242 |
|
215 | 243 | 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)
|
291 | 319 | * @since 5.3
|
292 | 320 | */
|
293 | 321 | 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) -> { |
298 | 323 | final HeaderElement element = BasicHeaderValueParser.INSTANCE.parseHeaderElement(buffer, cursor);
|
299 | 324 | 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 | + }); |
307 | 326 | }
|
308 | 327 |
|
309 | 328 | /**
|
310 | 329 | * @since 5.3
|
311 | 330 | */
|
312 | 331 | public static void parseElements(final Header header, final Consumer<HeaderElement> consumer) {
|
313 | 332 | 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)); |
324 | 335 | }
|
325 | 336 |
|
326 | 337 | /**
|
327 | 338 | * @since 5.3
|
328 | 339 | */
|
329 | 340 | public static void parseElements(final MessageHeaders headers, final String headerName, final Consumer<HeaderElement> consumer) {
|
330 | 341 | 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)); |
335 | 344 | }
|
336 | 345 |
|
337 | 346 | /**
|
|
0 commit comments