package act; /*- * #%L * ACT Framework * %% * Copyright (C) 2014 - 2017 ActFramework * %% * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * #L% */ import act.conf.AppConfig; import org.osgl.$; import org.osgl.http.H; import org.osgl.util.E; import org.osgl.util.FastStr; import org.osgl.util.S; public abstract class RequestImplBase<T extends H.Request> extends H.Request<T> { private AppConfig cfg; private H.Method method; private Boolean secure; protected RequestImplBase(AppConfig config) { E.NPE(config); cfg = config; } protected abstract H.Method _method(); @Override public String contextPath() { return ""; } @Override public T method(H.Method method) { this.method = $.NPE(method); return me(); } @Override public H.Method method() { if (null == method) { method = _method(); if (method == H.Method.POST) { // check the method overload String s = header(H.Header.Names.X_HTTP_METHOD_OVERRIDE); if (S.blank(s)) { s = paramVal("_method"); // Spring use this } if (S.notBlank(s)) { method = H.Method.valueOfIgnoreCase(s); } } } return method; } @Override public boolean secure() { if (null == secure) { if ("https".equals(cfg.xForwardedProtocol())) { secure = true; } else { secure = parseSecureXHeaders(); } } return secure; } private boolean parseSecureXHeaders() { String s = header(H.Header.Names.X_FORWARDED_PROTO); if ("https".equals(s)) { return true; } s = header(H.Header.Names.X_FORWARDED_SSL); if ("on".equals(s)) { return true; } s = header(H.Header.Names.FRONT_END_HTTPS); if ("on".equals(s)) { return true; } s = header(H.Header.Names.X_URL_SCHEME); if ("https".equals(s)) { return true; } return false; } }