⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 httpmethodbase.java

📁 Light in the box 抓取程序。 使用HttpClient
💻 JAVA
📖 第 1 页 / 共 5 页
字号:
        addHostRequestHeader(state, conn);        addCookieRequestHeader(state, conn);        addProxyConnectionHeader(state, conn);    }    /**     * Generates default <tt>User-Agent</tt> request header, as long as no     * <tt>User-Agent</tt> request header already exists.     *     * @param state the {@link HttpState state} information associated with this method     * @param conn the {@link HttpConnection connection} used to execute     *        this HTTP method     *     * @throws IOException if an I/O (transport) error occurs. Some transport exceptions     *                     can be recovered from.     * @throws HttpException  if a protocol exception occurs. Usually protocol exceptions      *                    cannot be recovered from.     */    protected void addUserAgentRequestHeader(HttpState state,                                             HttpConnection conn)    throws IOException, HttpException {        LOG.trace("enter HttpMethodBase.addUserAgentRequestHeaders(HttpState, "            + "HttpConnection)");        if (getRequestHeader("User-Agent") == null) {            String agent = (String)getParams().getParameter(HttpMethodParams.USER_AGENT);            if (agent == null) {                agent = "Jakarta Commons-HttpClient";            }            setRequestHeader("User-Agent", agent);        }    }    /**     * Throws an {@link IllegalStateException} if the HTTP method has been already     * {@link #execute executed}, but not {@link #recycle recycled}.     *     * @throws IllegalStateException if the method has been used and not     *      recycled     */    protected void checkNotUsed() throws IllegalStateException {        if (used) {            throw new IllegalStateException("Already used.");        }    }    /**     * Throws an {@link IllegalStateException} if the HTTP method has not been     * {@link #execute executed} since last {@link #recycle recycle}.     *     *     * @throws IllegalStateException if not used     */    protected void checkUsed()  throws IllegalStateException {        if (!used) {            throw new IllegalStateException("Not Used.");        }    }    // ------------------------------------------------- Static Utility Methods    /**     * Generates HTTP request line according to the specified attributes.     *     * @param connection the {@link HttpConnection connection} used to execute     *        this HTTP method     * @param name the method name generate a request for     * @param requestPath the path string for the request     * @param query the query string for the request     * @param version the protocol version to use (e.g. HTTP/1.0)     *     * @return HTTP request line     */    protected static String generateRequestLine(HttpConnection connection,        String name, String requestPath, String query, String version) {        LOG.trace("enter HttpMethodBase.generateRequestLine(HttpConnection, "            + "String, String, String, String)");        StringBuffer buf = new StringBuffer();        // Append method name        buf.append(name);        buf.append(" ");        // Absolute or relative URL?        if (!connection.isTransparent()) {            Protocol protocol = connection.getProtocol();            buf.append(protocol.getScheme().toLowerCase());            buf.append("://");            buf.append(connection.getHost());            if ((connection.getPort() != -1)                 && (connection.getPort() != protocol.getDefaultPort())            ) {                buf.append(":");                buf.append(connection.getPort());            }        }        // Append path, if any        if (requestPath == null) {            buf.append("/");        } else {            if (!connection.isTransparent() && !requestPath.startsWith("/")) {                buf.append("/");            }            buf.append(requestPath);        }        // Append query, if any        if (query != null) {            if (query.indexOf("?") != 0) {                buf.append("?");            }            buf.append(query);        }        // Append protocol        buf.append(" ");        buf.append(version);        buf.append("\r\n");                return buf.toString();    }        /**     * This method is invoked immediately after      * {@link #readResponseBody(HttpState,HttpConnection)} and can be overridden by     * sub-classes in order to provide custom body processing.     *     * <p>     * This implementation does nothing.     * </p>     *     * @param state the {@link HttpState state} information associated with this method     * @param conn the {@link HttpConnection connection} used to execute     *        this HTTP method     *     * @see #readResponse     * @see #readResponseBody     */    protected void processResponseBody(HttpState state, HttpConnection conn) {    }    /**     * This method is invoked immediately after      * {@link #readResponseHeaders(HttpState,HttpConnection)} and can be overridden by     * sub-classes in order to provide custom response headers processing.     * <p>     * This implementation will handle the <tt>Set-Cookie</tt> and     * <tt>Set-Cookie2</tt> headers, if any, adding the relevant cookies to     * the given {@link HttpState}.     * </p>     *     * @param state the {@link HttpState state} information associated with this method     * @param conn the {@link HttpConnection connection} used to execute     *        this HTTP method     *     * @see #readResponse     * @see #readResponseHeaders     */    protected void processResponseHeaders(HttpState state,        HttpConnection conn) {        LOG.trace("enter HttpMethodBase.processResponseHeaders(HttpState, "            + "HttpConnection)");        CookieSpec parser = getCookieSpec(state);        // process set-cookie headers        Header[] headers = getResponseHeaderGroup().getHeaders("set-cookie");        processCookieHeaders(parser, headers, state, conn);        // see if the cookie spec supports cookie versioning.        if (parser instanceof CookieVersionSupport) {            CookieVersionSupport versupport = (CookieVersionSupport) parser;            if (versupport.getVersion() > 0) {                // process set-cookie2 headers.                // Cookie2 will replace equivalent Cookie instances                headers = getResponseHeaderGroup().getHeaders("set-cookie2");                processCookieHeaders(parser, headers, state, conn);            }        }    }    /**     * This method processes the specified cookie headers. It is invoked from     * within {@link #processResponseHeaders(HttpState,HttpConnection)}     *     * @param headers cookie {@link Header}s to be processed     * @param state the {@link HttpState state} information associated with     *        this HTTP method     * @param conn the {@link HttpConnection connection} used to execute     *        this HTTP method     */    protected void processCookieHeaders(            final CookieSpec parser,             final Header[] headers,             final HttpState state,             final HttpConnection conn) {        LOG.trace("enter HttpMethodBase.processCookieHeaders(Header[], HttpState, "                  + "HttpConnection)");        String host = this.params.getVirtualHost();        if (host == null) {            host = conn.getHost();        }        for (int i = 0; i < headers.length; i++) {            Header header = headers[i];            Cookie[] cookies = null;            try {                cookies = parser.parse(                  host,                  conn.getPort(),                  getPath(),                  conn.isSecure(),                  header);            } catch (MalformedCookieException e) {                if (LOG.isWarnEnabled()) {                    LOG.warn("Invalid cookie header: \""                         + header.getValue()                         + "\". " + e.getMessage());                }            }            if (cookies != null) {                for (int j = 0; j < cookies.length; j++) {                    Cookie cookie = cookies[j];                    try {                        parser.validate(                          host,                          conn.getPort(),                          getPath(),                          conn.isSecure(),                          cookie);                        state.addCookie(cookie);                        if (LOG.isDebugEnabled()) {                            LOG.debug("Cookie accepted: \""                                 + parser.formatCookie(cookie) + "\"");                        }                    } catch (MalformedCookieException e) {                        if (LOG.isWarnEnabled()) {                            LOG.warn("Cookie rejected: \"" + parser.formatCookie(cookie)                                 + "\". " + e.getMessage());                        }                    }                }            }        }    }    /**     * This method is invoked immediately after      * {@link #readStatusLine(HttpState,HttpConnection)} and can be overridden by     * sub-classes in order to provide custom response status line processing.     *     * @param state the {@link HttpState state} information associated with this method     * @param conn the {@link HttpConnection connection} used to execute     *        this HTTP method     *     * @see #readResponse     * @see #readStatusLine     */    protected void processStatusLine(HttpState state, HttpConnection conn) {    }    /**     * Reads the response from the given {@link HttpConnection connection}.     *     * <p>     * The response is processed as the following sequence of actions:     *     * <ol>     * <li>     * {@link #readStatusLine(HttpState,HttpConnection)} is     * invoked to read the request line.     * </li>     * <li>     * {@link #processStatusLine(HttpState,HttpConnection)}     * is invoked, allowing the method to process the status line if     * desired.     * </li>     * <li>     * {@link #readResponseHeaders(HttpState,HttpConnection)} is invoked to read     * the associated headers.     * </li>     * <li>     * {@link #processResponseHeaders(HttpState,HttpConnection)} is invoked, allowing     * the method to process the headers if desired.     * </li>     * <li>     * {@link #readResponseBody(HttpState,HttpConnection)} is     * invoked to read the associated body (if any).     * </li>     * <li>     * {@link #processResponseBody(HttpState,HttpConnection)} is invoked, allowing the     * method to process the response body if desired.     * </li>     * </ol>     *     * Subclasses may want to override one or more of the above methods to to     * customize the processing. (Or they may choose to override this method     * if dramatically different processing is required.)     * </p>     *     * @param state the {@link HttpState state} information associated with this method     * @param conn the {@link HttpConnection connection} used to execute     *        this HTTP method     *     * @throws IOException if an I/O (transport) error occurs. Some transport exceptions     *                     can be recovered from.     * @throws HttpException  if a protocol exception occurs. Usually protocol exceptions      *                    cannot be recovered from.     */    protected void readResponse(HttpState state, HttpConnection conn)    throws IOException, HttpException {        LOG.trace(        "enter HttpMethodBase.readResponse(HttpState, HttpConnection)");        // Status line & line may have already been received        // if 'expect - continue' handshake has been used        while (this.statusLine == null) {            readStatusLine(state, conn);            processStatusLine(state, conn);            readResponseHeaders(state, conn);            processResponseHeaders(state, conn);                        int status = this.statusLine.getStatusCode();            if ((status >= 100) && (status < 200)) {                if (LOG.isInfoEnabled()) {                    LOG.info("Discarding unexpected response: " + this.statusLine.toString());                 }                this.statusLine = null;            }        }        readResponseBody(state, conn);        processResponseBody(state, conn);    }    /**     * Read the response body from the given {@link HttpConnection}.     *     * <p>     * The current implementation wraps the socket level stream with     * an appropriate stream for the type of response (chunked, content-length,     * or auto-close).  If there is no response body, the connection associated     * with the request will be returned to the connection manager.     * </p>     *     * <p>     * Subclasses may want to override this method to to customize the     * processing.     * </p>     *     * @param state the {@link HttpState state} information associated with this method     * @param conn the {@link HttpConnection connection} used to execute     *        this HTTP method     *     * @throws IOException if an I/O (tr

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -