src/main/java/js/http/encoder/QueryParametersParser.java
private static List<Parameter> parse(Reader reader) throws IOException {
		List<Parameter> parameters = new ArrayList<Parameter>();
		Parameter parameter = new Parameter();

		State state = State.NAME;
		for (;;) {
			int b = reader.read();
			if (b == -1) {
				// conclude last parameter value
				if (parameter.isEmpty()) {
					break;
				}
				if (parameters.isEmpty() && parameter.isRawValue()) {
					parameter.commitRawValue();
				} else {
					parameter.commitValue();
				}
				parameters.add(parameter);
				break;
			}
			char c = (char) b;

			switch (state) {
			case NAME:
				switch (c) {
				case '=':
					state = State.VALUE;
					parameter.commitName();
					break;

				case '&':
					if (parameter.getBuilder().isEmpty()) {
						throw new SyntaxException("Invalid query string. Empty parameter name.");
					} else {
						throw new SyntaxException("Invalid query string parameter |%s|. Missing name/value separator.", parameter.getBuilder());
					}

				default:
					parameter.append(c);
				}
				break;

			case VALUE:
				switch (c) {
				case '&':
					state = State.NAME;
					parameter.commitValue();
					parameters.add(parameter);
					parameter = new Parameter();
					break;

				case '=':
					throw new SyntaxException("Invalid query string parameter |%s|. Unescaped '=' character.", parameter.getBuilder());

				default:
					parameter.append(c);
				}
			}
		}

		return parameters;
	}
private static List<Parameter> parse(Reader reader) throws IOException {
		List<Parameter> parameters = new ArrayList<Parameter>();
		Parameter parameter = new Parameter();

		State state = State.NAME;
		for (;;) {
			int b = reader.read();
			if (b == -1) {
				// conclude last parameter value
				if (parameter.isEmpty()) {
					break;
				}
				if (parameters.isEmpty() && parameter.isRawValue()) {
					parameter.commitRawValue();
				} else {
					parameter.commitValue();
				}
				parameters.add(parameter);
				break;
			}
			char c = (char) b;

			switch (state) {
			case NAME:
				switch (c) {
				case '=':
					state = State.VALUE;
					parameter.commitName();
					break;

				case '&':
					if (parameter.getBuilder().isEmpty()) {
						throw new SyntaxException("Invalid query string. Empty parameter name.");
					} else {
						throw new SyntaxException("Invalid query string parameter |%s|. Missing name/value separator.", parameter.getBuilder());
					}

				default:
					parameter.append(c);
				}
				break;

			case VALUE:
				switch (c) {
				case '&':
					state = State.NAME;
					parameter.commitValue();
					parameters.add(parameter);
					parameter = new Parameter();
					break;

				case '=':
					throw new SyntaxException("Invalid query string parameter |%s|. Unescaped '=' character.", parameter.getBuilder());

				default:
					parameter.append(c);
				}
			}
		}

		return parameters;
	}
Parse URL query parameters provided by source reader. Detect query parameters name and and value and update a list of
parsed parameters. Takes care to decode escaped characters from both parameter names and values.
<p>
This parser expect UTF-8 for text encoding and throws unsupported encoding for different codes.

@param reader source reader.
@return list of parsed parameters.
@throws IOException if read operation fails.
@throws UnsupportedEncodingException if URL encoded parameters encoding is not UTF-8.
@throws SyntaxException if URL query parameters are not properly encoded.