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

📄 httpurlconnection.java

📁 SMS SDK classes.This is the archive that must be included in the classpath.
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
     * @return the header name, or null if not that many headers.
     */
    public String getHeaderFieldKey(int n)
    {
	if (hdr_keys == null)
	    fill_hdr_arrays();

	if (n >= 0  &&  n < hdr_keys.length)
	    return hdr_keys[n];
	else
	    return null;
    }


    /**
     * Gets header value of the n-th header. Calls connect() if not connected.
     * The value of 0-th header is the Status-Line (e.g. "HTTP/1.1 200 Ok").
     *
     * @param n which header to return.
     * @return the header value, or null if not that many headers.
     */
    public String getHeaderField(int n)
    {
	if (hdr_values == null)
	    fill_hdr_arrays();

	if (n >= 0  &&  n < hdr_values.length)
	    return hdr_values[n];
	else
	    return null;
    }


    /**
     * Cache the list of headers.
     */
    private void fill_hdr_arrays()
    {
	try
	{
	    if (!connected)  connect();

	    // count number of headers
	    int num = 1;
	    Enumeration enum = resp.listHeaders();
	    while (enum.hasMoreElements())
	    {
		num++;
		enum.nextElement();
	    }

	    // allocate arrays
	    hdr_keys   = new String[num];
	    hdr_values = new String[num];

	    // fill arrays
	    enum = resp.listHeaders();
	    for (int idx=1; idx<num; idx++)
	    {
		hdr_keys[idx]   = (String) enum.nextElement();
		hdr_values[idx] = resp.getHeader(hdr_keys[idx]);
	    }

	    // the 0'th field is special
	    hdr_values[0] = resp.getVersion() + " " + resp.getStatusCode() +
			    " " + resp.getReasonLine();
	}
	catch (Exception e)
	    { hdr_keys = hdr_values = new String[0]; }
    }


    /**
     * Gets an input stream from which the data in the response may be read.
     * Calls connect() if not connected.
     *
     * @return an InputStream
     * @exception ProtocolException if input not enabled.
     * @see java.net.URLConnection#setDoInput(boolean)
     */
    public InputStream getInputStream()  throws IOException
    {
	if (!doInput)
	    throw new ProtocolException("Input not enabled! (use setDoInput(true))");

	if (!connected)  connect();

	InputStream stream;
	try
	{
	    stream = resp.getInputStream();

	    if (resp.pe != null  &&  resp.getHeader("Content-length") != null)
	    {
		try
		    { stream = new sun.net.www.MeteredStream(stream, resp.pe); }
		catch (Throwable t)
		{
		    Log.write(Log.URLC, "URLC:  (" + urlString +
					") error trying to create metered stream: ", t);
		}
	    }
	    else
		// some things expect this stream to support mark/reset
		stream = new BufferedInputStream(stream);
	}
	catch (ModuleException e)
	    { throw new IOException(e.toString()); }

	return stream;
    }


    /**
     * Returns the error stream if the connection failed
     * but the server sent useful data nonetheless.
     *
     * <P>This method will not cause a connection to be initiated.
     *
     * @return an InputStream, or null if either the connection hasn't
     *         been established yet or no error occured
     * @see java.net.HttpURLConnection#getErrorStream()
     * @since V0.3-1
     */
    public InputStream getErrorStream()
    {
	try
	{
	    if (!doInput  ||  !connected  ||  resp.getStatusCode() < 300  ||
		resp.getHeaderAsInt("Content-length") <= 0)
		return null;

	    return resp.getInputStream();
	}
	catch (Exception e)
	    { return null; }
    }


    /**
     * Gets an output stream which can be used send an entity with the
     * request. Can be called multiple times, in which case always the
     * same stream is returned.
     *
     * <P>The default request method changes to "POST" when this method is
     * called. Cannot be called after connect().
     *
     * <P>If no Content-type has been set it defaults to
     * <var>application/x-www-form-urlencoded</var>. Furthermore, if the
     * Content-type is <var>application/x-www-form-urlencoded</var> then all
     * output will be collected in a buffer before sending it to the server;
     * otherwise an HttpOutputStream is used.
     *
     * @return an OutputStream
     * @exception ProtocolException if already connect()'ed, if output is not
     *                              enabled or if the request method does not
     *                              support output.
     * @see java.net.URLConnection#setDoOutput(boolean)
     * @see HTTPClient.HttpOutputStream
     */
    public synchronized OutputStream getOutputStream()  throws IOException
    {
	if (connected)
	    throw new ProtocolException("Already connected!");

	if (!doOutput)
	    throw new ProtocolException("Output not enabled! (use setDoOutput(true))");
	if (!method_set)
	    method = "POST";
	else if (method.equals("HEAD")  ||  method.equals("GET")  ||
		 method.equals("TRACE"))
	    throw new ProtocolException("Method "+method+" does not support output!");

	if (getRequestProperty("Content-type") == null)
	    setRequestProperty("Content-type", "application/x-www-form-urlencoded");

	if (output_stream == null)
	{
	    Log.write(Log.URLC, "URLC:  (" + urlString + ") creating output stream");

	    String cl = getRequestProperty("Content-Length");
	    if (cl != null)
		output_stream = new HttpOutputStream(Integer.parseInt(cl.trim()));
	    else
	    {
		// Hack: because of restrictions when using true output streams
		// and because form-data is usually quite limited in size, we
		// first collect all data before sending it if this is
		// form-data.
		if (getRequestProperty("Content-type").equals(
			"application/x-www-form-urlencoded"))
		    output_stream = new ByteArrayOutputStream(300);
		else
		    output_stream = new HttpOutputStream();
	    }

	    if (output_stream instanceof HttpOutputStream)
		connect();
	}

	return output_stream;
    }


    /**
     * Gets the url for this connection. If we're connect()'d and the request
     * was redirected then the url returned is that of the final request.
     *
     * @return the final url, or null if any exception occured.
     */
    public URL getURL()
    {
	if (connected)
	{
	    try
	    {
		if (resp.getEffectiveURL() != null)
		    return resp.getEffectiveURL();
	    }
	    catch (Exception e)
		{ return null; }
	}

	return url;
    }


    /**
     * Sets the <var>If-Modified-Since</var> header.
     *
     * @param time the number of milliseconds since 1970.
     */
    public void setIfModifiedSince(long time)
    {
	super.setIfModifiedSince(time);
	setRequestProperty("If-Modified-Since", Util.httpDate(new Date(time)));
    }


    /**
     * Sets an arbitrary request header.
     *
     * @param name  the name of the header.
     * @param value the value for the header.
     */
    public void setRequestProperty(String name, String value)
    {
	Log.write(Log.URLC, "URLC:  (" + urlString + ") Setting request property: " +
			    name + " : " + value);

	int idx;
	for (idx=0; idx<headers.length; idx++)
	{
	    if (headers[idx].getName().equalsIgnoreCase(name))
		break;
	}

	if (idx == headers.length)
	    headers = Util.resizeArray(headers, idx+1);

	headers[idx] = new NVPair(name, value);
    }


    /**
     * Gets the value of a given request header.
     *
     * @param name  the name of the header.
     * @return the value part of the header, or null if no such header.
     */
    public String getRequestProperty(String name)
    {
	for (int idx=0; idx<headers.length; idx++)
	{
	    if (headers[idx].getName().equalsIgnoreCase(name))
		return headers[idx].getValue();
	}

	return null;
    }


    /**
     * Sets an arbitrary default request header. All headers set here are
     * automatically sent with each request.
     *
     * @param name  the name of the header.
     * @param value the value for the header.
     */
    public static void setDefaultRequestProperty(String name, String value)
    {
	Log.write(Log.URLC, "URLC:  Setting default request property: " +
			    name + " : " + value);

	int idx;
	for (idx=0; idx<default_headers.length; idx++)
	{
	    if (default_headers[idx].getName().equalsIgnoreCase(name))
		break;
	}

	if (idx == default_headers.length)
	    default_headers = Util.resizeArray(default_headers, idx+1);

	default_headers[idx] = new NVPair(name, value);
    }


    /**
     * Gets the value for a given default request header.
     *
     * @param name  the name of the header.
     * @return the value part of the header, or null if no such header.
     */
    public static String getDefaultRequestProperty(String name)
    {
	for (int idx=0; idx<default_headers.length; idx++)
	{
	    if (default_headers[idx].getName().equalsIgnoreCase(name))
		return default_headers[idx].getValue();
	}

	return null;
    }


    /**
     * Enables or disables the automatic handling of redirection responses
     * for this instance only. Cannot be called after <code>connect()</code>.
     *
     * @param set enables automatic redirection handling if true.
     */
    public void setInstanceFollowRedirects(boolean set)
    {
	if (connected)
	    throw new IllegalStateException("Already connected!");

	do_redir = set;
    }


    /**
     * @return true if automatic redirection handling for this instance is
     *              enabled.
     */
    public boolean getInstanceFollowRedirects()
    {
	return do_redir;
    }


    /**
     * Connects to the server (if connection not still kept alive) and
     * issues the request.
     */
    public synchronized void connect()  throws IOException
    {
	if (connected)  return;

	Log.write(Log.URLC, "URLC:  (" + urlString + ") Connecting ...");

	// useCaches TBD!!!

	synchronized(con)
	{
	    con.setAllowUserInteraction(allowUserInteraction);
	    if (do_redir)
		con.addModule(redir_mod, 2);
	    else
		con.removeModule(redir_mod);

	    try
	    {
		if (output_stream instanceof ByteArrayOutputStream)
		    resp = con.ExtensionMethod(method, resource,
			((ByteArrayOutputStream) output_stream).toByteArray(),
					     headers);
		else
		    resp = con.ExtensionMethod(method, resource,
				    (HttpOutputStream) output_stream, headers);
	    }
	    catch (ModuleException e)
		{ throw new IOException(e.toString()); }
	}

	connected = true;

	try
	    { resp.setProgressEntry(new sun.net.ProgressEntry(url.getFile(), null)); }
	catch (Throwable t)
	{
	    Log.write(Log.URLC, "URLC:  (" + urlString +
				") error trying to create and set progress entry: ", t);
	}
    }


    /**
     * Closes all the connections to this server.
     */
    public void disconnect()
    {
	Log.write(Log.URLC, "URLC:  (" + urlString + ") Disconnecting ...");

	con.stop();

	if (resp != null)
	    resp.unsetProgressEntry();
    }


    public void finalize()
    {
	if (resp != null)
	    resp.unsetProgressEntry();

	super.finalize();
    }


    /**
     * Shows if request are being made through an http proxy or directly.
     *
     * @return true if an http proxy is being used.
     */
    public boolean usingProxy()
    {
	return (con.getProxyHost() != null);
    }


    /**
     * produces a string.
     * @return a string containing the HttpURLConnection
     */
    public String toString()
    {
	return getClass().getName() + "[" + url + "]";
    }
}

⌨️ 快捷键说明

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