// HTTPReceiver.java
package protocol; // protocol package
import java.util.*; // import Java utility classes
import support.*; // import Jasper support classes
/**
This is the main class for simulation of an HTTP receiver (i.e. server).
@author Kenneth J. Turner, Kenneth A. Whyte
@version 1.4 (9th March 2006, KJT/KAW): initial version
1.5 (24th July 2010, KJT): minor tidying
*/
public class HTTPReceiver implements ProtocolEntity {
private PDU pduReceived;
private PDU pduSent;
private ProtocolEntity peer;
private Medium medium;
private String name;
private int index; // data/URL index for move
public HTTPReceiver(Medium m, String name) {
this.name = name;
medium = m;
initialise();
}
public String getName() {
return(name);
}
public void initialise() {
pduReceived = null;
index = 1;
}
public Vector getServices() {
int url, moved; // given/moved URL number
Vector list = new Vector();
String sdu; // SDU
if (pduReceived != null && // PDU not null?
(sdu = pduReceived.sdu) != null && // SDU not null?
sdu.startsWith("URL")) { // URL and number?
try { // parse number
url = Integer.parseInt(sdu.substring(3)); // get URL number
}
catch (NumberFormatException exc) { // incorrect number
url = 0; // set default URL number
}
}
else // not URL
url = 0; // set zero URL number
if (pduReceived != null && pduReceived.type.equals("GET")) {
if (url == index) // URL same as local one?
moved = index + 1; // use next local for move
else // URL differs from local
moved = index; // use local for move
list.addElement("200 OK(DATA" + url + ") - send requested data");
list.addElement("301 MOVED(URL" + moved + ") - report moved URL");
list.addElement("400 ERROR(CODE) - report requested data unavailable");
}
if (pduReceived != null && pduReceived.type.equals("HEAD")) {
if (url == index) // URL same as local one?
moved = index + 1; // use next local for move
else // URL differs from local
moved = index; // use local for move
list.addElement
("200 OK(HEADER" + url + ") - send requested header");
list.addElement
("301 MOVED(URL" + moved + ") - report moved URL");
list.addElement
("400 ERROR(CODE) - report requested header unavailable");
}
if (pduReceived != null && pduReceived.type.equals("POST")) {
list.addElement("200 OK - acknowledge receipt of data");
list.addElement("400 ERROR(CODE) - report data not posted");
}
if (pduReceived != null && pduReceived.type.equals("PUT")) {
list.addElement("200 OK - acknowledge receipt of data");
list.addElement("400 ERROR(CODE) - report data not posted");
}
return(list);
}
public Vector performService(String s) {
Vector events = new Vector();
pduSent = null;
String data, url;
int startIndex, endIndex;
startIndex = s.indexOf ('(') + 1;
endIndex = s.indexOf (')');
if (s.startsWith ("200")) {
if (startIndex < endIndex) // any data?
data = s.substring(startIndex, endIndex);
else // no data
data = "";
transmitPDU(new PDU("200 OK", data), peer);
}
if (s.startsWith ("301")) {
url = s.substring(startIndex, endIndex); // get URL
index++; // update local index
transmitPDU(new PDU("301 MOVED", url), peer);
}
if (s.startsWith("400")) {
data = s.substring(startIndex, endIndex); // get data
transmitPDU(new PDU("400 ERROR", data), peer);
}
if (pduSent != null) {
events.addElement(new ProtocolEvent(ProtocolEvent.TRANSMIT, pduSent));
events.addElement(new ProtocolEvent(ProtocolEvent.RECEIVE, pduSent));
}
return(events);
}
public Vector receivePDU(PDU pdu) {
pduReceived = pdu;
return(new Vector());
}
public void setPeer(ProtocolEntity peer) {
this.peer = peer;
}
public void transmitPDU(PDU pdu, ProtocolEntity dest) {
pdu.setSource(this);
pdu.setDestination(dest);
pduSent = pdu;
peer.receivePDU(pdu);
pduReceived = null;
}
}