Skip to content

Instantly share code, notes, and snippets.

@sandipchitale
Last active October 18, 2023 01:49
Show Gist options
  • Save sandipchitale/25a5628c13d3430a8b16fa0d020ea580 to your computer and use it in GitHub Desktop.
Save sandipchitale/25a5628c13d3430a8b16fa0d020ea580 to your computer and use it in GitHub Desktop.
:authority: header handling in HTTP2 #http2

org.apache.coyote.http2.Stream#parseAuthority

    private void parseAuthority(String value, boolean host) throws HpackException {
        int i;
        try {
            i = Host.parse(value);
        } catch (IllegalArgumentException iae) {
            // Host value invalid
            throw new HpackException(sm.getString("stream.header.invalid", getConnectionId(), getIdAsString(),
                    host ? "host" : ":authority", value));
        }
        if (i > -1) {
            coyoteRequest.serverName().setString(value.substring(0, i));
            coyoteRequest.setServerPort(Integer.parseInt(value.substring(i + 1)));
        } else {
            coyoteRequest.serverName().setString(value);
        }
    }
package sandipchitale.twowaytlsclient.twowaytlsclient;
import jakarta.servlet.*;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletRequestWrapper;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.http.HttpHeaders;
import java.io.IOException;
// Ptofile(HTTPS)
@ConditionalOnProperty(name = "server.http2.enabled", havingValue = "true")
@Configuration
@Order(Ordered.HIGHEST_PRECEDENCE)
public class HttpHeaderModificationConfig implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
final HttpServletRequest req = (HttpServletRequest) request;
if (req.getHeader(HttpHeaders.HOST) == null) {
// modify HTTP Request Header
final HttpServletRequestWrapper reqWrapper = new HttpServletRequestWrapper(req) {
@Override
public String getHeader(String name) {
if (HttpHeaders.HOST.equals(name)) {
if (req.getServerPort() == -1) {
return req.getServerName();
}
return String.format(":authority: %s:%d", req.getServerName(), req.getServerPort());
}
return super.getHeader(name);
}
};
chain.doFilter(reqWrapper, response);
return;
}
chain.doFilter(req, response);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment