首页 > 技术文章 > Java Http解析器

evoc 2020-08-23 22:56 原文

阅读本源码,请先掌握Http协议本身

1 Http解析器

 1 package waf.net.http.httpparser;
 2 
 3 
 4 /**
 5  * 
 6  * @author waf.wang
 7  *
 8  */
 9 public class HttpParser
10 {
11     public static HttpResponse parse(byte[] headAndBody)
12     {
13         String endLine="\r\n";
14         
15         
16         HttpHeader header=HeaderParse.parse(headAndBody);
17         HttpBody body=BodyParser.parse(header, headAndBody);
18         
19         HttpResponse resp=new HttpResponse();
20         resp.setBody(body);
21         resp.setHeader(header);
22         resp.setContent(headAndBody);
23         
24         return resp;
25         
26     }
27     
28     private static String filterCharset(String charset)
29     {
30         String ret="";
31         
32         if(charset.toLowerCase().equalsIgnoreCase("utf-8"))
33         {
34             ret="utf-8";
35         }
36         else if(charset.toLowerCase().indexOf("gb")>=0)
37         {
38             ret="gbk";
39         }
40         else 
41         {
42             ret="utf-8";
43         }    
44         
45         return ret;
46     }
47     
48 }
View Code

 

2 Http协议体解析器

 1 package waf.net.http.httpparser;
 2 
 3 import waf.convert.Conv;
 4 import waf.lang.StringUtil;
 5 import waf.util.zip.GZip;
 6 
 7 /**
 8  * 
 9  * @author waf.wang
10  *
11  */
12 public class BodyParser
13 {
14     
15     public static HttpBody parse(HttpHeader header,byte[] headAndBody)
16     {
17         String bodyHex=StringUtil.subStringToEnd(Conv.bytes2Hex(headAndBody),Conv.bytes2Hex("\r\n\r\n".getBytes()));
18         byte[] bodyBytes=Conv.hex2Bytes(bodyHex);
19         String bodyText="";
20         
21         
22         String charset="";
23         if(header.getContentTypeCharset().equalsIgnoreCase("utf-8"))
24         {
25             charset="utf-8";
26         }
27         else if(header.getContentTypeCharset().indexOf("GB")>=0)
28         {
29             charset="gbk";
30         }
31         else 
32         {
33             charset="utf-8";
34         }        
35         if(header.isGzip())
36         {
37             bodyText=GZip.uncompress(bodyBytes, charset);
38         }
39         else 
40         {
41             bodyText=Conv.bytes2String(bodyBytes, charset);
42         }
43         
44         HttpBody body=new HttpBody();
45         body.setText(bodyText);
46         body.setBytes(Conv.str2bytes(bodyText, charset));
47         
48         body.setCharset(header.getContentTypeCharset());
49     
50         return body;
51     }
52 }
View Code

 

3 Http协议头解析

 1 package waf.net.http.httpparser;
 2 
 3 import waf.convert.Conv;
 4 import waf.lang.StringUtil;
 5 
 6 /**
 7  * 
 8  * @author waf.wang
 9  *
10  */
11 
12 public class HeaderParse
13 {
14     public static HttpHeader parse(byte[] bytes)
15     {
16         String resp=Conv.bytes2String(bytes, "utf-8");
17         String headerText=StringUtil.subStringFromBegin(resp,Constants.endLine+Constants.endLine)+Constants.endLine;
18         
19         String contentEncoding=StringUtil.subString(headerText,"Content-Encoding"+Constants.afterKey, Constants.endLine);
20         String contentType=StringUtil.subString(headerText,"Content-Type"+Constants.afterKey, Constants.endLine);
21         String contentTypeCharset=StringUtil.subString(headerText,"charset=", Constants.endLine);
22         String sessionId=StringUtil.subString(headerText,"sessionId"+Constants.afterKey, Constants.endLine);
23         String setCookie=StringUtil.subString(headerText,"Set-Cookie"+Constants.afterKey, Constants.endLine);
24         
25         int m=0;
26 
27         HttpHeader header=new HttpHeader();
28         header.setContentEncoding(contentEncoding);
29         header.setContentType(contentType);
30         header.setContentTypeCharset(contentTypeCharset);
31         header.setSessionId(sessionId);
32         header.setSetCookie(setCookie);
33         header.setText(headerText);
34         
35         return header;
36     }
37     
38 }
View Code

 

4 Http协议体对象

 1 package waf.net.http.httpparser;
 2 
 3 /**
 4  * 
 5  * @author waf.wang
 6  *
 7  */
 8 
 9 public class HttpBody
10 {
11     private String charset="";
12     
13     private byte[] bytes=null;
14     
15     private String text=null;
16 
17     public byte[] getBytes()
18     {
19         return bytes;
20     }
21 
22     public void setBytes(byte[] bytes)
23     {
24         this.bytes = bytes;
25     }
26 
27     public String getText()
28     {
29         return text;
30     }
31 
32     public void setText(String text)
33     {
34         this.text = text;
35     }
36 
37     public String getCharset()
38     {
39         return charset;
40     }
41 
42     public void setCharset(String charset)
43     {
44         this.charset = charset;
45     }
46     
47     
48 }
View Code

 

5 Http响应对象

 1 package waf.net.http.httpparser;
 2 
 3 /**
 4  * 
 5  * @author waf.wang
 6  *
 7  */
 8 
 9 public class HttpResponse
10 {
11     private byte[] content=null;
12     
13     
14     HttpHeader header=new HttpHeader();
15     HttpBody body=new HttpBody();
16     public byte[] getContent()
17     {
18         return content;
19     }
20     public void setContent(byte[] content)
21     {
22         this.content = content;
23     }
24     public HttpHeader getHeader()
25     {
26         return header;
27     }
28     public void setHeader(HttpHeader header)
29     {
30         this.header = header;
31     }
32     public HttpBody getBody()
33     {
34         return body;
35     }
36     public void setBody(HttpBody body)
37     {
38         this.body = body;
39     }
40     
41     
42     
43     
44 }
View Code

 

推荐阅读