package com.wangyin.ak47.pipes.http; import com.wangyin.ak47.common.Ak47Constants; import com.wangyin.ak47.common.Logger; /** * 简单的HttpRequest实现 * Request = Request-Line *(( general-header | request-header | entity-header ) CRLF) CRLF [ message-body ] * * * * @author hannyu * */ public class SimpleHttpRequest extends SimpleHttpMessage { private static final Logger log = new Logger(SimpleHttpRequest.class); private String method = "GET"; // 默认1.0是为了避免 chunked编码,但现在已支持chunked,所以可以直接1.1了 private String httpVersion = "HTTP/1.1"; private String url = "/"; /** * A Simple Http Request with default params. */ public SimpleHttpRequest(){ this(null,null,null); addHeader("User-Agent", Ak47Constants.NAME+"/"+Ak47Constants.VERSION+ " ("+SimpleHttpRequest.class.getName()+")"); } /** * A Simple Http Request with given method and url. * * @param method Method in Request-Line * @param url Url in Request-Line */ public SimpleHttpRequest(String method, String url){ this(method, url, null); } /** * A Simple Http Request with given method, url and version. * * @param method Method in Request-Line * @param url Url in Request-Line * @param httpVersion Version in Request-Line */ public SimpleHttpRequest(String method, String url, String httpVersion){ setRequestLine(method, url, httpVersion); } /** * * @return Method in Request-Line */ public String getMethod() { return method; } /** * * @param method Method in Request-Line */ public void setMethod(String method) { this.method = method; updateStartLine(); } /** * * @return HttpVersion in Request-Line */ public String getHttpVersion() { return httpVersion; } /** * * @param httpVersion HttpVersion in Request-Line */ public void setHttpVersion(String httpVersion) { this.httpVersion = httpVersion; updateStartLine(); } /** * * @return Url in Request-Line */ public String getUrl() { return url; } /** * * @param url Url in Request-Line */ public void setUrl(String url) { this.url = url; updateStartLine(); } /** * set Request-Line * * @param method Method in Request-Line * @param url Url in Request-Line * @param httpVersion Version in Request-Line */ public void setRequestLine(String method, String url, String httpVersion){ this.method = method==null?this.method:method; this.url = url==null?this.url:url; this.httpVersion = httpVersion==null?this.httpVersion:httpVersion; updateStartLine(); } private void updateStartLine(){ setStartLine(this.method + " " + this.url + " " + this.httpVersion); } /** * 转化,如果格式不对则返回null * * @param shm SimpleHttpMessage * @return HttpRequest or null if Request-Line malformed */ public static SimpleHttpRequest valueOf(SimpleHttpMessage shm){ String startLine = shm.getStartLine(); String[] startLineItems = startLine.split(" ",3); if( startLineItems.length != 3 ){ log.warn("Malformed first line."); return null; }else if( !startLineItems[2].startsWith("HTTP") ){ log.warn("Malformed first line, may NOT http."); return null; } SimpleHttpRequest shr = new SimpleHttpRequest(); shr.setRequestLine(startLineItems[0], startLineItems[1], startLineItems[2]); shr.setHeaders(shm.getHeaders()); shr.setContent(shm.getContent()); return shr; } /** * Deep copy with Request-Line, headers and body. * * @param request HttpRequest */ public void copyOf(SimpleHttpRequest request){ this.setRequestLine(request.getMethod(), request.getUrl(), request.getHttpVersion()); this.setHeaders(request.getHeaders()); this.setContent(request.getContent()); } }