Detecting HTTPS requests
Background
Your application runs behind a load balancer which does all the request handling
to your (optionally) scaled application. The communication between the load
balancer and your application (specifically the web container(s) within your
application) is carried out via HTTP and you are not able to detect a HTTPS
request via standard methods of your web framework.
That is why the HTTP headers of the external request are enriched with
a X-Forwarded-Proto header (among others) by the load balancer and handed
over to your web container(s).
You would then check if the header value contains https to detect a HTTPS
request.
Simple Go example
package main
import (
  "fmt"
  "log"
  "net/http"
  "os"
)
func isHTTPS(req *http.Request) bool {
  return req.Header.Get("X-Forwarded-Proto") == "https" || req.URL.Scheme == "https"
}
func main() {
  http.HandleFunc("/", func(res http.ResponseWriter, req *http.Request) {
    if isHTTPS(req) {
      log.Println("HTTPS is used, connection is secured.")
    } else {
      log.Println("HTTP is used, you should envisage using HTTPS.")
    }
    fmt.Fprintf(res, "Hello World\n")
  })
  log.Fatalln(http.ListenAndServe(":" + os.Getenv("PORT"), nil))
}
Simple Java+Wicket example
public class RequestUtil {
	private static final Logger log = LoggerFactory.getLogger(RequestUtil.class);
	public static boolean isSecure() {
		return isSecureScalingo() || isSecureRegular();
	}
	private static boolean isSecureScalingo() {
		final HttpServletRequest servletRequest = getServletRequest();
		if (null == servletRequest) {
			return false;
		}
		final String header = servletRequest.getHeader("X-Forwarded-Proto");
		return !Strings.isEmpty(header) && "https".equalsIgnoreCase(header);
	}
	private static boolean isSecureRegular() {
		final HttpServletRequest servletRequest = getServletRequest();
		return null != servletRequest ? servletRequest.isSecure() : false;
	}
	@Nullable
	public static HttpServletRequest getServletRequest() {
		final Object containerRequest = RequestCycle.get().getRequest().getContainerRequest();
		if (containerRequest instanceof HttpServletRequest) {
			return ((HttpServletRequest) containerRequest);
		} else {
			log.warn("Current request is no HttpServletRequest! (" + containerRequest + ")");
			return null;
		}
	}
}
          
             Last update: 23 Aug 2024 
          
          
            
            Suggest edits