httpurlconnection.java

来自「很棒的web服务器源代码」· Java 代码 · 共 277 行

JAVA
277
字号
// HttpURLConnection.java// $Id: HttpURLConnection.java,v 1.20 2002/07/25 17:45:29 ylafon Exp $// (c) COPYRIGHT MIT and INRIA, 1996.// Please first read the full copyright statement in file COPYRIGHT.htmlpackage org.w3c.www.protocol.http ;import java.net.MalformedURLException;import java.net.URL;import java.net.URLConnection;import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.util.Enumeration;import org.w3c.www.mime.MimeType;import org.w3c.www.http.HeaderDescription;import org.w3c.www.http.HttpEntityMessage;import org.w3c.www.http.HttpMessage;import org.w3c.www.http.HttpReplyMessage;import org.w3c.www.http.HttpRequestMessage;public class HttpURLConnection extends java.net.HttpURLConnection {    protected Request               request = null;    protected Reply                 reply   = null;    protected ByteArrayOutputStream output  = null;    protected final synchronized void checkRequest() {	if ( request == null ) {	    request = HttpManager.getManager().createRequest();	    request.setMethod(method);	    if ( ifModifiedSince > 0 )		request.setIfModifiedSince(ifModifiedSince*1000);	    if ( ! useCaches ) {		request.addPragma("no-cache");		request.setNoCache();	    }	    request.setURL(url);	}    }    protected final void checkReply() {	if ((reply == null) && connected) {	    error("Was connected but didn't get any reply !");	} else if ( ! connected ) {	    try {		connect();	    } catch (IOException ex) {		ex.printStackTrace();		error("Error while silently connecting.");	    }	}    }    protected void error(String msg) {	debug("ERROR \""+msg+"\"");	throw new RuntimeException(msg);    }    protected final void debug(String m) {	//	System.out.println("[http]: "	//		   + ((request != null)	//	           ? ":"+request.getURL().toExternalForm()+"]: "	//  	           : "]: ")	//		   + m);    }    public boolean usingProxy() {	return HttpManager.getManager().usingProxy();    }    public synchronized void disconnect() {	if ( request != null )	    request.interruptRequest();    }    public void connect() 	throws IOException    {	// Check if we have already connected ourself:	debug("connect");	if ( connected )	    return;	// Check for a valid request, and update stream if needed:	checkRequest();	if ( doOutput ) {	    byte                 data[] = output.toByteArray();	    ByteArrayInputStream in     = new ByteArrayInputStream(data);	    request.setOutputStream(in);	    if ( ! request.hasHeader(Request.H_CONTENT_LENGTH) )		request.setContentLength(data.length);	    if ( ! request.hasHeader(Request.H_CONTENT_TYPE) ) {		MimeType t = (request.getMethod().equals("POST")			      ? MimeType.APPLICATION_X_WWW_FORM_URLENCODED			      : MimeType.TEXT_PLAIN);		request.setContentType(t);	    }	}	try {	    // Run the reply, handling redirection:	    int redirects = 0;	  redir:	    while ( redirects < 5 ) {		if ( redirects == 1 ) {		    // Reinit the request, cope with URLConnnection brokeness		    request.setOutputStream(null);		    request.setContentLength(-1);		    request.setMethod("GET");		}		reply = request.getManager().runRequest(request);		// Take care of redirects:		if ((reply.getStatus() / 100) == 3) {		    String reloc = reply.getLocation();		    if ( reloc == null )			break redir;		    reply.getInputStream().close();		    URL orig = request.getURL();		    try {			url = new URL(orig, reloc);			request.setURL(url);		    } catch (MalformedURLException ex) {			break redir;		    }		} else {		    break redir;		}		if ( ! getFollowRedirects() )		    break redir;		redirects++;	    }	} catch (HttpException ex) {	    ex.printStackTrace();	    throw new IOException(ex.getMessage());	}	connected = true;    }    public int getResponseCode() 	throws IOException    {	checkReply();	return reply.getStatus();    }    public int getContentLength() {	checkReply();	return reply.getContentLength();    }    public String getContentType() {	checkReply();	MimeType t = reply.getContentType();	if (t == null) {	    return null;	}	return t.toString();    }        public long getExpiration() {	checkReply();	return reply.getExpires();    }    public long getDate() {	checkReply();	return reply.getDate();    }    public long getLastModified() {	checkReply();	return reply.getLastModified();    }    public String getHeaderField(String name) {	checkReply();	return reply.getValue(name);    }    public String getHeaderFieldKey(int n) {	Enumeration       e = reply.enumerateHeaderDescriptions(true);	HeaderDescription d = null;	while ( --n >= 0 ) {	    if ( e.hasMoreElements() )		d = (HeaderDescription) e.nextElement();	    return null;	}	if ( d != null ) 	    return d.getName();	return null;     }    public String getHeaderField(int n) {	String key = getHeaderFieldKey(n);	if ( key != null )	    return reply.getValue(key);	return null;    }    public InputStream getInputStream() 	throws IOException    {	debug("getInputStream");	checkReply();	return reply.getInputStream();    }    public OutputStream getOutputStream() 	throws IOException    {	debug("getOutputStream");	// We can still catch some of the deficiencies here:	if ((! connected) && (! doOutput)) {	    setDoOutput(true);	} else if ( connected ) {	    error("Already connected, too late for getOutputStream.");	}	// Now return a fake output stream:	// I am really ashame of this (having to buffer the data before 	// emiting it), but I cannot see any better way of using this	// broken API (?)	output = new ByteArrayOutputStream();	return output;    }    public InputStream getErrorStream() {	debug("getErrorStream");	try {	    int errorCat = reply.getStatus()/100 ;	    if (connected && (errorCat == 4 || errorCat == 5)) {		return reply.getInputStream() ;	    }	    // the next catch the case where there is no reply	    // as well as errors while handling the reply (no useful info...)	} catch (Exception ex) {	    return null;	}	return null;    }    public void setRequestProperty(String key, String value) {	checkRequest();	request.setValue(key, value);    }    public String getRequestProperty(String key) {	checkRequest();	return request.getValue(key);    }	    public static void setGlobalRequestProperty(String key, String value) {	HttpManager.getManager().setGlobalHeader(key, value);    }    public static String getDefaultRequestProperty(String key) {	return HttpManager.getManager().getGlobalHeader(key);    }    public void setDoOutput(boolean doinput) {	debug("DoOutput !!");	super.setDoOutput(doinput);	checkRequest();	if ( request.getContentType() == null )	    request.setContentType(MimeType.APPLICATION_X_WWW_FORM_URLENCODED);    }    HttpURLConnection(URL u) {	super(u) ;    }}

⌨️ 快捷键说明

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