exchange.setRequestURI(path); } else if (parseState < HOST_DONE) { String decodedPath = decode(path, urlDecodeRequired, state, allowEncodedSlash, false); exchange.setRequestPath(decodedPath); exchange.setRelativePath(decodedPath); exchange.setRequestURI(path); } else { handleFullUrl(state, exchange, canonicalPathStart, urlDecodeRequired, path); throw UndertowMessages.MESSAGES.failedToParsePath(); } else if (next == '?' && (parseState == START || parseState == HOST_DONE || parseState == IN_PATH)) { beginQueryParameters(buffer, state, exchange, stringBuilder, parseState, canonicalPathStart, urlDecodeRequired); return; } else if (next == ';' && (parseState == START || parseState == HOST_DONE || parseState == IN_PATH)) { beginPathParameters(state, exchange, stringBuilder, parseState, canonicalPathStart, urlDecodeRequired); handlePathParameters(buffer, state, exchange); return; } else {
private void handleStateful(ByteBuffer buffer, ParseState currentState, HttpServerExchange builder) throws BadRequestException { if (currentState.state == ParseState.PATH) { handlePath(buffer, currentState, builder); if (!buffer.hasRemaining()) { return; handleQueryParameters(buffer, currentState, builder); if (!buffer.hasRemaining()) { return; handlePathParameters(buffer, currentState, builder); if (!buffer.hasRemaining()) { return; handleHttpVersion(buffer, currentState, builder); if (!buffer.hasRemaining()) { return; handleAfterVersion(buffer, currentState); if (!buffer.hasRemaining()) { return; handleHeader(buffer, currentState, builder); if (!buffer.hasRemaining()) { return; handleHeaderValue(buffer, currentState, builder); if (!buffer.hasRemaining()) { return;
/** * Parses a header value. This is called from the generated bytecode. * * @param buffer The buffer * @param state The current state * @param builder The exchange builder * @return The number of bytes remaining */ @SuppressWarnings("unused") final void handleHeaderValue(ByteBuffer buffer, ParseState state, HttpServerExchange builder) throws BadRequestException { HttpString headerName = state.nextHeader; StringBuilder stringBuilder = state.stringBuilder; CacheMap<HttpString, String> headerValuesCache = state.headerValuesCache; if (headerName != null && stringBuilder.length() == 0 && headerValuesCache != null) { String existing = headerValuesCache.get(headerName); if (existing != null) { if (handleCachedHeader(existing, buffer, state, builder)) { return; } } } handleHeaderValueCacheMiss(buffer, state, builder, headerName, headerValuesCache, stringBuilder); }
} else { try { handleHttpVerb(buffer, currentState, builder); } catch (IllegalArgumentException e) { throw new BadRequestException(e); handlePath(buffer, currentState, builder); boolean failed = false; if (buffer.remaining() > HTTP_LENGTH + 3) { handleHttpVersion(buffer, currentState, builder); handleAfterVersion(buffer, currentState); handleHeader(buffer, currentState, builder); if (currentState.state == ParseState.HEADER_VALUE) { handleHeaderValue(buffer, currentState, builder); handleStateful(buffer, currentState, builder);
private void beginQueryParameters(ByteBuffer buffer, ParseState state, HttpServerExchange exchange, StringBuilder stringBuilder, int parseState, int canonicalPathStart, boolean urlDecodeRequired) throws BadRequestException { final String path = stringBuilder.toString(); if (parseState == SECOND_SLASH) { exchange.setRequestPath("/"); exchange.setRelativePath("/"); exchange.setRequestURI(path); } else if (parseState < HOST_DONE) { String decodedPath = decode(path, urlDecodeRequired, state, allowEncodedSlash, false); exchange.setRequestPath(decodedPath); exchange.setRelativePath(decodedPath); exchange.setRequestURI(path, false); } else { handleFullUrl(state, exchange, canonicalPathStart, urlDecodeRequired, path); } state.state = ParseState.QUERY_PARAMETERS; state.stringBuilder.setLength(0); state.parseState = 0; state.pos = 0; state.urlDecodeRequired = false; handleQueryParameters(buffer, state, exchange); }
if (nextQueryParam == null) { if (queryParamPos != stringBuilder.length()) { exchange.addPathParam(decode(stringBuilder.substring(queryParamPos), urlDecodeRequired, state, true, true), ""); exchange.addPathParam(nextQueryParam, decode(stringBuilder.substring(queryParamPos), urlDecodeRequired, state, true, true)); if (next == '?') { state.state = ParseState.QUERY_PARAMETERS; handleQueryParameters(buffer, state, exchange); } else { state.state = ParseState.VERSION; nextQueryParam = decode(stringBuilder.substring(queryParamPos), urlDecodeRequired, state, true, true); urlDecodeRequired = false; queryParamPos = stringBuilder.length() + 1; throw UndertowMessages.MESSAGES.tooManyQueryParameters(maxParameters); exchange.addPathParam(decode(stringBuilder.substring(queryParamPos), urlDecodeRequired, state, true, true), ""); urlDecodeRequired = false; queryParamPos = stringBuilder.length() + 1; exchange.addPathParam(nextQueryParam, decode(stringBuilder.substring(queryParamPos), urlDecodeRequired, state, true, true)); urlDecodeRequired = false; queryParamPos = stringBuilder.length() + 1;
private void handleFullUrl(ParseState state, HttpServerExchange exchange, int canonicalPathStart, boolean urlDecodeRequired, String path) { String thePath = decode(path.substring(canonicalPathStart), urlDecodeRequired, state, allowEncodedSlash, false); exchange.setRequestPath(thePath); exchange.setRelativePath(thePath); exchange.setRequestURI(path, true); }
httpServerExchange = new HttpServerExchange(connection, maxEntitySize); parser.handle(buffer, state, httpServerExchange); if (buffer.hasRemaining()) { free = false;
} else { try { handleHttpVerb(buffer, currentState, builder); } catch (IllegalArgumentException e) { throw new BadRequestException(e); handlePath(buffer, currentState, builder); boolean failed = false; if (buffer.remaining() > HTTP_LENGTH + 3) { handleHttpVersion(buffer, currentState, builder); handleAfterVersion(buffer, currentState); handleHeader(buffer, currentState, builder); if (currentState.state == ParseState.HEADER_VALUE) { handleHeaderValue(buffer, currentState, builder); handleStateful(buffer, currentState, builder);
private void beginQueryParameters(ByteBuffer buffer, ParseState state, HttpServerExchange exchange, StringBuilder stringBuilder, int parseState, int canonicalPathStart, boolean urlDecodeRequired) throws BadRequestException { final String path = stringBuilder.toString(); if (parseState == SECOND_SLASH) { exchange.setRequestPath("/"); exchange.setRelativePath("/"); exchange.setRequestURI(path); } else if (parseState < HOST_DONE) { String decodedPath = decode(path, urlDecodeRequired, state, allowEncodedSlash, false); exchange.setRequestPath(decodedPath); exchange.setRelativePath(decodedPath); exchange.setRequestURI(path, false); } else { handleFullUrl(state, exchange, canonicalPathStart, urlDecodeRequired, path); } state.state = ParseState.QUERY_PARAMETERS; state.stringBuilder.setLength(0); state.parseState = 0; state.pos = 0; state.urlDecodeRequired = false; handleQueryParameters(buffer, state, exchange); }
if (nextQueryParam == null) { if (queryParamPos != stringBuilder.length()) { exchange.addPathParam(decode(stringBuilder.substring(queryParamPos), urlDecodeRequired, state, true, true), ""); exchange.addPathParam(nextQueryParam, decode(stringBuilder.substring(queryParamPos), urlDecodeRequired, state, true, true)); if (next == '?') { state.state = ParseState.QUERY_PARAMETERS; handleQueryParameters(buffer, state, exchange); } else { state.state = ParseState.VERSION; nextQueryParam = decode(stringBuilder.substring(queryParamPos), urlDecodeRequired, state, true, true); urlDecodeRequired = false; queryParamPos = stringBuilder.length() + 1; throw UndertowMessages.MESSAGES.tooManyQueryParameters(maxParameters); exchange.addPathParam(decode(stringBuilder.substring(queryParamPos), urlDecodeRequired, state, true, true), ""); urlDecodeRequired = false; queryParamPos = stringBuilder.length() + 1; exchange.addPathParam(nextQueryParam, decode(stringBuilder.substring(queryParamPos), urlDecodeRequired, state, true, true)); urlDecodeRequired = false; queryParamPos = stringBuilder.length() + 1;
if (nextQueryParam == null) { if (queryParamPos != stringBuilder.length()) { exchange.addQueryParam(decode(stringBuilder.substring(queryParamPos), urlDecodeRequired, state, true, true), ""); exchange.addQueryParam(nextQueryParam, decode(stringBuilder.substring(queryParamPos), urlDecodeRequired, state, true, true)); urlDecodeRequired = true; } else if (next == '=' && nextQueryParam == null) { nextQueryParam = decode(stringBuilder.substring(queryParamPos), urlDecodeRequired, state, true, true); urlDecodeRequired = false; queryParamPos = stringBuilder.length() + 1; exchange.addQueryParam(decode(stringBuilder.substring(queryParamPos), urlDecodeRequired, state, true, true), ""); throw UndertowMessages.MESSAGES.tooManyQueryParameters(maxParameters); exchange.addQueryParam(nextQueryParam, decode(stringBuilder.substring(queryParamPos), urlDecodeRequired, state, true, true)); urlDecodeRequired = false; queryParamPos = stringBuilder.length() + 1;
httpServerExchange = new HttpServerExchange(connection, maxEntitySize); parser.handle(buffer, state, httpServerExchange); if (buffer.hasRemaining()) { free = false;
private void handleStateful(ByteBuffer buffer, ParseState currentState, HttpServerExchange builder) throws BadRequestException { if (currentState.state == ParseState.PATH) { handlePath(buffer, currentState, builder); if (!buffer.hasRemaining()) { return; handleQueryParameters(buffer, currentState, builder); if (!buffer.hasRemaining()) { return; handlePathParameters(buffer, currentState, builder); if (!buffer.hasRemaining()) { return; handleHttpVersion(buffer, currentState, builder); if (!buffer.hasRemaining()) { return; handleAfterVersion(buffer, currentState); if (!buffer.hasRemaining()) { return; handleHeader(buffer, currentState, builder); if (!buffer.hasRemaining()) { return; handleHeaderValue(buffer, currentState, builder); if (!buffer.hasRemaining()) { return;
} else { try { handleHttpVerb(buffer, currentState, builder); } catch (IllegalArgumentException e) { throw new BadRequestException(e); handlePath(buffer, currentState, builder); boolean failed = false; if (buffer.remaining() > HTTP_LENGTH + 3) { handleHttpVersion(buffer, currentState, builder); handleAfterVersion(buffer, currentState); handleHeader(buffer, currentState, builder); if (currentState.state == ParseState.HEADER_VALUE) { handleHeaderValue(buffer, currentState, builder); handleStateful(buffer, currentState, builder);
exchange.setRequestURI(path); } else if (parseState < HOST_DONE) { String decodedPath = decode(path, urlDecodeRequired, state, allowEncodedSlash, false); exchange.setRequestPath(decodedPath); exchange.setRelativePath(decodedPath); exchange.setRequestURI(path); } else { handleFullUrl(state, exchange, canonicalPathStart, urlDecodeRequired, path); throw UndertowMessages.MESSAGES.failedToParsePath(); } else if (next == '?' && (parseState == START || parseState == HOST_DONE || parseState == IN_PATH)) { beginQueryParameters(buffer, state, exchange, stringBuilder, parseState, canonicalPathStart, urlDecodeRequired); return; } else if (next == ';' && (parseState == START || parseState == HOST_DONE || parseState == IN_PATH)) { beginPathParameters(state, exchange, stringBuilder, parseState, canonicalPathStart, urlDecodeRequired); handlePathParameters(buffer, state, exchange); return; } else {
private void beginQueryParameters(ByteBuffer buffer, ParseState state, HttpServerExchange exchange, StringBuilder stringBuilder, int parseState, int canonicalPathStart, boolean urlDecodeRequired) throws BadRequestException { final String path = stringBuilder.toString(); if (parseState == SECOND_SLASH) { exchange.setRequestPath("/"); exchange.setRelativePath("/"); exchange.setRequestURI(path); } else if (parseState < HOST_DONE) { String decodedPath = decode(path, urlDecodeRequired, state, allowEncodedSlash, false); exchange.setRequestPath(decodedPath); exchange.setRelativePath(decodedPath); exchange.setRequestURI(path, false); } else { handleFullUrl(state, exchange, canonicalPathStart, urlDecodeRequired, path); } state.state = ParseState.QUERY_PARAMETERS; state.stringBuilder.setLength(0); state.parseState = 0; state.pos = 0; state.urlDecodeRequired = false; handleQueryParameters(buffer, state, exchange); }
/** * Parses a header value. This is called from the generated bytecode. * * @param buffer The buffer * @param state The current state * @param builder The exchange builder * @return The number of bytes remaining */ @SuppressWarnings("unused") final void handleHeaderValue(ByteBuffer buffer, ParseState state, HttpServerExchange builder) throws BadRequestException { HttpString headerName = state.nextHeader; StringBuilder stringBuilder = state.stringBuilder; CacheMap<HttpString, String> headerValuesCache = state.headerValuesCache; if (headerName != null && stringBuilder.length() == 0 && headerValuesCache != null) { String existing = headerValuesCache.get(headerName); if (existing != null) { if (handleCachedHeader(existing, buffer, state, builder)) { return; } } } handleHeaderValueCacheMiss(buffer, state, builder, headerName, headerValuesCache, stringBuilder); }
if (nextQueryParam == null) { if (queryParamPos != stringBuilder.length()) { exchange.addPathParam(decode(stringBuilder.substring(queryParamPos), urlDecodeRequired, state, true, true), ""); exchange.addPathParam(nextQueryParam, decode(stringBuilder.substring(queryParamPos), urlDecodeRequired, state, true, true)); if (next == '?') { state.state = ParseState.QUERY_PARAMETERS; handleQueryParameters(buffer, state, exchange); } else { state.state = ParseState.VERSION; nextQueryParam = decode(stringBuilder.substring(queryParamPos), urlDecodeRequired, state, true, true); urlDecodeRequired = false; queryParamPos = stringBuilder.length() + 1; throw UndertowMessages.MESSAGES.tooManyQueryParameters(maxParameters); exchange.addPathParam(decode(stringBuilder.substring(queryParamPos), urlDecodeRequired, state, true, true), ""); urlDecodeRequired = false; queryParamPos = stringBuilder.length() + 1; exchange.addPathParam(nextQueryParam, decode(stringBuilder.substring(queryParamPos), urlDecodeRequired, state, true, true)); urlDecodeRequired = false; queryParamPos = stringBuilder.length() + 1;
private void beginPathParameters(ParseState state, HttpServerExchange exchange, StringBuilder stringBuilder, int parseState, int canonicalPathStart, boolean urlDecodeRequired) { final String path = stringBuilder.toString(); if(parseState == SECOND_SLASH) { exchange.setRequestPath("/"); exchange.setRelativePath("/"); exchange.setRequestURI(path); } else if (parseState < HOST_DONE) { String decodedPath = decode(path, urlDecodeRequired, state, allowEncodedSlash, false); exchange.setRequestPath(decodedPath); exchange.setRelativePath(decodedPath); exchange.setRequestURI(path); } else { String thePath = path.substring(canonicalPathStart); exchange.setRequestPath(thePath); exchange.setRelativePath(thePath); exchange.setRequestURI(path, true); } state.state = ParseState.PATH_PARAMETERS; state.stringBuilder.setLength(0); state.parseState = 0; state.pos = 0; state.urlDecodeRequired = false; }