Skip to content

Instantly share code, notes, and snippets.

@nikiink
Last active August 29, 2015 14:24
Show Gist options
  • Save nikiink/9c2505cf545719b0729c to your computer and use it in GitHub Desktop.
Save nikiink/9c2505cf545719b0729c to your computer and use it in GitHub Desktop.
/*
Il server sia in grado di gestire un metodo get condizionale
sulla base dell'ultima data di modifica della risorsa.
Se la richiesta condizionale va a buon fine l'header
della risposta deve contenere almeno i campi Date, Content-Length
e Last-Modified correttamente determinati.
Altrimenti il corpo della risposta sara' vuoto e l'header
della risposta dovra' contenere soltanto Date e Last-Modified
Il server sara' in grado di gestire i seguenti casi
+------------------------------+---------------------+
|Invio della risorsa | x00 OK |
|Risorsa non modificata | x04 Not Modified |
|Percorso della risorsa errato | x04 Not Found |
|Metodo HTTP non implementato | x01 Not Implemented |
+------------------------------+---------------------+
java.text.DateFormat
public static final DateFormat getDateInstance() [default style for default locale]
public Date parse(String source) throws java.text.ParseException
java.util.Date
public Date()
public Date(long date)
public boolean before(Date when)
*/
private final String DOCUMENTROOT = "/var/www/html";
private void serve(Socket s) {
//
PrintWriter sockOut = new PrintWriter(s.getOutputStream(), true);
BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));
String riga = in.readLine();
if (riga.startsWith("GET")) {
int indiceInizile = 4;
int indiceFinale = riga.indexOf(" HTTP/1.1");
String url = riga.substring(indiceIniziale, indiceFinale);
String headerIfModifiedSince = "";
//leggo gli header
while (!riga.equals("")) {
if (riga.startsWith("If-Modified-Since:")) {
int indiceDuePunti = riga.indexOf(":")
headerIfModifiedSince = riga.substring(indiceDuePunti+1);
}
riga = in.readLine(); //passo all'header successivo
}
File fileRisorsa = new File(DOCUMENTROOT + url);
if (fileRisorsa.exists()) {
DateFormat df = DateFormat.getDateInstance();
Date dataIfModifiedSince = null;
try {
dataIfModifiedSince = df.parse(headerIfModifiedSince);
} catch(ParseException pe) {
pe.printStackTrace(); //data non interpretabile
}
if (dataIfModifiedSince != null) {
Date dataModifica = new Date(fileRisorsa.lastModified());
if ( dataIfModifiedSince.before(dataModifica) ) {
sendResponse(sockOut, "200 OK", fileRisorsa);
} else {
sendResponse(sockOut, "304 Not Modified", fileRisorsa);
}
} else { // headerIfModifiedSince non interpretabile come data
sendResponse(sockOut, "200 OK", fileRisorsa);
}
} else {
sendResponse(sockOut, "404 Not Found", null);
}
} else {
sendResponse(sockOut, "501 Not Implemented", null);
}
}
public void sendResponse(PrintWriter out, String statusCodeAndMessage, File fileRisorsa) {
out.println("HTTP 1.1 " + statusCodeAndMessage);
Date dataCorrente = new Date();
out.println("Date: " + dataCorrente.toString());
if (fileRisorsa != null) { //caso 200 OK o 304 Not Modified
//LAST-MODIFIED
Date dataUltimaModifica = new Date(fileRisorsa.lastModified());
out.println("Last-Modified: " + dataUltimaModifica.toString());
//CONTENT-LENGTH
out.println("Content-Length: " + fileRisorsa.length());
//RIGA VUOTA FINE HEADER
out.println("");
//SE 200 DEVO INVIARE LA RISORSA NEL CORPO DELLA RESPONSE
//(LA RISORSA INFATTI RISULTA MODIFICATA RISPETTO A QUELLA CHE HA IL CLIENT IN CACHE)
if (statusCodeAndMessage.startsWith("200")) {
try {
BufferedReader in = new BufferedReader(new FileReader(fileRisorsa));
String rigaFile="";
while(rigaFile!=null) {
rigaFile = in.readLine();
out.println(rigaFile);
}
} catch(Exception e) {
//si e' verificata un'eccezione nella lettura del file
//interrompo la scrittura nella response
e.printStackTrace();
}
}
} else {
out.println("Content-Length: 0"); //corpo della risposta deve essere vuoto
out.println(""); //riga vuota fine header
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment