package com.fcar.frameworks.net.http;
import com.fcar.frameworks.core.GlobalVar;
import java.io.IOException;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
/**
* Created by carl on 2016/4/25.
*/
public abstract class HttpMethod {
/**
* 下载或缓存http请求到的文件的根目录
*/
public static final String BASE_PATH = GlobalVar.getFcarPath() + "/update";
protected String url;
protected Set<HttpHeader> headers;
public HttpMethod(String httpUrl) {
this.url = httpUrl;
this.headers = new HashSet<>();
}
public HttpMethod(String httpUrl, String params) {
this(httpUrl + "?" + params);
}
@SuppressWarnings("Duplicates")
public void addHeader(String header, List<String> value) {
StringBuilder sb = new StringBuilder();
Iterator<String> iterator = value.iterator();
if (!iterator.hasNext()) {
headers.add(new HttpHeader(header, ""));
return;
}
do {
sb.append(iterator.next());
if (!iterator.hasNext())
break;
sb.append(' ');
} while (true);
headers.add(new HttpHeader(header, sb.toString()));
}
public void addHeader(String header, String value) {
headers.add(new HttpHeader(header, value));
}
public void addHeader(HttpHeader httpHeader) {
headers.add(httpHeader);
}
public String getHttpUrl() {
return url;
}
public void setHttpUrl(String httpUrl) {
this.url = httpUrl;
}
public abstract String getMethodName();
/**
* 执行Http方法
*/
public abstract HttpResponse execute() throws IOException;
/**
* 获取http版本,注意版本是大小写敏感的
* @return http版本
*/
public String getHttpVersion() {
return "HTTP/1.1";
}
public String getRequestLine() {
return getMethodName() + ' ' +
url + ' ' +
getHttpVersion() + "\r\n";
}
}
package com.fcar.frameworks.net.http;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URL;
import java.net.URLConnection;
import java.util.List;
import java.util.Map;
/**
* 该类会将请求内容接收完毕还存在一个文件上以后才返回
* Created by carl on 2016/4/25.
*/
public class GetMethod extends HttpMethod {
public GetMethod(String httpUrl) {
super(httpUrl);
}
public GetMethod(String httpUrl, String params) {
super(httpUrl, params);
}
@Override
public String getMethodName() {
return "GET";
}
@Override
public HttpResponse execute() throws IOException {
BufferedInputStream bis = null;
FileOutputStream fos = null;
BufferedOutputStream bos = null;
HttpResponse response = null;
try {
URL realUrl = new URL(url);
// 打开和URL之间的连接
URLConnection connection = realUrl.openConnection();
// 设置通用的请求属性
for (HttpHeader httpHeader : headers) {
connection.setRequestProperty(httpHeader.getHeaderName(), httpHeader.getHeaderValue());
}
// 建立实际的连接
connection.connect();
response = new HttpResponse();
// 获取所有响应头字段
Map<String, List<String>> map = connection.getHeaderFields();
for (Map.Entry<String, List<String>> entry : map.entrySet()) {
response.addHeader(entry.getKey(), entry.getValue());
}
System.out.println(connection.getURL());
byte[] buffer = new byte[4096];
String fileName = connection.getURL().toString().replace("http://", ""); // url去掉http://
int index = fileName.indexOf('/'); // 找到第一个/
if (index < 0) {
// 不存在,即页面地址为 http://www.example.com
// 令文件名为 index.html
fileName = fileName + '/' + "index.html";
} else if (index == fileName.length() - 1) {
// 页面地址为 http://www.example.com/
// 令文件名为 index.html
fileName = fileName + "index.html";
} else {
fileName = FileNameUtil.normalizeFileName(fileName);
}
File cacheFile = new File(BASE_PATH + "/" + fileName);
response.setContent(cacheFile);
//noinspection ResultOfMethodCallIgnored
cacheFile.getParentFile().mkdirs();
bis = new BufferedInputStream(connection.getInputStream());
fos = new FileOutputStream(cacheFile);
bos = new BufferedOutputStream(fos);
int count;
// 定义 BufferedReader输入流来读取URL的响应
while ((count = bis.read(buffer)) != -1) {
bos.write(buffer, 0, count);
}
} finally {
try {
if (bos != null)
bos.close();
if (fos != null)
fos.close();
if (bis != null)
bis.close();
} catch (Exception ignore) {
}
}
return response;
}
}
package com.fcar.frameworks.net.http;
/**
* Created by carl on 2016/4/26.
*/
public class HttpHeader {
private String headerName;
private String headerValue;
public HttpHeader(String headerName, String headerValue) {
this.headerName = headerName;
this.headerValue = headerValue;
}
public String getHeaderValue() {
return headerValue;
}
public void setHeaderValue(String headerValue) {
this.headerValue = headerValue;
}
public String getHeaderName() {
return headerName;
}
public void setHeaderName(String headerName) {
this.headerName = headerName;
}
public static class ContentTypeHeader extends HttpHeader {
public ContentTypeHeader(String headerValue) {
super("Content-Type", headerValue);
}
}
public static class ContentLengthHeader extends HttpHeader {
public ContentLengthHeader(String headerValue) {
super("Content-Length", headerValue);
}
}
public static class DateHeader extends HttpHeader {
public DateHeader(String headerValue) {
super("Date", headerValue);
}
}
public static class ConnectionHeader extends HttpHeader {
public ConnectionHeader(String headerValue) {
super("Connection", headerValue);
}
}
public static class KeepAliveHeader extends HttpHeader {
public KeepAliveHeader(String headerValue) {
super("Keep-Alive", headerValue);
}
}
public static class ExpiresHeader extends HttpHeader {
public ExpiresHeader(String headerValue) {
super("Expires", headerValue);
}
}
public static class CacheControlHeader extends HttpHeader {
public CacheControlHeader(String headerValue) {
super("Cache-Control", headerValue);
}
}
public static class AcceptRangesHeader extends HttpHeader {
public AcceptRangesHeader(String headerValue) {
super("Accept-Ranges", headerValue);
}
}
public static class EtagHeader extends HttpHeader {
public EtagHeader(String headerValue) {
super("ETag", headerValue);
}
}
public static class LastModifiedHeader extends HttpHeader {
public LastModifiedHeader(String headerValue) {
super("Last-Modified", headerValue);
}
}
public static class ServerHeader extends HttpHeader {
public ServerHeader(String headerValue) {
super("Server", headerValue);
}
}
public static class UserAgentHeader extends HttpHeader {
public UserAgentHeader(String headerValue) {
super("User-Agent", headerValue);
}
}
public static class HostHeader extends HttpHeader {
public HostHeader(String headerValue) {
super("Host", headerValue);
}
}
public static class AcceptHeader extends HttpHeader {
public AcceptHeader(String headerValue) {
super("Accept", headerValue);
}
}
public static class AcceptLanguageHeader extends HttpHeader {
public AcceptLanguageHeader(String headerValue) {
super("Accept-Language", headerValue);
}
}
public static class AcceptEncodingHeader extends HttpHeader {
public AcceptEncodingHeader(String headerValue) {
super("Accept-Encoding", headerValue);
}
}
public static class RefererHeader extends HttpHeader {
public RefererHeader(String headerValue) {
super("Referer", headerValue);
}
}
public static class IfNoneMatchHeader extends HttpHeader {
public IfNoneMatchHeader(String headerValue) {
super("If-None-Match", headerValue);
}
}
public static class IfModifiedSinceHeader extends HttpHeader {
public IfModifiedSinceHeader(String headerValue) {
super("If-Modified-Since", headerValue);
}
}
public static class UpgradeInsecureRequestsHeader extends HttpHeader {
public UpgradeInsecureRequestsHeader(String headerValue) {
super("Upgrade-Insecure-Requests", headerValue);
}
}
public static class CookieHeader extends HttpHeader {
public CookieHeader(String headerValue) {
super("Cookie", headerValue);
}
}
}
package com.fcar.frameworks.net.http;
import java.io.File;
import java.util.*;
/**
* Created by carl on 2016/4/25.
*/
public class HttpResponse {
/**
* 状态行
*/
private String status;
/**
* 消息头
*/
private Set<HttpHeader> headers;
/**
* Http正文
*/
private File content;
public HttpResponse() {
status = "";
content = null;
headers = new HashSet<>();
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public Set<HttpHeader> getHeaders() {
return headers;
}
public void setHeaders(Set<HttpHeader> headers) {
this.headers = headers;
}
public File getContent() {
return content;
}
public void setContent(File content) {
this.content = content;
}
public void addHeader(String header, String value) {
headers.add(new HttpHeader(header, value));
}
public void addHeader(HttpHeader httpHeader) {
headers.add(httpHeader);
}
@SuppressWarnings("Duplicates")
public void addHeader(String header, List<String> value) {
StringBuilder sb = new StringBuilder();
Iterator<String> iterator = value.iterator();
if (!iterator.hasNext()) {
headers.add(new HttpHeader(header, ""));
return;
}
do {
sb.append(iterator.next());
if (!iterator.hasNext())
break;
sb.append(' ');
} while (true);
headers.add(new HttpHeader(header, sb.toString()));
}
}
package com.fcar.frameworks.net.http;
/**
* Created by carl on 2016/4/26.
*/
public class FileNameUtil {
/**
* 文件名中有九个字符不能出现: /\:"?><|*,<br/>
* 该方法是将这些字符转换为其它字符的方法。<br/>
* 考虑到@符号使用比较少,因此该方法使用@作为转义符,对应关系如下:<br/>
* <table boarder="1">
* <tr><th>原始字符</th><th>转义符</th></tr>
* <!--tr><td align="center">/</td><td align="center">@s</td></tr-->
* <!--tr><td align="center">\</td><td align="center">@b</td></tr-->
* <tr><td align="center">:</td><td align="center">@c</td></tr>
* <tr><td align="center">"</td><td align="center">@q</td></tr>
* <tr><td align="center">?</td><td align="center">@a</td></tr>
* <tr><td align="center">></td><td align="center">@g</td></tr>
* <tr><td align="center"><</td><td align="center">@l</td></tr>
* <tr><td align="center">|</td><td align="center">@v</td></tr>
* <tr><td align="center">*</td><td align="center">@w</td></tr>
* <tr><td align="center">@</td><td align="center">@@</td></tr>
* <tr><td align="center">其它符号</td><td align="center">@其它符号 或者 不转义</td></tr>
* </table>
* @param string
* @return
*/
public static String normalizeFileName(String string) {
StringBuilder sb = new StringBuilder();
int len = string.length();
for (int i = 0; i < len; ++i) {
switch (string.charAt(i)) {
// case '/':
// sb.append("@s");
// break;
// case '\\':
// sb.append("@b");
// break;
case '*':
sb.append("@w");
break;
case '"':
sb.append("@q");
break;
case '?':
sb.append("@a");
break;
case ':':
sb.append("@c");
break;
case '<':
sb.append("@l");
break;
case '>':
sb.append("@g");
break;
case '|':
sb.append("@v");
break;
case '@':
sb.append("@@");
break;
default:
sb.append(string.charAt(i));
}
}
return sb.toString();
}
public static String orignalString(String fileName) {
StringBuilder sb = new StringBuilder();
int len = fileName.length();
for (int i = 0; i < len; ++i) {
char ch = fileName.charAt(i);
if (ch == '@') {
i++;
char ch2 = fileName.charAt(i);
switch (ch2) {
// case 's':
// sb.append('/');
// break;
// case 'b':
// sb.append('\\');
// break;
case 'w':
sb.append('*');
break;
case 'q':
sb.append('"');
break;
case 'a':
sb.append('?');
break;
case 'c':
sb.append(':');
break;
case 'l':
sb.append('<');
break;
case 'g':
sb.append('>');
break;
case 'v':
sb.append('|');
break;
case '@':
sb.append('@');
break;
default:
sb.append(ch2);
}
} else {
sb.append(ch);
}
}
return sb.toString();
}
}