|
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