use of org.nanohttpd.protocols.http.content.CookieHandler in project nanohttpd by NanoHttpd.
the class CookieHandlerTest method testCookieHeaderWithSpecialCharactersCorrectlyParsed.
@Test
public void testCookieHeaderWithSpecialCharactersCorrectlyParsed() throws IOException {
StringBuilder requestBuilder = new StringBuilder();
// not including ; = and ,
requestBuilder.append("GET " + HttpServerTest.URI + " HTTP/1.1").append(System.getProperty("line.separator")).append("Cookie: theme=light; sessionToken=abc123!@#$%^&*()-_+{}[]\\|:\"'<>.?/");
ByteArrayInputStream inputStream = new ByteArrayInputStream(requestBuilder.toString().getBytes());
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
HTTPSession session = this.testServer.createSession(this.tempFileManager, inputStream, outputStream);
session.execute();
Set<String> allCookies = new HashSet<String>();
CookieHandler cookieHandler = session.getCookies();
for (String cookie : cookieHandler) {
allCookies.add(cookie);
}
assertTrue("cookie specified in header not correctly parsed", allCookies.contains("theme"));
assertTrue("cookie specified in header not correctly parsed", allCookies.contains("sessionToken"));
assertEquals("cookie value not correctly parsed", "light", cookieHandler.read("theme"));
assertEquals("cookie value not correctly parsed", "abc123!@#$%^&*()-_+{}[]\\|:\"'<>.?/", cookieHandler.read("sessionToken"));
}
use of org.nanohttpd.protocols.http.content.CookieHandler in project nanohttpd by NanoHttpd.
the class CookieHandlerTest method testUnloadQueue.
@Test
public void testUnloadQueue() throws IOException {
StringBuilder requestBuilder = new StringBuilder();
requestBuilder.append("GET " + HttpServerTest.URI + " HTTP/1.1").append(System.getProperty("line.separator")).append("Cookie: theme=light; sessionToken=abc123");
ByteArrayInputStream inputStream = new ByteArrayInputStream(requestBuilder.toString().getBytes());
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
HTTPSession session = this.testServer.createSession(this.tempFileManager, inputStream, outputStream);
session.execute();
CookieHandler cookieHandler = session.getCookies();
Response response = Response.newFixedLengthResponse("");
cookieHandler.set("name", "value", 30);
cookieHandler.unloadQueue(response);
String setCookieHeader = response.getCookieHeaders().get(0);
assertTrue("unloadQueue did not set the cookies correctly", setCookieHeader.startsWith("name=value; expires="));
}
use of org.nanohttpd.protocols.http.content.CookieHandler in project nanohttpd by NanoHttpd.
the class CookieHandlerTest method testDelete.
@Test
public void testDelete() throws IOException, ParseException {
StringBuilder requestBuilder = new StringBuilder();
requestBuilder.append("GET " + HttpServerTest.URI + " HTTP/1.1").append(System.getProperty("line.separator")).append("Cookie: theme=light; sessionToken=abc123");
ByteArrayInputStream inputStream = new ByteArrayInputStream(requestBuilder.toString().getBytes());
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
HTTPSession session = this.testServer.createSession(this.tempFileManager, inputStream, outputStream);
session.execute();
CookieHandler cookieHandler = session.getCookies();
Response response = Response.newFixedLengthResponse("");
cookieHandler.delete("name");
cookieHandler.unloadQueue(response);
String setCookieHeader = response.getCookieHeaders().get(0);
SimpleDateFormat dateFormat = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z", Locale.US);
dateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
String dateString = setCookieHeader.split(";")[1].split("=")[1].trim();
Date date = dateFormat.parse(dateString);
assertTrue("Deleted cookie's expiry time should be a time in the past", date.compareTo(new Date()) < 0);
}
use of org.nanohttpd.protocols.http.content.CookieHandler in project nanohttpd by NanoHttpd.
the class CookieHandlerTest method testCookieHeaderCorrectlyParsed.
@Test
public void testCookieHeaderCorrectlyParsed() throws IOException {
StringBuilder requestBuilder = new StringBuilder();
requestBuilder.append("GET " + HttpServerTest.URI + " HTTP/1.1").append(System.getProperty("line.separator")).append("Cookie: theme=light; sessionToken=abc123");
ByteArrayInputStream inputStream = new ByteArrayInputStream(requestBuilder.toString().getBytes());
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
HTTPSession session = this.testServer.createSession(this.tempFileManager, inputStream, outputStream);
session.execute();
Set<String> allCookies = new HashSet<String>();
CookieHandler cookieHandler = session.getCookies();
for (String cookie : cookieHandler) {
allCookies.add(cookie);
}
assertTrue("cookie specified in header not correctly parsed", allCookies.contains("theme"));
assertTrue("cookie specified in header not correctly parsed", allCookies.contains("sessionToken"));
assertEquals("cookie value not correctly parsed", "light", cookieHandler.read("theme"));
assertEquals("cookie value not correctly parsed", "abc123", cookieHandler.read("sessionToken"));
}
use of org.nanohttpd.protocols.http.content.CookieHandler in project nanohttpd by NanoHttpd.
the class HTTPSession method execute.
@Override
public void execute() throws IOException {
Response r = null;
try {
// Read the first 8192 bytes.
// The full header should fit in here.
// Apache's default header limit is 8KB.
// Do NOT assume that a single read will get the entire header
// at once!
byte[] buf = new byte[HTTPSession.BUFSIZE];
this.splitbyte = 0;
this.rlen = 0;
int read = -1;
this.inputStream.mark(HTTPSession.BUFSIZE);
try {
read = this.inputStream.read(buf, 0, HTTPSession.BUFSIZE);
} catch (SSLException e) {
throw e;
} catch (IOException e) {
NanoHTTPD.safeClose(this.inputStream);
NanoHTTPD.safeClose(this.outputStream);
throw new SocketException("NanoHttpd Shutdown");
}
if (read == -1) {
// socket was been closed
NanoHTTPD.safeClose(this.inputStream);
NanoHTTPD.safeClose(this.outputStream);
throw new SocketException("NanoHttpd Shutdown");
}
while (read > 0) {
this.rlen += read;
this.splitbyte = findHeaderEnd(buf, this.rlen);
if (this.splitbyte > 0) {
break;
}
read = this.inputStream.read(buf, this.rlen, HTTPSession.BUFSIZE - this.rlen);
}
if (this.splitbyte < this.rlen) {
this.inputStream.reset();
this.inputStream.skip(this.splitbyte);
}
this.parms = new HashMap<String, List<String>>();
if (null == this.headers) {
this.headers = new HashMap<String, String>();
} else {
this.headers.clear();
}
// Create a BufferedReader for parsing the header.
BufferedReader hin = new BufferedReader(new InputStreamReader(new ByteArrayInputStream(buf, 0, this.rlen)));
// Decode the header into parms and header java properties
Map<String, String> pre = new HashMap<String, String>();
decodeHeader(hin, pre, this.parms, this.headers);
if (null != this.remoteIp) {
this.headers.put("remote-addr", this.remoteIp);
this.headers.put("http-client-ip", this.remoteIp);
}
this.method = Method.lookup(pre.get("method"));
if (this.method == null) {
throw new ResponseException(Status.BAD_REQUEST, "BAD REQUEST: Syntax error. HTTP verb " + pre.get("method") + " unhandled.");
}
this.uri = pre.get("uri");
this.cookies = new CookieHandler(this.headers);
String connection = this.headers.get("connection");
boolean keepAlive = "HTTP/1.1".equals(protocolVersion) && (connection == null || !connection.matches("(?i).*close.*"));
// Ok, now do the serve()
// TODO: long body_size = getBodySize();
// TODO: long pos_before_serve = this.inputStream.totalRead()
// (requires implementation for totalRead())
r = httpd.handle(this);
if (r == null) {
throw new ResponseException(Status.INTERNAL_ERROR, "SERVER INTERNAL ERROR: Serve() returned a null response.");
} else {
String acceptEncoding = this.headers.get("accept-encoding");
this.cookies.unloadQueue(r);
r.setRequestMethod(this.method);
if (acceptEncoding == null || !acceptEncoding.contains("gzip")) {
r.setUseGzip(false);
}
r.setKeepAlive(keepAlive);
r.send(this.outputStream);
}
if (!keepAlive || r.isCloseConnection()) {
throw new SocketException("NanoHttpd Shutdown");
}
} catch (SocketException e) {
// throw it out to close socket object (finalAccept)
throw e;
} catch (SocketTimeoutException ste) {
// exception up the call stack.
throw ste;
} catch (SSLException ssle) {
Response resp = Response.newFixedLengthResponse(Status.INTERNAL_ERROR, NanoHTTPD.MIME_PLAINTEXT, "SSL PROTOCOL FAILURE: " + ssle.getMessage());
resp.send(this.outputStream);
NanoHTTPD.safeClose(this.outputStream);
} catch (IOException ioe) {
Response resp = Response.newFixedLengthResponse(Status.INTERNAL_ERROR, NanoHTTPD.MIME_PLAINTEXT, "SERVER INTERNAL ERROR: IOException: " + ioe.getMessage());
resp.send(this.outputStream);
NanoHTTPD.safeClose(this.outputStream);
} catch (ResponseException re) {
Response resp = Response.newFixedLengthResponse(re.getStatus(), NanoHTTPD.MIME_PLAINTEXT, re.getMessage());
resp.send(this.outputStream);
NanoHTTPD.safeClose(this.outputStream);
} finally {
NanoHTTPD.safeClose(r);
this.tempFileManager.clear();
}
}
Aggregations