Java tutorial
/* * Copyright (C) 2011 The Android Open Source Project, * * 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. */ package com.scut.easyfe.network.kjFrame.http; import org.apache.http.Header; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.ProtocolVersion; import org.apache.http.StatusLine; import org.apache.http.entity.BasicHttpEntity; import org.apache.http.message.BasicHeader; import org.apache.http.message.BasicHttpResponse; import org.apache.http.message.BasicStatusLine; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.SSLSocketFactory; /** * HttpUrlConnection? */ public class HttpConnectStack implements HttpStack { private static final String HEADER_CONTENT_TYPE = "Content-Type"; private final UrlRewriter mUrlRewriter; private final SSLSocketFactory mSslSocketFactory; public interface UrlRewriter { /** * ?URL */ public String rewriteUrl(String originalUrl); } public HttpConnectStack() { this(null); } public HttpConnectStack(UrlRewriter urlRewriter) { this(urlRewriter, null); } public HttpConnectStack(UrlRewriter urlRewriter, SSLSocketFactory sslSocketFactory) { mUrlRewriter = urlRewriter; mSslSocketFactory = sslSocketFactory; } @Override public HttpResponse performRequest(Request<?> request, Map<String, String> additionalHeaders) throws IOException { String url = request.getUrl(); HashMap<String, String> map = new HashMap<String, String>(); map.putAll(request.getHeaders()); map.putAll(additionalHeaders); if (mUrlRewriter != null) { String rewritten = mUrlRewriter.rewriteUrl(url); if (rewritten == null) { throw new IOException("URL blocked by rewriter: " + url); } url = rewritten; } URL parsedUrl = new URL(url); HttpURLConnection connection = openConnection(parsedUrl, request); for (String headerName : map.keySet()) { connection.addRequestProperty(headerName, map.get(headerName)); } setConnectionParametersForRequest(connection, request); ProtocolVersion protocolVersion = new ProtocolVersion("HTTP", 1, 1); int responseCode; try { responseCode = connection.getResponseCode(); } catch (IOException e) { // 4.1.x/4.2.x/4.3.x ? (WWW-Authenticate: Basic realm="XXX") // ??401 // java.io.IOException: No authentication challenges found // ?getResponseCode?? responseCode = connection.getResponseCode(); } if (responseCode == -1) { throw new IOException("Could not retrieve response code from HttpUrlConnection."); } StatusLine responseStatus = new BasicStatusLine(protocolVersion, connection.getResponseCode(), connection.getResponseMessage()); BasicHttpResponse response = new BasicHttpResponse(responseStatus); response.setEntity(entityFromConnection(connection)); for (Entry<String, List<String>> header : connection.getHeaderFields().entrySet()) { if (header.getKey() != null) { String value = ""; for (String v : header.getValue()) { value += (v + "; "); } Header h = new BasicHeader(header.getKey(), value); response.addHeader(h); } } return response; } /** * HttpurlConnectionHttpEntity */ private static HttpEntity entityFromConnection(HttpURLConnection connection) { BasicHttpEntity entity = new BasicHttpEntity(); InputStream inputStream; try { inputStream = connection.getInputStream(); } catch (IOException ioe) { inputStream = connection.getErrorStream(); } entity.setContent(inputStream); entity.setContentLength(connection.getContentLength()); entity.setContentEncoding(connection.getContentEncoding()); entity.setContentType(connection.getContentType()); return entity; } private HttpURLConnection openConnection(URL url, Request<?> request) throws IOException { HttpURLConnection connection = (HttpURLConnection) url.openConnection(); int timeoutMs = request.getTimeoutMs(); connection.setConnectTimeout(timeoutMs); connection.setReadTimeout(timeoutMs); connection.setUseCaches(false); connection.setDoInput(true); // use caller-provided custom SslSocketFactory, if any, for HTTPS if ("https".equals(url.getProtocol()) && mSslSocketFactory != null) { ((HttpsURLConnection) connection).setSSLSocketFactory(mSslSocketFactory); } return connection; } /* package */static void setConnectionParametersForRequest(HttpURLConnection connection, Request<?> request) throws IOException { switch (request.getMethod()) { case Request.HttpMethod.GET: connection.setRequestMethod("GET"); break; case Request.HttpMethod.DELETE: connection.setRequestMethod("DELETE"); break; case Request.HttpMethod.POST: connection.setRequestMethod("POST"); addBodyIfExists(connection, request); break; case Request.HttpMethod.PUT: connection.setRequestMethod("PUT"); addBodyIfExists(connection, request); break; case Request.HttpMethod.HEAD: connection.setRequestMethod("HEAD"); break; case Request.HttpMethod.OPTIONS: connection.setRequestMethod("OPTIONS"); break; case Request.HttpMethod.TRACE: connection.setRequestMethod("TRACE"); break; case Request.HttpMethod.PATCH: connection.setRequestMethod("PATCH"); addBodyIfExists(connection, request); break; default: throw new IllegalStateException("Unknown method type."); } } /** * body */ private static void addBodyIfExists(HttpURLConnection connection, Request<?> request) throws IOException { byte[] body = request.getBody(); if (body != null) { connection.setDoOutput(true); connection.addRequestProperty(HEADER_CONTENT_TYPE, request.getBodyContentType()); DataOutputStream out = new DataOutputStream(connection.getOutputStream()); out.write(body); out.close(); } } }