All Downloads are FREE. Search and download functionalities are using the official Maven repository.

nablarch.fw.web.HttpRequest Maven / Gradle / Ivy

The newest version!
package nablarch.fw.web;

import nablarch.core.repository.SystemRepository;
import nablarch.core.util.annotation.Published;
import nablarch.core.validation.Validatable;
import nablarch.fw.Request;
import nablarch.fw.web.upload.PartInfo;
import nablarch.fw.web.useragent.UserAgent;
import nablarch.fw.web.useragent.UserAgentParser;

import java.util.Collections;
import java.util.List;
import java.util.Map;

/**
 * HTTP/1.1(RFC2616)におけるリクエストメッセージのパーサ及び
 * その結果を格納するデータオブジェクト。
 *
 * @author Iwauo Tajima 
 */
public abstract class HttpRequest implements Request, Validatable {

    /** デフォルトの{@link UserAgentParser}実装クラス */
    private static final UserAgentParser DEFAULT_USER_AGENT_PARSER = new UserAgentParser() {
        @Override
        public UserAgent parse(final String userAgentText) {
            return new UserAgent(userAgentText);
        }
    };

    /** HTTPリクエストURI */
    private String requestUri;

    /** マルチパート */
    private Map> multipart = Collections.emptyMap();

    /**
     * HTTPリクエストメソッド名を返す。
     *
     * @return リクエストメソッド名
     */
    @Published
    public abstract String getMethod();

    /**
     * HTTPリクエストURIを返す。
     *
     * @return リクエストURI
     */
    @Published
    public String getRequestUri() {
        return requestUri;
    }

    /**
     * HTTPリクエストURIを設定する。
     *
     * @param requestUri リクエストURI
     * @return 本オブジェクト
     */
    public HttpRequest setRequestUri(final String requestUri) {
        this.requestUri = requestUri.trim();
        return this;
    }

    /**
     * HTTPリクエストURIのパス部分(クエリストリングを除いた部分)を返す。
     *
     * @return HTTPリクエストURIのパス部分
     */
    @Published
    public String getRequestPath() {
        return requestUri.replaceFirst("[?;].*$", "");
    }

    /**
     * リクエストパスを設定する。
     * 

* この実装では、リクエストURI中のリクエストパスを書き換える。 * * @param requestPath リクエストパス * @return 本オブジェクト */ @Published(tag = "architect") public HttpRequest setRequestPath(final String requestPath) { String dollarEscaped = requestPath.replace("$", "\\$"); String uri = requestUri.replaceFirst("^(.+?)(\\?[^?]*)?$", dollarEscaped + "$2"); setRequestUri(uri); return this; } /** * HTTPバージョン名を返す。 * * @return HTTPバージョン名 */ @Published public abstract String getHttpVersion(); /** * リクエストパラメータのMapを返す。 *

     * HTTPリクエストメッセージ中の以下のパラメータを格納したMapを返す。
     *   1. リクエストURI中のクエリパラメータ
     *   2. メッセージボディ内のPOSTパラメータ
     * パラメータ名は重複する可能性があるので、値の型はString[]で定義されている。
     * 
* * @return リクエストパラメータのMap */ @Published(tag = "architect") public abstract Map getParamMap(); /** * リクエストパラメータを取得する。 * * @param name パラメータ名 * @return パラメータの値 * @see #getParamMap() */ @Published(tag = "architect") public abstract String[] getParam(String name); /** * リクエストパラメータを設定する。 * * @param name パラメータ名 * @param params パラメータの値 * @return 本オブジェクト */ @Published public abstract HttpRequest setParam(String name, String... params); /** * リクエストパラメータを設定する。 * * @param params リクエストパラメータのMap * @return 本オブジェクト */ @Published(tag = "architect") public abstract HttpRequest setParamMap(Map params); /** * HTTPリクエストヘッダを格納したMapを取得する。 * * @return HTTPリクエストヘッダのMap */ @Published public abstract Map getHeaderMap(); /** * HTTPリクエストヘッダの値を返す。 * * @param headerName リクエストヘッダ名 * @return HTTPリクエストヘッダの値 */ @Published public abstract String getHeader(String headerName); /** * HTTPリクエストのホストヘッダを取得する。 * * @return ホストヘッダ */ @Published public String getHost() { return getHeader("Host"); } /** * 本リクエストで送信されるクッキー情報を取得する。 * * @return クッキー情報オブジェクト */ @Published(tag = "architect") public abstract HttpCookie getCookie(); /** * マルチパートの一部を取得する。 *

* 引数で指定した名称に合致するパートが存在しない場合、空のリストが返却される。 * * @param name 名称(inputタグのname属性) * @return マルチパート */ @Published public List getPart(final String name) { final List list = multipart.get(name); return (list == null) ? Collections.emptyList() : list; } /** * マルチパートを設定する。 * * @param multipart マルチパート */ @Published(tag = "architect") public void setMultipart(Map> multipart) { if (multipart == null) { multipart = Collections.emptyMap(); } this.multipart = multipart; } /** * 本HTTPリクエストの全マルチパートを取得する。 *

* 戻り値のMapの構造を以下に示す。 *

*
キー
*
名称(inputタグのname属性)
*
*
キーのname属性でアップロードされたマルチパート
*
* * @return 全マルチパート * @see #getPart(String) */ @Published public Map> getMultipart() { return multipart; } /** * UserAgent情報を取得する。 *

* HTTPヘッダ("User-Agent")よりUser-Agent文字列を取得し、 * {@link SystemRepository}に設定された{@link UserAgentParser}(コンポーネント名"userAgentParser")で解析を行う。 *
* パーサーが取得できない場合は、 * 全ての項目にデフォルト値が設定された{@link UserAgent}オブジェクトが返却される。 * * @param userAgentの型 * @return UserAgentオブジェクト */ @Published public UA getUserAgent() { final String userAgentText = getHeader("User-Agent"); final UserAgentParser parser = getUserAgentParser(); return (UA) parser.parse(userAgentText); } /** * {@link UserAgentParser}実装クラスのインスタンスを取得する。 * * @return {@link UserAgentParser}実装クラスのインスタンス */ private UserAgentParser getUserAgentParser() { final UserAgentParser registered = SystemRepository.get("userAgentParser"); return registered != null ? registered : DEFAULT_USER_AGENT_PARSER; } }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy