This commit is contained in:
Ziver Koc 2015-03-23 21:05:51 +00:00
parent e822a4b35c
commit 91cadbb301
20 changed files with 342 additions and 130 deletions

View file

@ -199,7 +199,7 @@ public class HttpPrintStream extends PrintStream{
super.print(req_type+" "+req_url+" HTTP/1.0");
else
super.print("HTTP/1.0 "+res_status_code+" "+getStatusString(res_status_code));
super.println();
super.print(System.lineSeparator());
res_status_code = null;
req_type = null;
req_url = null;
@ -207,7 +207,7 @@ public class HttpPrintStream extends PrintStream{
if(headers != null){
for(String key : headers.keySet()){
super.print(key+": "+headers.get(key));
super.println();
super.print(System.lineSeparator());
}
headers = null;
}
@ -218,16 +218,16 @@ public class HttpPrintStream extends PrintStream{
for(String key : cookies.keySet()){
super.print(key+"="+cookies.get(key)+"; ");
}
super.println();
super.print(System.lineSeparator());
}
else{
for(String key : cookies.keySet()){
super.print("Set-Cookie: "+key+"="+cookies.get(key)+";");
super.println();
super.print(System.lineSeparator());
}
}
}
super.println();
super.print(System.lineSeparator());
cookies = null;
}
super.print(s);

View file

@ -53,7 +53,6 @@ public class HttpServer extends ThreadedTCPNetworkServer{
public static final int COOKIE_TTL = 200;
public static final int SESSION_TTL = 10*60*1000; // in milliseconds
public final String server_url;
public final int server_port;
private Map<String,HttpPage> pages;
@ -63,26 +62,23 @@ public class HttpServer extends ThreadedTCPNetworkServer{
/**
* Creates a new instance of the sever
*
* @param url The address to the server
*
* @param port The port that the server should listen to
*/
public HttpServer(String url, int port){
this(url, port, null, null);
public HttpServer(int port){
this(port, null, null);
}
/**
* Creates a new instance of the sever
*
* @param url The address to the server
*
* @param port The port that the server should listen to
* @param keyStore If this is not null then the server will use SSL connection with this keyStore file path
* @param keyStorePass If this is not null then the server will use a SSL connection with the given certificate
*/
public HttpServer(String url, int port, File keyStore, String keyStorePass){
public HttpServer(int port, File keyStore, String keyStorePass){
super( port, keyStore, keyStorePass );
this.server_url = url;
this.server_port = port;
pages = new ConcurrentHashMap<String,HttpPage>();

View file

@ -56,7 +56,8 @@ public class SSDPClient extends ThreadedUDPNetwork implements ThreadedUDPNetwork
System.out.println(LogUtil.getCalingClass());
LogUtil.setGlobalLevel(Level.FINEST);
SSDPClient ssdp = new SSDPClient();
ssdp.requestService("upnp:rootdevice");
//ssdp.requestService("upnp:rootdevice");
ssdp.requestService("zap:discover");
ssdp.start();
for(int i=0; true ;++i){
@ -73,13 +74,13 @@ public class SSDPClient extends ThreadedUDPNetwork implements ThreadedUDPNetwork
* @throws IOException
*/
public SSDPClient() throws IOException{
super( null );
super.setThread( this );
super(null);
super.setThread(this);
services_st = new HashMap<String, LinkedList<SSDPServiceInfo>>();
services_usn = new HashMap<String, SSDPServiceInfo>();
}
/**
* Sends an request for an service
*
@ -94,6 +95,9 @@ public class SSDPClient extends ThreadedUDPNetwork implements ThreadedUDPNetwork
*
*/
public void requestService(String st){
requestService(st, null);
}
public void requestService(String st, HashMap<String,String> headers){
try {
services_st.put( st, new LinkedList<SSDPServiceInfo>() );
@ -106,9 +110,14 @@ public class SSDPClient extends ThreadedUDPNetwork implements ThreadedUDPNetwork
http.setHeader("ST", st );
http.setHeader("Man", "\"ssdp:discover\"" );
http.setHeader("MX", "3" );
if(headers != null) {
for (String key : headers.keySet()) {
http.setHeader(key, headers.get(key));
}
}
http.flush();
logger.log(Level.FINEST, "***** REQUEST: \n"+msg);
logger.log(Level.FINEST, "Sending Multicast: \n"+msg);
byte[] data = msg.toString().getBytes();
DatagramPacket packet = new DatagramPacket(
data, data.length,
@ -120,7 +129,14 @@ public class SSDPClient extends ThreadedUDPNetwork implements ThreadedUDPNetwork
e.printStackTrace();
}
}
/**
* Set a listener that will be notified when new services are detected
*/
public void setListener(SSDPServiceListener listener){
this.listener = listener;
}
/**
* Returns a list of received services by
* the given search target.
@ -176,7 +192,7 @@ public class SSDPClient extends ThreadedUDPNetwork implements ThreadedUDPNetwork
*/
public void receivedPacket(DatagramPacket packet, ThreadedUDPNetwork network) {
HttpHeaderParser header = new HttpHeaderParser( new String( packet.getData() ) );
logger.log(Level.FINEST, "Recived: \n"+header);
logger.log(Level.FINEST, "Recived(from: "+packet.getAddress()+"): \n" + header);
String usn = header.getHeader("USN");
String st = header.getHeader("ST");
@ -199,11 +215,13 @@ public class SSDPClient extends ThreadedUDPNetwork implements ThreadedUDPNetwork
service.setLocation( header.getHeader("LOCATION") );
service.setST( st );
service.setUSN( usn );
service.setExpirationTime(
System.currentTimeMillis() +
1000 * getCacheTime(header.getHeader("Cache-Control")) );
service.setInetAddress(packet.getAddress());
if(header.getHeader("Cache-Control") != null) {
service.setExpirationTime(
System.currentTimeMillis() + 1000 * getCacheTime(header.getHeader("Cache-Control")));
}
service.setHeaders(header.getHeaders());
logger.log(Level.FINEST, "Recived:\n"+service);
if(listener != null && newService)
listener.newService(service);
}

View file

@ -25,6 +25,7 @@ package zutil.net.ssdp;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
import java.util.HashMap;
import java.util.Timer;
import java.util.TimerTask;
@ -80,10 +81,14 @@ public class SSDPServer extends ThreadedUDPNetwork implements ThreadedUDPNetwork
public static void main(String[] args) throws IOException{
LogUtil.setGlobalLevel(Level.FINEST);
SSDPServer ssdp = new SSDPServer();
StandardSSDPInfo service = new StandardSSDPInfo();
service.setLocation("nowhere");
service.setST("upnp:rootdevice");
service.setST("zep:discover");
HashMap<String, String> headers = new HashMap<String, String>();
headers.put("Alias", "Desktop");
headers.put("PublicKey", "SuperDesktopKey");
service.setHeaders(headers);
SSDPServer ssdp = new SSDPServer();
ssdp.addService(service);
ssdp.start();
MultiPrintStream.out.println("SSDP Server running");
@ -178,31 +183,36 @@ public class SSDPServer extends ThreadedUDPNetwork implements ThreadedUDPNetwork
String msg = new String( packet.getData() );
HttpHeaderParser header = new HttpHeaderParser( msg );
logger.log(Level.FINEST, "#### Received:\n"+header);
// ******* Respond
// Check that the message is an ssdp discovery message
if( header.getRequestType() != null && header.getRequestType().equalsIgnoreCase("M-SEARCH") ){
String man = header.getHeader("Man").replace("\"", "");
String man = header.getHeader("Man");
if(man != null)
man = man.replace("\"", "");
String st = header.getHeader("ST");
// Check that its the correct URL and that its an ssdp:discover message
if( header.getRequestURL().equals("*") && man.equalsIgnoreCase("ssdp:discover") ){
if( header.getRequestURL().equals("*") && "ssdp:discover".equalsIgnoreCase(man) ){
// Check if the requested service exists
if( services.containsKey( st ) ){
logger.log(Level.FINEST, "Received Multicast(from: "+packet.getAddress()+"):\n"+header);
// Generate the SSDP response
StringOutputStream response = new StringOutputStream();
HttpPrintStream http = new HttpPrintStream( response );
http.setStatusCode(200);
http.setHeader("Location", services.get(st).getLocation() );
http.setHeader("USN", services.get(st).getUSN() );
http.setHeader("Server", SERVER_INFO );
http.setHeader("ST", st );
http.setHeader("Location", services.get(st).getLocation() );
http.setHeader("EXT", "" );
http.setHeader("Cache-Control", "max-age = "+cache_time );
http.setHeader("USN", services.get(st).getUSN() );
if(services.get(st) instanceof SSDPCustomInfo)
((SSDPCustomInfo)services.get(st)).setHeaders(http);
http.flush();
String strData = response.toString();
logger.log(Level.FINEST, "#### Response:\n"+strData);
logger.log(Level.FINEST, "Response:\n"+strData);
byte[] data = strData.getBytes();
packet = new DatagramPacket(
data, data.length,
@ -269,7 +279,7 @@ public class SSDPServer extends ThreadedUDPNetwork implements ThreadedUDPNetwork
http.setHeader("USN", services.get(searchTarget).getUSN() );
http.close();
logger.log(Level.FINEST, "#### Notification:\n"+msg);
logger.log(Level.FINEST, "Notification:\n" + msg);
byte[] data = msg.toString().getBytes();
DatagramPacket packet = new DatagramPacket(
data, data.length,
@ -318,7 +328,7 @@ public class SSDPServer extends ThreadedUDPNetwork implements ThreadedUDPNetwork
http.setHeader("USN", services.get(searchTarget).getUSN() );
http.close();
logger.log(Level.FINEST, "******** ByeBye:\n"+msg);
logger.log(Level.FINEST, "ByeBye:\n" + msg);
byte[] data = msg.toString().getBytes();
DatagramPacket packet = new DatagramPacket(
data, data.length,

View file

@ -22,6 +22,8 @@
package zutil.net.ssdp;
import zutil.net.http.HttpPrintStream;
/**
* This class contains information about a service from
* or through the SSDP protocol

View file

@ -22,7 +22,11 @@
package zutil.net.ssdp;
import zutil.net.http.HttpPrintStream;
import java.net.InetAddress;
import java.util.Date;
import java.util.HashMap;
import java.util.UUID;
/**
@ -31,12 +35,15 @@ import java.util.UUID;
*
* @author Ziver
*/
public class StandardSSDPInfo implements SSDPServiceInfo{
public class StandardSSDPInfo implements SSDPServiceInfo, SSDPCustomInfo{
private String location;
private String st;
private String usn;
private long expiration_time;
// All header parameters
private HashMap<String, String> headers;
private InetAddress inetAddress;
/**
* @param l is the value to set the Location variable
*/
@ -103,11 +110,10 @@ public class StandardSSDPInfo implements SSDPServiceInfo{
usn = genUSN();
return usn;
}
/**
* Generates an unique USN for the service
*
* @param searchTarget is the service ST name
* @return an unique string that corresponds to the service
*/
private String genUSN(){
@ -117,4 +123,30 @@ public class StandardSSDPInfo implements SSDPServiceInfo{
public String toString(){
return "USN: "+usn+"\nLocation: "+location+"\nST: "+st+"\nExpiration-Time: "+new Date(expiration_time);
}
public void setHeaders(HashMap<String, String> headers) {
this.headers = headers;
}
public String getHeader(String header){
return headers.get(header.toUpperCase());
}
@Override
public void setHeaders(HttpPrintStream http) {
if(headers != null) {
for (String key : headers.keySet()) {
http.setHeader(key, headers.get(key));
}
}
}
public InetAddress getInetAddress(){
return inetAddress;
}
public void setInetAddress(InetAddress inetAddress) {
this.inetAddress = inetAddress;
}
}

View file

@ -62,7 +62,7 @@ public class TorrentMetainfo {
public TorrentMetainfo(File torrent) throws IOException{
this(FileUtil.getFileContent( torrent ));
this(FileUtil.getContent(torrent));
}
public TorrentMetainfo(String data){