NameValuePair parseTokenOrParameter(final CharSequence buffer, final ParserCursor cursor) { tokenParser.skipWhiteSpace(buffer, cursor); final String token = tokenParser.parseToken(buffer, cursor, TERMINATORS); if (!cursor.atEnd()) { if (buffer.charAt(cursor.getPos()) == BLANK) { tokenParser.skipWhiteSpace(buffer, cursor); } if (!cursor.atEnd() && buffer.charAt(cursor.getPos()) == EQUAL_CHAR) { cursor.updatePos(cursor.getPos() + 1); final String value = tokenParser.parseValue(buffer, cursor, DELIMITER); return new BasicNameValuePair(token, value); } } return new BasicNameValuePair(token, null); }
if (delimiters != null && delimiters.get(current)) { break; } else if (isWhitespace(current)) { skipWhiteSpace(buf, cursor); whitespace = true; } else { dst.append(' '); copyContent(buf, cursor, delimiters, dst); whitespace = false;
if (delimiters != null && delimiters.get(current)) { break; } else if (isWhitespace(current)) { skipWhiteSpace(buf, cursor); whitespace = true; } else if (current == DQUOTE) { dst.append(' '); copyQuotedContent(buf, cursor, dst); whitespace = false; } else { dst.append(' '); copyUnquotedContent(buf, cursor, delimiters, dst); whitespace = false;
@Override public StatusLine parseStatusLine(final CharArrayBuffer buffer) throws ParseException { Args.notNull(buffer, "Char array buffer"); final ParserCursor cursor = new ParserCursor(0, buffer.length()); this.tokenParser.skipWhiteSpace(buffer, cursor); final ProtocolVersion ver = parseProtocolVersion(buffer, cursor); this.tokenParser.skipWhiteSpace(buffer, cursor); final String s = this.tokenParser.parseToken(buffer, cursor, BLANKS); for (int i = 0; i < s.length(); i++) { if (!Character.isDigit(s.charAt(i))) { throw new ParseException("Status line contains invalid status code", buffer, cursor.getLowerBound(), cursor.getUpperBound(), cursor.getPos()); } } final int statusCode; try { statusCode = Integer.parseInt(s); } catch (final NumberFormatException e) { throw new ParseException("Status line contains invalid status code", buffer, cursor.getLowerBound(), cursor.getUpperBound(), cursor.getPos()); } final String text = buffer.substringTrimmed(cursor.getPos(), cursor.getUpperBound()); return new StatusLine(ver, statusCode, text); }
@Override public Header parseHeader(final CharArrayBuffer buffer) throws ParseException { Args.notNull(buffer, "Char array buffer"); final ParserCursor cursor = new ParserCursor(0, buffer.length()); this.tokenParser.skipWhiteSpace(buffer, cursor); final String name = this.tokenParser.parseToken(buffer, cursor, COLON); if (cursor.getPos() == cursor.getLowerBound() || cursor.getPos() == cursor.getUpperBound() || buffer.charAt(cursor.getPos()) != ':' || TextUtils.isEmpty(name) || TokenParser.isWhitespace(buffer.charAt(cursor.getPos() - 1))) { throw new ParseException("Invalid header", buffer, cursor.getLowerBound(), cursor.getUpperBound(), cursor.getPos()); } final String value = buffer.substringTrimmed(cursor.getPos() + 1, cursor.getUpperBound()); return new BasicHeader(name, value); }
@Test public void testTokenParsingWithQuotedPairs() throws Exception { final String s = "raw: \"\\\"some\\stuff\\\\\""; final CharArrayBuffer raw = createBuffer(s); final ParserCursor cursor = new ParserCursor(0, s.length()); parser.skipWhiteSpace(raw, cursor); Assert.assertFalse(cursor.atEnd()); Assert.assertEquals(0, cursor.getPos()); final StringBuilder strbuf1 = new StringBuilder(); parser.copyContent(raw, cursor, TokenParser.INIT_BITSET(':'), strbuf1); Assert.assertFalse(cursor.atEnd()); Assert.assertEquals("raw", strbuf1.toString()); Assert.assertEquals(':', raw.charAt(cursor.getPos())); cursor.updatePos(cursor.getPos() + 1); parser.skipWhiteSpace(raw, cursor); Assert.assertFalse(cursor.atEnd()); final StringBuilder strbuf2 = new StringBuilder(); parser.copyQuotedContent(raw, cursor, strbuf2); Assert.assertTrue(cursor.atEnd()); Assert.assertEquals("\"some\\stuff\\", strbuf2.toString()); }
@Override public NameValuePair parseNameValuePair(final CharSequence buffer, final ParserCursor cursor) { Args.notNull(buffer, "Char sequence"); Args.notNull(cursor, "Parser cursor"); final String name = tokenParser.parseToken(buffer, cursor, TOKEN_DELIMS); if (cursor.atEnd()) { return new BasicNameValuePair(name, null); } final int delim = buffer.charAt(cursor.getPos()); cursor.updatePos(cursor.getPos() + 1); if (delim != '=') { return new BasicNameValuePair(name, null); } final String value = tokenParser.parseValue(buffer, cursor, VALUE_DELIMS); if (!cursor.atEnd()) { cursor.updatePos(cursor.getPos() + 1); } return new BasicNameValuePair(name, value); }
@Test public void testTokenParsingEscapedQuotes() throws Exception { final String s = "stuff\"\\\"more\\\"\"stuff;"; final CharArrayBuffer raw = createBuffer(s); final ParserCursor cursor = new ParserCursor(0, s.length()); final String result = parser.parseValue(raw, cursor, TokenParser.INIT_BITSET(';')); Assert.assertEquals("stuff\"more\"stuff", result); }
private String parseToken(final CharArrayBuffer buf, final ParserCursor cursor, final BitSet delimiters) { return tokenParser.parseToken(buf, cursor, delimiters); }
@Override public void copyUnquotedContent( final CharSequence buf, final ParserCursor cursor, final BitSet delimiters, final StringBuilder dst) { int pos = cursor.getPos(); final int indexFrom = cursor.getPos(); final int indexTo = cursor.getUpperBound(); boolean escaped = false; for (int i = indexFrom; i < indexTo; i++, pos++) { final char current = buf.charAt(i); if (escaped) { dst.append(current); escaped = false; } else { if ((delimiters != null && delimiters.get(current)) || TokenParser.isWhitespace(current) || current == '\"') { break; } else if (current == '\\') { escaped = true; } else { dst.append(current); } } } cursor.updatePos(pos); } }
List<NameValuePair> parse(final CharArrayBuffer buf, final ParserCursor cursor) { final List<NameValuePair> params = new ArrayList<>(); tokenParser.skipWhiteSpace(buf, cursor); while (!cursor.atEnd()) { final NameValuePair param = parseParameter(buf, cursor); params.add(param); } return params; }
@Test public void testTokenParsingTokensWithUnquotedBlanks() throws Exception { final String s = " stuff and \tsome\tmore stuff ;"; final CharArrayBuffer raw = createBuffer(s); final ParserCursor cursor = new ParserCursor(0, s.length()); final String result = parser.parseToken(raw, cursor, TokenParser.INIT_BITSET(';')); Assert.assertEquals("stuff and some more stuff", result); }
private String parseValue(final CharArrayBuffer buf, final ParserCursor cursor, final BitSet delimiters) { return tokenParser.parseValue(buf, cursor, delimiters); }
@Test public void testTokenParsingIncompleteQuote() throws Exception { final String s = "\"stuff and more stuff "; final CharArrayBuffer raw = createBuffer(s); final ParserCursor cursor = new ParserCursor(0, s.length()); final StringBuilder strbuf1 = new StringBuilder(); parser.copyQuotedContent(raw, cursor, strbuf1); Assert.assertEquals("stuff and more stuff ", strbuf1.toString()); }
@Before public void setUp() throws Exception { parser = new TokenParser(); }
@Override public StatusLine parseStatusLine(final CharArrayBuffer buffer) throws ParseException { Args.notNull(buffer, "Char array buffer"); final ParserCursor cursor = new ParserCursor(0, buffer.length()); this.tokenParser.skipWhiteSpace(buffer, cursor); final ProtocolVersion ver = parseProtocolVersion(buffer, cursor); this.tokenParser.skipWhiteSpace(buffer, cursor); final String s = this.tokenParser.parseToken(buffer, cursor, BLANKS); for (int i = 0; i < s.length(); i++) { if (!Character.isDigit(s.charAt(i))) { throw new ParseException("Status line contains invalid status code", buffer, cursor.getLowerBound(), cursor.getUpperBound(), cursor.getPos()); } } final int statusCode; try { statusCode = Integer.parseInt(s); } catch (final NumberFormatException e) { throw new ParseException("Status line contains invalid status code", buffer, cursor.getLowerBound(), cursor.getUpperBound(), cursor.getPos()); } final String text = buffer.substringTrimmed(cursor.getPos(), cursor.getUpperBound()); return new StatusLine(ver, statusCode, text); }
@Override public Header parseHeader(final CharArrayBuffer buffer) throws ParseException { Args.notNull(buffer, "Char array buffer"); final ParserCursor cursor = new ParserCursor(0, buffer.length()); this.tokenParser.skipWhiteSpace(buffer, cursor); final String name = this.tokenParser.parseToken(buffer, cursor, COLON); if (cursor.getPos() == cursor.getLowerBound() || cursor.getPos() == cursor.getUpperBound() || buffer.charAt(cursor.getPos()) != ':' || TextUtils.isEmpty(name) || TokenParser.isWhitespace(buffer.charAt(cursor.getPos() - 1))) { throw new ParseException("Invalid header", buffer, cursor.getLowerBound(), cursor.getUpperBound(), cursor.getPos()); } final String value = buffer.substringTrimmed(cursor.getPos() + 1, cursor.getUpperBound()); return new BasicHeader(name, value); }
@Test public void testBasicTokenParsing() throws Exception { final String s = " raw: \" some stuff \""; final CharArrayBuffer raw = createBuffer(s); final ParserCursor cursor = new ParserCursor(0, s.length()); parser.skipWhiteSpace(raw, cursor); Assert.assertFalse(cursor.atEnd()); Assert.assertEquals(3, cursor.getPos()); final StringBuilder strbuf1 = new StringBuilder(); parser.copyContent(raw, cursor, TokenParser.INIT_BITSET(':'), strbuf1); Assert.assertFalse(cursor.atEnd()); Assert.assertEquals(6, cursor.getPos()); Assert.assertEquals("raw", strbuf1.toString()); Assert.assertEquals(':', raw.charAt(cursor.getPos())); cursor.updatePos(cursor.getPos() + 1); parser.skipWhiteSpace(raw, cursor); Assert.assertFalse(cursor.atEnd()); Assert.assertEquals(8, cursor.getPos()); final StringBuilder strbuf2 = new StringBuilder(); parser.copyQuotedContent(raw, cursor, strbuf2); Assert.assertTrue(cursor.atEnd()); Assert.assertEquals(" some stuff ", strbuf2.toString()); parser.copyQuotedContent(raw, cursor, strbuf2); Assert.assertTrue(cursor.atEnd()); parser.skipWhiteSpace(raw, cursor); Assert.assertTrue(cursor.atEnd()); }
@Override public NameValuePair parseNameValuePair(final CharSequence buffer, final ParserCursor cursor) { Args.notNull(buffer, "Char sequence"); Args.notNull(cursor, "Parser cursor"); final String name = tokenParser.parseToken(buffer, cursor, TOKEN_DELIMS); if (cursor.atEnd()) { return new BasicNameValuePair(name, null); } final int delim = buffer.charAt(cursor.getPos()); cursor.updatePos(cursor.getPos() + 1); if (delim != '=') { return new BasicNameValuePair(name, null); } final String value = tokenParser.parseValue(buffer, cursor, VALUE_DELIMS); if (!cursor.atEnd()) { cursor.updatePos(cursor.getPos() + 1); } return new BasicNameValuePair(name, value); }
@Test public void testTokenParsingMixedValuesAndQuotedValues2() throws Exception { final String s = "stuff\"more\"stuff;"; final CharArrayBuffer raw = createBuffer(s); final ParserCursor cursor = new ParserCursor(0, s.length()); final String result = parser.parseValue(raw, cursor, TokenParser.INIT_BITSET(';')); Assert.assertEquals("stuffmorestuff", result); }