This commit is contained in:
Ziver Koc 2009-05-18 12:52:16 +00:00
parent 553f8da549
commit c21b229882
5 changed files with 37 additions and 30 deletions

View file

@ -1,6 +1,6 @@
package zutil.network.http; package zutil.network.http;
import java.util.HashMap; import java.util.Map;
/** /**
* This is a interface for a ordinary page for the HttpServer * This is a interface for a ordinary page for the HttpServer
@ -21,8 +21,8 @@ public interface HttpPage{
* @param request is POST and GET requests from the client * @param request is POST and GET requests from the client
*/ */
public abstract void respond(HttpPrintStream out, public abstract void respond(HttpPrintStream out,
HashMap<String,String> client_info, Map<String,String> client_info,
HashMap<String,Object> session, Map<String,Object> session,
HashMap<String,String> cookie, Map<String,String> cookie,
HashMap<String,String> request); Map<String,String> request);
} }

View file

@ -10,7 +10,9 @@ import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException; import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException; import java.security.NoSuchProviderException;
import java.security.cert.CertificateException; import java.security.cert.CertificateException;
import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map;
import java.util.Timer; import java.util.Timer;
import java.util.TimerTask; import java.util.TimerTask;
import java.util.regex.Pattern; import java.util.regex.Pattern;
@ -19,6 +21,7 @@ import javax.net.ssl.SSLServerSocketFactory;
import zutil.MultiPrintStream; import zutil.MultiPrintStream;
/** /**
* A simple web server that handles both cookies and * A simple web server that handles both cookies and
* sessions for all the clients * sessions for all the clients
@ -38,7 +41,7 @@ public class HttpServer extends Thread{
private HashMap<String,HttpPage> pages; private HashMap<String,HttpPage> pages;
private HttpPage defaultPage; private HttpPage defaultPage;
private HashMap<String,HashMap<String,Object>> sessions; private Map<String,Map<String,Object>> sessions;
private int nextSessionId; private int nextSessionId;
/** /**
@ -67,7 +70,7 @@ public class HttpServer extends Thread{
this.keyStore = keyStore; this.keyStore = keyStore;
pages = new HashMap<String,HttpPage>(); pages = new HashMap<String,HttpPage>();
sessions = new HashMap<String,HashMap<String,Object>>(); sessions = Collections.synchronizedMap(new HashMap<String,Map<String,Object>>());
nextSessionId = 0; nextSessionId = 0;
Timer timer = new Timer(); Timer timer = new Timer();
@ -82,9 +85,9 @@ public class HttpServer extends Thread{
*/ */
private class GarbageCollector extends TimerTask { private class GarbageCollector extends TimerTask {
public void run(){ public void run(){
synchronized(sessions) { Object[] keys = sessions.keySet().toArray();
for(String key : sessions.keySet()){ for(Object key : keys){
HashMap<String,Object> client_session = sessions.get(key); Map<String,Object> client_session = sessions.get(key);
// Check if session is still valid // Check if session is still valid
if((Long)client_session.get("ttl") < System.currentTimeMillis()){ if((Long)client_session.get("ttl") < System.currentTimeMillis()){
@ -92,7 +95,7 @@ public class HttpServer extends Thread{
if(DEBUG) MultiPrintStream.out.println("Removing Session: "+key); if(DEBUG) MultiPrintStream.out.println("Removing Session: "+key);
} }
} }
}
} }
} }
@ -259,14 +262,14 @@ public class HttpServer extends Thread{
//**************************** HANDLE REQUEST ********************************* //**************************** HANDLE REQUEST *********************************
// Get the client session or create one // Get the client session or create one
HashMap<String, Object> client_session; Map<String, Object> client_session;
long ttl_time = System.currentTimeMillis()+SESSION_TTL; long ttl_time = System.currentTimeMillis()+SESSION_TTL;
if(cookie.containsKey("session_id") && sessions.containsKey(cookie.get("session_id"))){ if(cookie.containsKey("session_id") && sessions.containsKey(cookie.get("session_id"))){
client_session = sessions.get(cookie.get("session_id")); client_session = sessions.get(cookie.get("session_id"));
// Check if session is still valid // Check if session is still valid
if((Long)client_session.get("ttl") < System.currentTimeMillis()){ if((Long)client_session.get("ttl") < System.currentTimeMillis()){
int session_id = (Integer)client_session.get("session_id"); int session_id = (Integer)client_session.get("session_id");
client_session = new HashMap<String, Object>(); client_session = Collections.synchronizedMap(new HashMap<String, Object>());
client_session.put("session_id", session_id); client_session.put("session_id", session_id);
sessions.put(""+session_id, client_session); sessions.put(""+session_id, client_session);
} }
@ -274,7 +277,7 @@ public class HttpServer extends Thread{
client_session.put("ttl", ttl_time); client_session.put("ttl", ttl_time);
} }
else{ else{
client_session = new HashMap<String, Object>(); client_session = Collections.synchronizedMap(new HashMap<String, Object>());
client_session.put("session_id", nextSessionId); client_session.put("session_id", nextSessionId);
client_session.put("ttl", ttl_time); client_session.put("ttl", ttl_time);
sessions.put(""+nextSessionId, client_session); sessions.put(""+nextSessionId, client_session);

View file

@ -10,6 +10,7 @@ import java.lang.reflect.Modifier;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.Iterator; import java.util.Iterator;
import java.util.Map;
import javax.wsdl.Binding; import javax.wsdl.Binding;
import javax.wsdl.BindingInput; import javax.wsdl.BindingInput;
@ -190,9 +191,10 @@ public class SOAPHttpPage implements HttpPage{
public void respond(HttpPrintStream out, public void respond(HttpPrintStream out,
HashMap<String, String> client_info, Map<String, String> client_info,
HashMap<String, Object> session, HashMap<String, String> cookie, Map<String, Object> session,
HashMap<String, String> request) { Map<String, String> cookie,
Map<String, String> request) {
try { try {
out.setHeader("Content-Type", "text/xml"); out.setHeader("Content-Type", "text/xml");

View file

@ -1,7 +1,7 @@
package zutil.test; package zutil.test;
import java.io.IOException; import java.io.IOException;
import java.util.HashMap; import java.util.Map;
import zutil.network.http.HttpPage; import zutil.network.http.HttpPage;
import zutil.network.http.HttpPrintStream; import zutil.network.http.HttpPrintStream;
@ -18,15 +18,16 @@ public class HTTPGuessTheNumber implements HttpPage{
} }
public void respond(HttpPrintStream out, public void respond(HttpPrintStream out,
HashMap<String, String> client_info, Map<String, String> client_info,
HashMap<String, Object> session, HashMap<String, String> cookie, Map<String, Object> session,
HashMap<String, String> request) { Map<String, String> cookie,
Map<String, String> request) {
out.enableBuffering(true); out.enableBuffering(true);
out.println("<html>"); out.println("<html>");
out.println("<H2>Welcome To The Number Guess Game!</H2>"); out.println("<H2>Welcome To The Number Guess Game!</H2>");
if(session.containsKey("random_nummber") && request.containsKey("guess")){ if(session.containsKey("random_nummber") && request.containsKey("guess") && !request.get("guess").isEmpty()){
int guess = Integer.parseInt(request.get("guess")); int guess = Integer.parseInt(request.get("guess"));
int nummber = (Integer)session.get("random_nummber"); int nummber = (Integer)session.get("random_nummber");
try { try {

View file

@ -1,7 +1,7 @@
package zutil.test; package zutil.test;
import java.io.IOException; import java.io.IOException;
import java.util.HashMap; import java.util.Map;
import zutil.network.http.HttpPage; import zutil.network.http.HttpPage;
import zutil.network.http.HttpPrintStream; import zutil.network.http.HttpPrintStream;
@ -18,9 +18,10 @@ public class HTTPUploaderTest implements HttpPage{
} }
public void respond(HttpPrintStream out, public void respond(HttpPrintStream out,
HashMap<String, String> client_info, Map<String, String> client_info,
HashMap<String, Object> session, HashMap<String, String> cookie, Map<String, Object> session,
HashMap<String, String> request) { Map<String, String> cookie,
Map<String, String> request) {
if(!session.containsKey("file1")){ if(!session.containsKey("file1")){
out.println("</html>" + out.println("</html>" +