package nginx.clojure.net;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.util.Collections;
import java.util.Map;
import nginx.clojure.Configurable;
import nginx.clojure.NginxClojureRT;
import nginx.clojure.java.ArrayMap;
import nginx.clojure.java.Constants;
import nginx.clojure.java.NginxJavaRingHandler;
import nginx.clojure.logger.LoggerService;
public class SimpleHandler4TestNginxClojureSocket implements NginxJavaRingHandler, Configurable {
static LoggerService log;
String host = "www.apache.org";
int port = 80;
public SimpleHandler4TestNginxClojureSocket() {
if (log == null) {
log = NginxClojureRT.getLog();
}
}
/* (non-Javadoc)
* @see nginx.clojure.Configurable#config(java.util.Map)
*/
@Override
public void config(Map<String, String> properties) {
if (properties.get("url") != null) {
String url = properties.get("url");
if (url.startsWith("unix:")) {
host = url;
port = 0;
}else {
String[] a = url.split(":");
host = a[0];
port = Integer.parseInt(a[1]);
}
}
}
@Override
public Object[] invoke(Map<String, Object> request) {
Socket socket = new Socket();
try {
//http://www.apache.org/apache/httpcomponents/httpclient/RELEASE_NOTES-4.3.x.txt
InetSocketAddress inetSocketAddress = new InetSocketAddress(host, port);
socket.setSoTimeout(50000);
socket.setTcpNoDelay(true);
socket.setKeepAlive(true);
// socket.bind(new InetSocketAddress("192.168.10.56", 12345));
// socket.bind(new InetSocketAddress("192.168.2.50", 0));
socket.connect(inetSocketAddress);
log.info("addr: %s, sotimeout %s, socket keepalive = %s, tcpnodelay = %s", inetSocketAddress, socket.getSoTimeout(), socket.getKeepAlive()+"", socket.getTcpNoDelay()+"");
log.info("fininsh connect");
OutputStream out = socket.getOutputStream();
// out.write("GET /ubuntu/dists/trusty/Release HTTP/1.1\r\nUser-Agent: nginx-clojure/0.2.0\r\nHost: mirrors.163.com\r\nAccept: */*\r\nConnection: close\r\n\r\n".getBytes());
out.write("GET /dist/httpcomponents/httpclient/RELEASE_NOTES-4.3.x.txt HTTP/1.1\r\nUser-Agent: nginx-clojure/0.4.1\r\nHost: www.apache.org\r\nAccept: */*\r\nConnection: close\r\n\r\n".getBytes());
out.flush();
log.info("fininsh request");
if (host.startsWith("unix:")) {
socket.shutdownOutput();
}
InputStream in = socket.getInputStream();
ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] buf = new byte[4096];
int c = 0;
int total = 0;
while ( (c = in.read(buf)) > 0) {
total += c;
log.info("read:%d, total:%d", c, total);
bos.write(buf, 0, c);
}
log.info("fininsh total read: %d", total);
return new Object[] {200, ArrayMap.create(Constants.CONTENT_TYPE, "text/html"), new ByteArrayInputStream(bos.toByteArray())};
} catch (IOException e) {
throw new RuntimeException("error happend!", e);
}
finally {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) throws IOException {
SimpleHandler4TestNginxClojureSocket ss = new SimpleHandler4TestNginxClojureSocket();
Object[] resp = ss.invoke(Collections.EMPTY_MAP);
ByteArrayInputStream bi = (ByteArrayInputStream)resp[2];
byte[] ba = new byte[bi.available()];
bi.read(ba);
System.out.println(new String(ba));
}
}