diff --git a/cache/tomcat.css b/cache/tomcat.css deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/lib/commons-codec-1.9.jar b/lib/commons-codec-1.9.jar deleted file mode 100755 index ef35f1c50d7c41278bc31f4b9fcfc8fbd708d55d..0000000000000000000000000000000000000000 Binary files a/lib/commons-codec-1.9.jar and /dev/null differ diff --git a/lib/commons-logging-1.2.jar b/lib/commons-logging-1.2.jar deleted file mode 100755 index 93a3b9f6db406c84e270e19b9a5e70f2e27ca513..0000000000000000000000000000000000000000 Binary files a/lib/commons-logging-1.2.jar and /dev/null differ diff --git a/lib/commons-pool-1.6.jar b/lib/commons-pool-1.6.jar deleted file mode 100755 index 72ca75a3e6eca2158a8c607b18572f3bd87bf24e..0000000000000000000000000000000000000000 Binary files a/lib/commons-pool-1.6.jar and /dev/null differ diff --git a/lib/commons-pool2-2.3.jar b/lib/commons-pool2-2.3.jar deleted file mode 100755 index 5219e1cc231c92d200246ee3a548ec1cbb6e4f69..0000000000000000000000000000000000000000 Binary files a/lib/commons-pool2-2.3.jar and /dev/null differ diff --git a/lib/fastjson-1.2.8.jar b/lib/fastjson-1.2.8.jar deleted file mode 100755 index 6ab160bac834201356e51d51a3f09229c169894f..0000000000000000000000000000000000000000 Binary files a/lib/fastjson-1.2.8.jar and /dev/null differ diff --git a/lib/hamcrest-core-1.3.jar b/lib/hamcrest-core-1.3.jar deleted file mode 100755 index 9d5fe16e3dd37ebe79a36f61f5d0e1a69a653a8a..0000000000000000000000000000000000000000 Binary files a/lib/hamcrest-core-1.3.jar and /dev/null differ diff --git a/lib/httpclient-4.5.1.jar b/lib/httpclient-4.5.1.jar deleted file mode 100755 index b9c0c1c25022117fc273a4ee1453b2c90893bf08..0000000000000000000000000000000000000000 Binary files a/lib/httpclient-4.5.1.jar and /dev/null differ diff --git a/lib/httpcore-4.4.3.jar b/lib/httpcore-4.4.3.jar deleted file mode 100755 index 9f91ef663e25f0a270a654e19b11fc66735de3bb..0000000000000000000000000000000000000000 Binary files a/lib/httpcore-4.4.3.jar and /dev/null differ diff --git a/lib/httpmime-4.5.1.jar b/lib/httpmime-4.5.1.jar deleted file mode 100755 index 53a6420129a7961477a15f18de546c4fd5cdd983..0000000000000000000000000000000000000000 Binary files a/lib/httpmime-4.5.1.jar and /dev/null differ diff --git a/lib/jedis-2.7.2.jar b/lib/jedis-2.7.2.jar deleted file mode 100755 index fcf2a5868f193a34313d301a416707567e95675f..0000000000000000000000000000000000000000 Binary files a/lib/jedis-2.7.2.jar and /dev/null differ diff --git a/lib/jnotify-0.94.jar b/lib/jnotify-0.94.jar deleted file mode 100644 index e17efadf4febd0d93fc8cf61372e92dbb798b5f7..0000000000000000000000000000000000000000 Binary files a/lib/jnotify-0.94.jar and /dev/null differ diff --git a/lib/junit-4.11.jar b/lib/junit-4.11.jar deleted file mode 100755 index aaf74448492932e95902b40a70c7a4da5bad4744..0000000000000000000000000000000000000000 Binary files a/lib/junit-4.11.jar and /dev/null differ diff --git a/lib/log4j-1.2.12.jar b/lib/log4j-1.2.12.jar deleted file mode 100755 index 9b5a720088596bf7baed37a28423ea8cca210f84..0000000000000000000000000000000000000000 Binary files a/lib/log4j-1.2.12.jar and /dev/null differ diff --git a/lib/netty-all-4.1.0.Beta5.jar b/lib/netty-all-4.1.0.Beta5.jar deleted file mode 100755 index 2797e16ece0746b67978312a84505e4573d0f52c..0000000000000000000000000000000000000000 Binary files a/lib/netty-all-4.1.0.Beta5.jar and /dev/null differ diff --git a/pom.xml b/pom.xml index 312f45eb484626be3f0c1860d78bbaff776fef4d..bb9a1fb8b727f8e9bfea8c86f23e47963120c8e9 100644 --- a/pom.xml +++ b/pom.xml @@ -37,7 +37,7 @@ io.netty netty-all - 4.1.0.Beta5 + 4.1.6.Final org.apache.httpcomponents @@ -52,6 +52,21 @@ + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.0 + + 1.7 + 1.7 + + + + + + diff --git a/src/main/java/org/code4j/jproxy/client/ProxyClient.java b/src/main/java/org/code4j/jproxy/client/ProxyClient.java index 95260326a6067e512760cc4153fa23a64316faa6..ada9e219216c38e526390acf466437f681fd746e 100644 --- a/src/main/java/org/code4j/jproxy/client/ProxyClient.java +++ b/src/main/java/org/code4j/jproxy/client/ProxyClient.java @@ -8,11 +8,11 @@ import io.netty.handler.codec.http.HttpHeaders; import org.apache.http.HttpEntity; import org.apache.http.HttpHost; import org.apache.http.NameValuePair; -import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.client.methods.HttpRequestBase; +import org.apache.http.entity.ByteArrayEntity; import org.apache.http.entity.ContentType; import org.apache.http.entity.StringEntity; import org.apache.http.entity.mime.HttpMultipartMode; @@ -22,6 +22,7 @@ import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.message.BasicNameValuePair; import org.apache.http.util.EntityUtils; +import org.apache.log4j.Logger; import org.code4j.jproxy.util.DiskUtil; import java.io.IOException; @@ -30,8 +31,6 @@ import java.net.URISyntaxException; import java.util.ArrayList; import java.util.List; import java.util.Map; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; /** * Description : @@ -41,6 +40,7 @@ import java.util.concurrent.Executors; public class ProxyClient{ + private static Logger log = Logger.getLogger(ProxyClient.class); CloseableHttpClient httpclient = HttpClients.createDefault(); CloseableHttpResponse response; @@ -79,7 +79,7 @@ public class ProxyClient{ CloseableHttpResponse response = null; try { response = httpclient.execute(httpGet); - System.out.println(httpGet.getURI()+" response code : "+response.getStatusLine().getStatusCode()); + log.info(httpGet.getURI() + " response code : " + response.getStatusLine().getStatusCode()); } catch (IOException e) { e.printStackTrace(); } @@ -101,7 +101,7 @@ public class ProxyClient{ setHeader(httpGet,headers); try { response = httpclient.execute(httpGet); - System.out.println(" response code : "+response.getStatusLine().getStatusCode()); + log.info(" response code : " + response.getStatusLine().getStatusCode()); } catch (IOException e) { e.printStackTrace(); } @@ -141,20 +141,20 @@ public class ProxyClient{ return builder.build(); } private void setHeader(HttpRequestBase httpRequest,HttpHeaders headers){ -// System.out.println("REQUEST header ---------------"); +// log.info("REQUEST header ---------------"); for (CharSequence name:headers.names()){ String n = name.toString(); boolean exclusive = n.equalsIgnoreCase("Content-Length")||n.equalsIgnoreCase("Referer") ||n.equalsIgnoreCase("If-Modified-Since")||n.equalsIgnoreCase("If-None-Match"); if ("Host".equalsIgnoreCase(name.toString())){ httpRequest.setHeader(name.toString(), HOST); -// System.out.println(name.toString() + ":" + headers.get(name).toString()); +// log.info(name.toString() + ":" + headers.get(name).toString()); } else if (!exclusive){ httpRequest.setHeader(name.toString(), headers.get(name).toString()); -// System.out.println(name.toString() + ":" + headers.get(name).toString()); +// log.info(name.toString() + ":" + headers.get(name).toString()); } } -// System.out.println("END header ---------------"); +// log.info("END header ---------------"); } public CloseableHttpResponse postJsonRequest(String json,HttpHeaders headers){ @@ -165,7 +165,7 @@ public class ProxyClient{ s = new StringEntity(json); httpPost.setEntity(s); response = httpclient.execute(httpPost); - System.out.println(" response code : " + response.getStatusLine().getStatusCode()); + log.info(" response code : " + response.getStatusLine().getStatusCode()); } catch (IOException e) { e.printStackTrace(); } @@ -178,20 +178,20 @@ public class ProxyClient{ try { httpPost.setEntity(setMultipartEntity(param)); response = httpclient.execute(httpPost); - System.out.println(" response code : " + response.getStatusLine().getStatusCode()); + log.info(" response code : " + response.getStatusLine().getStatusCode()); } catch (IOException e) { e.printStackTrace(); } return response; } - public CloseableHttpResponse postEntityRequest(Map param,HttpHeaders headers){ + public CloseableHttpResponse postEntityRequest(byte[] content,HttpHeaders headers){ setHeader(httpPost,headers); CloseableHttpResponse response = null; try { - httpPost.setEntity(new UrlEncodedFormEntity(setRequestData(param),"UTF-8")); + httpPost.setEntity(new ByteArrayEntity(content)); response = httpclient.execute(httpPost); - System.out.println(" response code : " + response.getStatusLine().getStatusCode()); + log.info(" response code : " + response.getStatusLine().getStatusCode()); } catch (IOException e) { e.printStackTrace(); } diff --git a/src/main/java/org/code4j/jproxy/crypt/EncryptUtil.java b/src/main/java/org/code4j/jproxy/crypt/EncryptUtil.java index 1a88306907b8c296b2cafc4bf991b4320cf6194d..ea70d24e19cf831e8f38759c2ea0f956dbe028ba 100644 --- a/src/main/java/org/code4j/jproxy/crypt/EncryptUtil.java +++ b/src/main/java/org/code4j/jproxy/crypt/EncryptUtil.java @@ -4,6 +4,8 @@ package org.code4j.jproxy.crypt;/** * 下午2:25 */ +import org.apache.log4j.Logger; + import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; @@ -15,6 +17,8 @@ import java.security.NoSuchAlgorithmException; public class EncryptUtil { + private static Logger log = Logger.getLogger(EncryptUtil.class); + public static final String SHA1 = "SHA-1"; public static final String SHA256 = "SHA-256"; public static final String MD5 = "MD5"; @@ -33,7 +37,7 @@ public class EncryptUtil { strDes=bytes2Hex(md.digest()); //to HexString } catch (NoSuchAlgorithmException e) { - System.out.println("Invalid algorithm."); + log.info("Invalid algorithm."); return null; } return strDes; diff --git a/src/main/java/org/code4j/jproxy/dao/RequestDataDao.java b/src/main/java/org/code4j/jproxy/dao/RequestDataDao.java index ce96c947960f2ad5cb07a0e0ca02469e5f461969..97ab72512ca4162d7a2e924b7a15c88f43dccb5e 100644 --- a/src/main/java/org/code4j/jproxy/dao/RequestDataDao.java +++ b/src/main/java/org/code4j/jproxy/dao/RequestDataDao.java @@ -4,6 +4,7 @@ package org.code4j.jproxy.dao;/** * 下午8:42 */ +import org.apache.log4j.Logger; import org.code4j.jproxy.crypt.EncryptUtil; import org.code4j.jproxy.util.JedisUtil; @@ -15,10 +16,12 @@ import org.code4j.jproxy.util.JedisUtil; public class RequestDataDao { + private static Logger log = Logger.getLogger(RequestDataDao.class); + public void save(String url,String param,String data){ String key = EncryptUtil.hash(url+param,EncryptUtil.SHA1); JedisUtil.set(key,data); - System.out.println("保存完,key="+key+" , value="+data); + log.info("保存完,key=" + key + " , value=" + data); } private boolean isHit(String key){ diff --git a/src/main/java/org/code4j/jproxy/handler/http/GetRequestHandler.java b/src/main/java/org/code4j/jproxy/handler/http/GetRequestHandler.java index 1007ac955a95bc2adb440dcf3aacf1de822a45b0..939062ea0037b8adf3249c92bb6ae7b944bcd1af 100644 --- a/src/main/java/org/code4j/jproxy/handler/http/GetRequestHandler.java +++ b/src/main/java/org/code4j/jproxy/handler/http/GetRequestHandler.java @@ -11,6 +11,7 @@ import io.netty.channel.ChannelInboundHandlerAdapter; import io.netty.handler.codec.http.*; import org.apache.http.Header; import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.log4j.Logger; import org.code4j.jproxy.client.ProxyClient; import org.code4j.jproxy.dao.RequestDataDao; import org.code4j.jproxy.server.IPSelector; @@ -18,8 +19,7 @@ import org.code4j.jproxy.util.WebUtil; import java.io.UnsupportedEncodingException; import java.net.InetSocketAddress; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; +import java.util.concurrent.*; /** * Description : CSSFilterHandler @@ -28,16 +28,19 @@ import java.util.concurrent.Executors; */ public class GetRequestHandler extends ChannelInboundHandlerAdapter { + + private static Logger log = Logger.getLogger(GetRequestHandler.class); + private InetSocketAddress address; private RequestDataDao dao = new RequestDataDao(); - private ExecutorService threadPool = Executors.newCachedThreadPool(); + private static ExecutorService threadPool = new ThreadPoolExecutor(5, 10, 30, TimeUnit.SECONDS, new LinkedBlockingQueue()); /** * 每次请求都重新获取一次地址 */ public void fetchInetAddress(){ this.address = IPSelector.weight(); - System.out.println("新获取的地址--> "+address.getHostName()+":"+address.getPort()); + log.info("新获取的地址--> " + address.getHostName() + ":" + address.getPort()); } @Override @@ -56,7 +59,7 @@ public class GetRequestHandler extends ChannelInboundHandlerAdapter { @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { - System.out.println("CSS 解析异常"); + log.info("CSS 解析异常"); cause.printStackTrace(); } @@ -64,12 +67,12 @@ public class GetRequestHandler extends ChannelInboundHandlerAdapter { ByteBuf byteBuf = Unpooled.wrappedBuffer(contents, 0, contents.length); FullHttpResponse response = new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK,byteBuf); - System.out.println("response header ---------------"); + log.info("response header ---------------"); for (Header header:headers){ response.headers().set(header.getName(),header.getValue()); - System.out.println(header.getName()+"::"+header.getValue()); + log.info(header.getName() + "::" + header.getValue()); } - System.out.println("end header ---------------"); + log.info("end header ---------------"); ctx.channel().writeAndFlush(response); ctx.close(); } @@ -103,7 +106,7 @@ public class GetRequestHandler extends ChannelInboundHandlerAdapter { fetchInetAddress(); ProxyClient client = new ProxyClient(address, WebUtil.ROOT.equals(request.uri())?"":request.uri()); if (isJSON){ - System.out.println("GET 业务请求"); + log.info("GET 业务请求"); //redis缓存 String cache = dao.get(request.uri(),""); if (cache == null ||cache.isEmpty()){ @@ -123,7 +126,7 @@ public class GetRequestHandler extends ChannelInboundHandlerAdapter { response(ctx, bytes, response.getAllHeaders()); } }else{ - System.out.println("非GET请求或JSON类型 "+request.uri()); + log.info("非GET请求或JSON类型 " + request.uri()); ctx.fireChannelRead(request); } }catch (Exception e){ diff --git a/src/main/java/org/code4j/jproxy/handler/http/ImageHandler.java b/src/main/java/org/code4j/jproxy/handler/http/ImageHandler.java index 027d5555fb9a603097772d86f35020db036d9be0..fed3f3ea406314bc85f1608b3fce1b8f29055c1d 100644 --- a/src/main/java/org/code4j/jproxy/handler/http/ImageHandler.java +++ b/src/main/java/org/code4j/jproxy/handler/http/ImageHandler.java @@ -11,14 +11,14 @@ import io.netty.channel.ChannelInboundHandlerAdapter; import io.netty.handler.codec.http.*; import org.apache.http.Header; import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.log4j.Logger; import org.code4j.jproxy.client.ProxyClient; import org.code4j.jproxy.server.IPSelector; import org.code4j.jproxy.util.WebUtil; import java.io.UnsupportedEncodingException; import java.net.InetSocketAddress; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; +import java.util.concurrent.*; import java.util.regex.Pattern; /** @@ -28,15 +28,16 @@ import java.util.regex.Pattern; */ public class ImageHandler extends ChannelInboundHandlerAdapter{ + private static Logger log = Logger.getLogger(ImageHandler.class); private InetSocketAddress address; - private ExecutorService threadPool = Executors.newCachedThreadPool(); + private static ExecutorService threadPool = new ThreadPoolExecutor(0, 5, 30, TimeUnit.SECONDS, new LinkedBlockingQueue()); /** * 每次请求都重新获取一次地址 */ public void fetchInetAddress(){ this.address = IPSelector.weight(); - System.out.println("新获取的地址--> "+address.getHostName()+":"+address.getPort()); + log.info("新获取的地址--> " + address.getHostName() + ":" + address.getPort()); } @Override @@ -63,12 +64,12 @@ public class ImageHandler extends ChannelInboundHandlerAdapter{ ByteBuf byteBuf = Unpooled.wrappedBuffer(contents, 0, contents.length); FullHttpResponse response = new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK,byteBuf); - System.out.println("response header ---------------"); + log.info("response header ---------------"); for (Header header:headers){ response.headers().set(header.getName(),header.getValue()); - System.out.println(header.getName()+"::"+header.getValue()); + log.info(header.getName() + "::" + header.getValue()); } - System.out.println("end header ---------------"); + log.info("end header ---------------"); ctx.channel().writeAndFlush(response); ctx.close(); } @@ -96,7 +97,7 @@ public class ImageHandler extends ChannelInboundHandlerAdapter{ fetchInetAddress(); ProxyClient client = new ProxyClient(address,WebUtil.ROOT.equals(request.uri())?"":request.uri()); //在这里强转类型,如果使用了聚合器,就会被阻塞 - System.out.println("读取到图片 " + request.uri()); + log.info("读取到图片 " + request.uri()); response = client.fetchImage(); bytes = client.getResponseBytes(response); response(ctx, bytes, response.getAllHeaders()); diff --git a/src/main/java/org/code4j/jproxy/handler/http/PostRequestHandler.java b/src/main/java/org/code4j/jproxy/handler/http/PostRequestHandler.java index 54fec68ac43c1289a5bc24c1b44daeb1a9bf4d9f..65ef02c6ec12a95b0b01658a8e050e7024228eb6 100644 --- a/src/main/java/org/code4j/jproxy/handler/http/PostRequestHandler.java +++ b/src/main/java/org/code4j/jproxy/handler/http/PostRequestHandler.java @@ -1,7 +1,7 @@ package org.code4j.jproxy.handler.http;/** - * Description : + * Description : * Created by YangZH on 16-6-3 - * 下午10:23 + * 下午10:23 */ import io.netty.buffer.ByteBuf; @@ -16,6 +16,7 @@ import io.netty.handler.codec.http.multipart.MemoryAttribute; import io.netty.util.CharsetUtil; import org.apache.http.Header; import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.log4j.Logger; import org.code4j.jproxy.client.ProxyClient; import org.code4j.jproxy.dao.RequestDataDao; import org.code4j.jproxy.server.IPSelector; @@ -24,9 +25,9 @@ import org.code4j.jproxy.util.WebUtil; import java.io.UnsupportedEncodingException; import java.net.InetSocketAddress; +import java.nio.charset.Charset; import java.util.List; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; +import java.util.concurrent.*; /** * Description : @@ -35,26 +36,28 @@ import java.util.concurrent.Executors; */ public class PostRequestHandler extends ChannelInboundHandlerAdapter { + private static Logger log = Logger.getLogger(PostRequestHandler.class); private InetSocketAddress address; private RequestDataDao dao = new RequestDataDao(); - private ExecutorService threadPool = Executors.newCachedThreadPool(); + private static ExecutorService threadPool = new ThreadPoolExecutor(5, 10, 30, TimeUnit.SECONDS, new LinkedBlockingQueue()); + /** * 每次请求都重新获取一次地址 */ - public void fetchInetAddress(){ + public void fetchInetAddress() { this.address = IPSelector.weight(); - System.out.println("新获取的地址--> "+address.getHostName()+":"+address.getPort()); + log.info("新获取的地址--> " + address.getHostName() + ":" + address.getPort()); } @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { - messageReceived(ctx,msg); + messageReceived(ctx, msg); } // @Override protected void messageReceived(ChannelHandlerContext ctx, Object msg) throws Exception { - threadPool.submit(new Task(ctx,msg)); + threadPool.submit(new Task(ctx, msg)); } @Override @@ -62,51 +65,52 @@ public class PostRequestHandler extends ChannelInboundHandlerAdapter { super.exceptionCaught(ctx, cause); } - private void response(ChannelHandlerContext ctx,byte[] contents,Header[] headers) throws UnsupportedEncodingException { + private void response(ChannelHandlerContext ctx, byte[] contents, Header[] headers) throws UnsupportedEncodingException { ByteBuf byteBuf = Unpooled.wrappedBuffer(contents, 0, contents.length); FullHttpResponse response = new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, - HttpResponseStatus.OK,byteBuf); - System.out.println("response header ---------------"); - for (Header header:headers){ - response.headers().set(header.getName(),header.getValue()); - System.out.println(header.getName()+"::"+header.getValue()); + HttpResponseStatus.OK, byteBuf); + log.info("response header ---------------"); + for (Header header : headers) { + response.headers().set(header.getName(), header.getValue()); + log.info(header.getName() + "::" + header.getValue()); } - System.out.println("end header ---------------"); + log.info("end header ---------------"); ctx.channel().writeAndFlush(response); ctx.close(); } - private void response(ChannelHandlerContext ctx,byte[] contents) throws UnsupportedEncodingException { + + private void response(ChannelHandlerContext ctx, byte[] contents) throws UnsupportedEncodingException { ByteBuf byteBuf = Unpooled.wrappedBuffer(contents, 0, contents.length); FullHttpResponse response = new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, - HttpResponseStatus.OK,byteBuf); - System.out.println("没有请求头,回写数据"); + HttpResponseStatus.OK, byteBuf); + log.info("没有请求头,回写数据"); ctx.channel().writeAndFlush(response); ctx.close(); } - class Task implements Runnable{ + class Task implements Runnable { Object msg; ChannelHandlerContext ctx; - public Task( ChannelHandlerContext ctx,Object msg) { + public Task(ChannelHandlerContext ctx, Object msg) { this.msg = msg; this.ctx = ctx; } @Override public void run() { - HttpRequest request = (HttpRequest)msg; + HttpRequest request = (HttpRequest) msg; try { - if (request.method().equals(HttpMethod.POST)){ + if (request.method().equals(HttpMethod.POST)) { fetchInetAddress(); CloseableHttpResponse response = null; - ProxyClient client = new ProxyClient(address, WebUtil.ROOT.equals(request.uri())?"":request.uri()); + ProxyClient client = new ProxyClient(address, WebUtil.ROOT.equals(request.uri()) ? "" : request.uri()); byte[] bytes = null; - System.out.println("POST 请求"); + log.info("POST 请求"); HttpPostRequestDecoder decoder = new HttpPostRequestDecoder(new DefaultHttpDataFactory(false), request); - if (decoder.isMultipart()){ - StringBuffer sb = new StringBuffer(); - try{ + if (decoder.isMultipart()) { + StringBuilder sb = new StringBuilder(); + try { String paramstr = null; List postList = decoder.getBodyHttpDatas(); // 读取从客户端传过来的参数 @@ -119,64 +123,66 @@ public class PostRequestHandler extends ChannelInboundHandlerAdapter { attribute.setCharset(CharsetUtil.UTF_8); value = attribute.getValue(); sb.append(name).append("=").append(value); - if (!(index == postList.size()-1)){ + if (!(index == postList.size() - 1)) { sb.append("&"); } } } paramstr = sb.toString(); //redis先查询,命中就不请求了。 - String cache = dao.get(request.uri(),paramstr); - if (cache == null ||cache.isEmpty()){ + String cache = dao.get(request.uri(), paramstr); + if (cache == null || cache.isEmpty()) { response = client.postMultipartEntityRequest(JSONUtil.requestParam(paramstr), request.headers()); String responseStr = client.getResponse(response); bytes = responseStr.getBytes(); response(ctx, bytes, response.getAllHeaders()); - }else{ + } else { response(ctx, cache.getBytes()); } - }catch (Exception e){ + } catch (Exception e) { e.printStackTrace(); } - }else if (request instanceof HttpContent) { + } else if (request instanceof HttpContent) { HttpContent httpContent = (HttpContent) request; - ByteBuf content = httpContent.content(); - String message = content.toString(io.netty.util.CharsetUtil.UTF_8); - if (JSONUtil.isJson(message)){ - System.out.println("json 数据"); - String cache = dao.get(request.uri(),message); - if (cache == null ||cache.isEmpty()){ - System.out.println("cache并没有命中!"); + ByteBuf contentBuf = httpContent.content(); + byte[] content = new byte[contentBuf.readableBytes()]; + contentBuf.readBytes(content); + String message = new String(content, Charset.forName("utf-8")); + if (JSONUtil.isJson(message)) { + log.info("json 数据"); + String cache = dao.get(request.uri(), message); + if (cache == null || cache.isEmpty()) { + log.info("cache并没有命中!"); response = client.postJsonRequest(message, request.headers()); String responseStr = client.getResponse(response); - dao.save(request.uri(),message,responseStr); + dao.save(request.uri(), message, responseStr); bytes = responseStr.getBytes(); response(ctx, bytes, response.getAllHeaders()); - }else{ - System.out.println("cache命中!"); + } else { + log.info("cache命中!"); response(ctx, cache.getBytes()); } - }else{ - System.out.println("key-value 数据"); - String cache = dao.get(request.uri(),message); - if (cache == null ||cache.isEmpty()){ - System.out.println("cache并没有命中!"); - response = client.postEntityRequest(JSONUtil.requestParam(message), request.headers()); + } else { + log.info("key-value 数据"); + String cache = dao.get(request.uri(), message); + if (cache == null || cache.isEmpty()) { + log.info("cache并没有命中!"); + response = client.postEntityRequest(content, request.headers()); String responseStr = client.getResponse(response); - dao.save(request.uri(),message,responseStr); + dao.save(request.uri(), message, responseStr); bytes = responseStr.getBytes(); response(ctx, bytes, response.getAllHeaders()); - }else { - System.out.println("cache命中!"); + } else { + log.info("cache命中!"); response(ctx, cache.getBytes()); } } } - }else{ - System.out.println("不是post请求"); + } else { + log.info("不是post请求"); } - }catch (Exception e){ - e.printStackTrace(); + } catch (Exception e) { + log.error(e); } } } diff --git a/src/main/java/org/code4j/jproxy/http/service/BasicHttpHandler.java b/src/main/java/org/code4j/jproxy/http/service/BasicHttpHandler.java index dbce3f37e14ef774152aa2ff14fbdd082ec86f3e..30d3b3c39a458a6b1b55ab92b7242b2e8fa051e1 100644 --- a/src/main/java/org/code4j/jproxy/http/service/BasicHttpHandler.java +++ b/src/main/java/org/code4j/jproxy/http/service/BasicHttpHandler.java @@ -1,101 +1,101 @@ -package org.code4j.jproxy.http.service; - -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.ChannelInboundHandlerAdapter; -import io.netty.handler.codec.http.FullHttpRequest; -import io.netty.handler.codec.http.FullHttpResponse; -import io.netty.handler.codec.http.HttpResponseStatus; -import org.apache.log4j.Logger; -import org.code4j.codecat.api.response.factory.HttpResponseFactory; -import org.code4j.codecat.commons.constants.Const; -import org.code4j.codecat.commons.util.JedisUtil; - -import java.io.File; - -/** - * Description : - * Created by code4j on 16-6-16 - * 下午7:46 - * - * 这个类继承了netty的业务handler,封装这个类是避免用户直接接触netty, - * 转而用codecat的api使用服务更加“简单” ( <— <— )| 但愿我能封装的好点 - */ - -public abstract class BasicHttpHandler extends ChannelInboundHandlerAdapter{ - - private Logger logger = Logger.getLogger(BasicHttpHandler.class); - - /** - * 提供给用户使用的业务方法 - * @param msg - */ - public abstract Object service(Object msg); - - @Override - public final void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { - FullHttpRequest request = (FullHttpRequest) msg; - String uri = getURI(request.uri()); - if (request.uri().equals(File.separator)){ - String result = String.valueOf(service(request.uri())); - responseTo(ctx, result, HttpResponseStatus.OK); - } - String root = getRoot(request.uri()); - logger.info("hash key? "+JedisUtil.hasKey(root)); - if (!JedisUtil.hasKey(root)){ - responseTo(ctx, Const.NOTFOUNG+"

no suitable jar!!

", HttpResponseStatus.NOT_FOUND); - } - if (this.getClass().isAnnotationPresent(Path.class)){ - Path path = this.getClass().getAnnotation(Path.class); - System.out.println(); - if (uri.equals(path.value())){ - String result = String.valueOf(service(request.uri())); - responseTo(ctx, result, HttpResponseStatus.OK); - }else if (ctx.pipeline().last() == this){ - responseTo(ctx, Const.NOTFOUNG+"

no suitable app!!

", HttpResponseStatus.NOT_FOUND); - }else{ - ctx.fireChannelRead(msg); - } - }else{ - ctx.fireChannelRead(msg); - } - } - - @Override - public final void channelReadComplete(ChannelHandlerContext ctx) throws Exception { - ctx.flush(); - ctx.close(); - } - - @Override - public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { - ctx.writeAndFlush(HttpResponseFactory.getResponse( - "

"+cause.getMessage()+"

", HttpResponseStatus.INTERNAL_SERVER_ERROR)); - ctx.close(); - cause.printStackTrace(); - } - - - private void responseTo(ChannelHandlerContext ctx,String content, HttpResponseStatus status){ - FullHttpResponse response = HttpResponseFactory.getResponse(content, status); - ctx.writeAndFlush(response); - ctx.close(); - } - - private String getURI(String url){ - if (url.equals(File.separator)){ - return File.separator; - } - String[] path_segement = url.split(File.separator); - String root_path = path_segement[1]; - return url.substring(root_path.lastIndexOf(root_path) + root_path.length()+1); - } - - - private String getRoot(String url){ - if (url == null||url.equals(File.separator)||url.isEmpty()){ - return "/"; - } - String[] path_segement = url.split(File.separator); - return path_segement[1]; - } -} +//package org.code4j.jproxy.http.service; +// +//import io.netty.channel.ChannelHandlerContext; +//import io.netty.channel.ChannelInboundHandlerAdapter; +//import io.netty.handler.codec.http.FullHttpRequest; +//import io.netty.handler.codec.http.FullHttpResponse; +//import io.netty.handler.codec.http.HttpResponseStatus; +//import org.apache.log4j.Logger; +//import org.code4j.codecat.api.response.factory.HttpResponseFactory; +//import org.code4j.codecat.commons.constants.Const; +//import org.code4j.codecat.commons.util.JedisUtil; +// +//import java.io.File; +// +///** +// * Description : +// * Created by code4j on 16-6-16 +// * 下午7:46 +// * +// * 这个类继承了netty的业务handler,封装这个类是避免用户直接接触netty, +// * 转而用codecat的api使用服务更加“简单” ( <— <— )| 但愿我能封装的好点 +// */ +// +//public abstract class BasicHttpHandler extends ChannelInboundHandlerAdapter{ +// +// private Logger logger = Logger.getLogger(BasicHttpHandler.class); +// +// /** +// * 提供给用户使用的业务方法 +// * @param msg +// */ +// public abstract Object service(Object msg); +// +// @Override +// public final void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { +// FullHttpRequest request = (FullHttpRequest) msg; +// String uri = getURI(request.uri()); +// if (request.uri().equals(File.separator)){ +// String result = String.valueOf(service(request.uri())); +// responseTo(ctx, result, HttpResponseStatus.OK); +// } +// String root = getRoot(request.uri()); +// logger.info("hash key? "+JedisUtil.hasKey(root)); +// if (!JedisUtil.hasKey(root)){ +// responseTo(ctx, Const.NOTFOUNG+"

no suitable jar!!

", HttpResponseStatus.NOT_FOUND); +// } +// if (this.getClass().isAnnotationPresent(Path.class)){ +// Path path = this.getClass().getAnnotation(Path.class); +// log.info(); +// if (uri.equals(path.value())){ +// String result = String.valueOf(service(request.uri())); +// responseTo(ctx, result, HttpResponseStatus.OK); +// }else if (ctx.pipeline().last() == this){ +// responseTo(ctx, Const.NOTFOUNG+"

no suitable app!!

", HttpResponseStatus.NOT_FOUND); +// }else{ +// ctx.fireChannelRead(msg); +// } +// }else{ +// ctx.fireChannelRead(msg); +// } +// } +// +// @Override +// public final void channelReadComplete(ChannelHandlerContext ctx) throws Exception { +// ctx.flush(); +// ctx.close(); +// } +// +// @Override +// public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { +// ctx.writeAndFlush(HttpResponseFactory.getResponse( +// "

"+cause.getMessage()+"

", HttpResponseStatus.INTERNAL_SERVER_ERROR)); +// ctx.close(); +// cause.printStackTrace(); +// } +// +// +// private void responseTo(ChannelHandlerContext ctx,String content, HttpResponseStatus status){ +// FullHttpResponse response = HttpResponseFactory.getResponse(content, status); +// ctx.writeAndFlush(response); +// ctx.close(); +// } +// +// private String getURI(String url){ +// if (url.equals(File.separator)){ +// return File.separator; +// } +// String[] path_segement = url.split(File.separator); +// String root_path = path_segement[1]; +// return url.substring(root_path.lastIndexOf(root_path) + root_path.length()+1); +// } +// +// +// private String getRoot(String url){ +// if (url == null||url.equals(File.separator)||url.isEmpty()){ +// return "/"; +// } +// String[] path_segement = url.split(File.separator); +// return path_segement[1]; +// } +//} diff --git a/src/main/java/org/code4j/jproxy/run/Main.java b/src/main/java/org/code4j/jproxy/run/Main.java index c1dfe2d044d24dbe18517675fc51a6097d64e333..0135b3a6e616650c6e229456705c999b2209a6a2 100644 --- a/src/main/java/org/code4j/jproxy/run/Main.java +++ b/src/main/java/org/code4j/jproxy/run/Main.java @@ -15,9 +15,6 @@ import org.code4j.jproxy.server.ProxyServer; public class Main { public static void main(String[] args) { -// System.out.println(Arrays.toString(MD5Util.getMD5("x"))); -// System.out.println(MD5Util.getMD5("x").length*8); -// System.out.println(Arrays.toString(new String(MD5Util.getMD5("x")).getBytes())); //开源中国要有WWW new Thread(new Runnable() { @Override diff --git a/src/main/java/org/code4j/jproxy/server/ProxyServer.java b/src/main/java/org/code4j/jproxy/server/ProxyServer.java index c3fcfe3e4390d0a90933eddd70a6e9273f2ca9b5..5c5a2354ef302578f4213038dbad6898a11dcffe 100644 --- a/src/main/java/org/code4j/jproxy/server/ProxyServer.java +++ b/src/main/java/org/code4j/jproxy/server/ProxyServer.java @@ -10,6 +10,7 @@ import io.netty.channel.ChannelOption; import io.netty.channel.EventLoopGroup; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioServerSocketChannel; +import org.apache.log4j.Logger; import org.code4j.jproxy.constans.Const; import org.code4j.jproxy.handler.ServerChildHandler; import org.code4j.jproxy.util.Configuration; @@ -22,6 +23,7 @@ import org.code4j.jproxy.util.Configuration; public class ProxyServer { + private static Logger log = Logger.getLogger(ProxyServer.class); public void startup(){ launch(Configuration.getIntValue(Const.LISTEN)); @@ -36,7 +38,7 @@ public class ProxyServer { } private void launch(int port){ - System.out.println("正在启动服务。。。"); + log.info("正在启动服务。。。"); EventLoopGroup bossGroup = new NioEventLoopGroup(); EventLoopGroup workerGroup = new NioEventLoopGroup(); ServerBootstrap b = new ServerBootstrap(); @@ -46,7 +48,7 @@ public class ProxyServer { .childHandler(new ServerChildHandler()) .option(ChannelOption.SO_BACKLOG, 256).childOption(ChannelOption.SO_KEEPALIVE, true); f = b.bind(port).sync(); - System.out.println("服务已启动"); + log.info("服务已启动"); f.channel().closeFuture().sync(); } catch (InterruptedException e) { e.printStackTrace(); diff --git a/src/main/java/org/code4j/jproxy/util/DiskUtil.java b/src/main/java/org/code4j/jproxy/util/DiskUtil.java index 7cc0e6a2c318a2e84cc36407655704e124cefc2a..1a1e3adb37e324d2ff7512615ff600b9872908b6 100644 --- a/src/main/java/org/code4j/jproxy/util/DiskUtil.java +++ b/src/main/java/org/code4j/jproxy/util/DiskUtil.java @@ -4,6 +4,8 @@ package org.code4j.jproxy.util;/** * 下午3:40 */ +import org.apache.log4j.Logger; + import java.io.File; import java.io.FileOutputStream; import java.io.IOException; @@ -18,8 +20,11 @@ import java.nio.channels.FileChannel; public class DiskUtil { + + private static Logger log = Logger.getLogger(DiskUtil.class); + public static void saveToDisk(String host,String uri,byte[] contents){ - System.out.println(uri+" 保存前的URI"); + log.info(uri + " 保存前的URI"); if (uri.equals(File.separator)){ uri = File.separator+"index"; }else if (uri.contains("?")){ diff --git a/src/main/java/org/code4j/jproxy/util/ImageUtil.java b/src/main/java/org/code4j/jproxy/util/ImageUtil.java index 57117ab0378edc89bcd6d9de1b8b8f053393c4f3..fabbf1eae563e8dc7c790ce133391f5662f06818 100644 --- a/src/main/java/org/code4j/jproxy/util/ImageUtil.java +++ b/src/main/java/org/code4j/jproxy/util/ImageUtil.java @@ -4,6 +4,8 @@ package org.code4j.jproxy.util;/** * 下午1:49 */ +import org.apache.log4j.Logger; + import javax.imageio.ImageIO; import javax.swing.*; import java.awt.*; @@ -18,6 +20,7 @@ import java.io.IOException; */ public class ImageUtil { + private static Logger log = Logger.getLogger(ImageUtil.class); public static boolean isImage(byte[] content){ try { @@ -25,10 +28,10 @@ public class ImageUtil { ImageIcon icon = new ImageIcon(content); Image imageIcon = icon.getImage(); if (image == null || imageIcon == null) { - System.out.println("假图片!!"); + log.info("假图片!!"); return false; } - System.out.println("high: " + image.getHeight()); + log.info("high: " + image.getHeight()); } catch(IOException ex) { return false; } diff --git a/src/main/java/org/code4j/jproxy/util/JSONUtil.java b/src/main/java/org/code4j/jproxy/util/JSONUtil.java index ce2c3aad1bdaf5abb821658db629841604b26a90..d48424f4417a0c8419f2b2166dfb51dd7d9a9e36 100644 --- a/src/main/java/org/code4j/jproxy/util/JSONUtil.java +++ b/src/main/java/org/code4j/jproxy/util/JSONUtil.java @@ -7,6 +7,7 @@ package org.code4j.jproxy.util;/** import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import org.apache.log4j.Logger; import java.util.HashMap; import java.util.List; @@ -20,6 +21,8 @@ import java.util.Map; public class JSONUtil { + private static Logger log = Logger.getLogger(JSONUtil.class); + public static List strToArray(String json){ return JSONArray.parseArray(json,String.class); } @@ -43,9 +46,9 @@ public class JSONUtil { } public static Map requestParam(String str){ - System.out.println("原生请求字符串-----------: \n"); - System.out.println(str); - System.out.println("原生请求字符串-----------: \n"); + log.info("原生请求字符串-----------: \n"); + log.info(str); + log.info("原生请求字符串-----------: \n"); String[] param = str.split("&"); Map params = new HashMap(); for (String p:param){ diff --git a/src/main/java/org/code4j/jproxy/util/JedisUtil.java b/src/main/java/org/code4j/jproxy/util/JedisUtil.java index 1b60f7e836431c7020e85f982b9a8c1fad6dab1f..eee1b67ba04ed51648a95bc65c9daf4813981067 100644 --- a/src/main/java/org/code4j/jproxy/util/JedisUtil.java +++ b/src/main/java/org/code4j/jproxy/util/JedisUtil.java @@ -4,6 +4,7 @@ package org.code4j.jproxy.util;/** * 上午10:50 */ +import org.apache.log4j.Logger; import redis.clients.jedis.Jedis; import java.util.List; @@ -15,10 +16,11 @@ import java.util.List; */ public class JedisUtil { + private static Logger log = Logger.getLogger(JedisUtil.class); public static Jedis jedisClient = new Jedis("localhost"); static { - System.out.println("Server is running: "+jedisClient.ping()); + log.info("Server is running: " + jedisClient.ping()); } public static String get(String key){ return jedisClient.get(key); diff --git a/src/main/java/org/code4j/jproxy/util/WebUtil.java b/src/main/java/org/code4j/jproxy/util/WebUtil.java index 795fa125d962970cb2cf912d084c98116db09089..a8b2afc893899e92d52596facb7ba7745a84390d 100644 --- a/src/main/java/org/code4j/jproxy/util/WebUtil.java +++ b/src/main/java/org/code4j/jproxy/util/WebUtil.java @@ -4,6 +4,8 @@ package org.code4j.jproxy.util;/** * 下午2:50 */ +import org.apache.log4j.Logger; + import java.io.File; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; @@ -17,6 +19,7 @@ import java.util.regex.Pattern; */ public class WebUtil { + private static Logger log = Logger.getLogger(DiskUtil.class); public static final String WEB_ROOT = System.getProperty("user.dir")+ File.separator+"cache/"; @@ -37,14 +40,14 @@ public class WebUtil { public static final String ROOT = "/"; public static List fetchImageFromString(String content){ - System.out.println("在CSS中寻找图片资源"); + log.info("在CSS中寻找图片资源"); Pattern pattern = Pattern.compile(INNER_IMAGE); Matcher matcher = pattern.matcher(content); List uris = new CopyOnWriteArrayList(); while(matcher.find()){ - System.out.println("找到一个图片"); + log.info("找到一个图片"); String path = matcher.group().replace("url(","").replace(")", ""); - System.out.println("path ---> : "+path); + log.info("path ---> : " + path); uris.add(File.separator+path); } return uris; diff --git a/src/main/resources/log4j.xml b/src/main/resources/log4j.xml new file mode 100644 index 0000000000000000000000000000000000000000..385ddb59710f977bca7f92caf0132b04d10cd89d --- /dev/null +++ b/src/main/resources/log4j.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/test/java/ProxyTest.java b/src/test/java/ProxyTest.java index 05cf25ee0a02198d3ed2a93e7a02f06f8c822841..f7e5df2823ababc2fb1eb801c5e9d2b10785d6d0 100644 --- a/src/test/java/ProxyTest.java +++ b/src/test/java/ProxyTest.java @@ -4,6 +4,7 @@ * 下午2:16 */ +import org.apache.log4j.Logger; import org.code4j.jproxy.client.ProxyClient; import org.code4j.jproxy.server.IPSelector; import org.junit.Test; @@ -21,14 +22,16 @@ import java.util.regex.Pattern; public class ProxyTest { + private static Logger log = Logger.getLogger(ProxyTest.class); + @Test public void testParrtern(){ Pattern pattern = Pattern.compile("url\\(.*\\.(png|ico|jpg|jpeg|bmp|swf|swf)\\)"); // Pattern pattern = Pattern.compile("(url\\()(http://).*?(?:jpg|png|gif)(?=\\))"); Matcher matcher = pattern.matcher("background: #fff url(bg-upper.png) repeat-x top left;"); - System.out.println(matcher.matches()); + log.info(matcher.matches()); while (matcher.find()){ - System.out.println(matcher.group()); + log.info(matcher.group()); } } @@ -37,26 +40,26 @@ public class ProxyTest { ProxyClient client = new ProxyClient(new InetSocketAddress("127.0.0.1",8080),"/tomcat.css"); File file = new File(System.getProperty("user.dir")+File.separator+"cache"+ File.separator+"tomcat.css"); if (!file.exists()){ - System.out.println(file.getAbsolutePath()); + log.info(file.getAbsolutePath()); file.createNewFile(); } BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file)); // bos.write(client.fetchImage(HttpMethod.GET)); // bos.flush(); -// System.out.println("is image? "+ ImageUtil.isImage(client.fetchImage(HttpMethod.GET))); +// log.info("is image? "+ ImageUtil.isImage(client.fetchImage(HttpMethod.GET))); } @Test public void testPath(){ - System.out.println(System.getProperty("user.dir")+"cache"); - System.out.println(getClass().getClassLoader().getResource("txt")); + log.info(System.getProperty("user.dir") + "cache"); + log.info(getClass().getClassLoader().getResource("txt")); } @Test public void testSaveFile() throws IOException { // Pattern css_pattern = Pattern.compile(".+\\.(css).*"); -// System.out.println(css_pattern.matcher("").matches()); +// log.info(css_pattern.matcher("").matches()); Pattern pattern = Pattern.compile("url\\(.*\\.(png|ico|jpg|jpeg|bmp|swf|swf)\\)"); // pattern.matcher("") } @@ -64,21 +67,21 @@ public class ProxyTest { @Test public void testConfig() throws IOException { InputStream is = this.getClass().getResourceAsStream("/config.json"); - System.out.println(is); + log.info(is); BufferedReader br = new BufferedReader(new InputStreamReader(is)); StringBuffer sb = new StringBuffer(); String str = ""; while ((str = br.readLine()) != null){ sb.append(str); } - System.out.println(sb); + log.info(sb); int weight = (int) Math.rint(Float.valueOf("2.1")); - System.out.println(); + log.info("OK"); } @Test public void testLoadBalance(){ InetSocketAddress address = IPSelector.weight(); - System.out.println(address.getHostName()+":"+address.getPort()); + log.info(address.getHostName() + ":" + address.getPort()); } } diff --git a/target/test-classes/ProxyTest.class b/target/test-classes/ProxyTest.class index 3d7dbc3c18e3ca274a819a6151718bd6845162c2..ab40103fee5526edde1e083c75c8facac89fab87 100644 Binary files a/target/test-classes/ProxyTest.class and b/target/test-classes/ProxyTest.class differ