Search in sources :

Example 1 with CookieHandler

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"));
}
Also used : ByteArrayInputStream(java.io.ByteArrayInputStream) HTTPSession(org.nanohttpd.protocols.http.HTTPSession) ByteArrayOutputStream(java.io.ByteArrayOutputStream) HashSet(java.util.HashSet) CookieHandler(org.nanohttpd.protocols.http.content.CookieHandler) Test(org.junit.Test)

Example 2 with CookieHandler

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="));
}
Also used : Response(org.nanohttpd.protocols.http.response.Response) ByteArrayInputStream(java.io.ByteArrayInputStream) HTTPSession(org.nanohttpd.protocols.http.HTTPSession) ByteArrayOutputStream(java.io.ByteArrayOutputStream) CookieHandler(org.nanohttpd.protocols.http.content.CookieHandler) Test(org.junit.Test)

Example 3 with CookieHandler

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);
}
Also used : Response(org.nanohttpd.protocols.http.response.Response) ByteArrayInputStream(java.io.ByteArrayInputStream) HTTPSession(org.nanohttpd.protocols.http.HTTPSession) ByteArrayOutputStream(java.io.ByteArrayOutputStream) SimpleDateFormat(java.text.SimpleDateFormat) Date(java.util.Date) CookieHandler(org.nanohttpd.protocols.http.content.CookieHandler) Test(org.junit.Test)

Example 4 with CookieHandler

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"));
}
Also used : ByteArrayInputStream(java.io.ByteArrayInputStream) HTTPSession(org.nanohttpd.protocols.http.HTTPSession) ByteArrayOutputStream(java.io.ByteArrayOutputStream) HashSet(java.util.HashSet) CookieHandler(org.nanohttpd.protocols.http.content.CookieHandler) Test(org.junit.Test)

Example 5 with CookieHandler

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();
    }
}
Also used : SocketException(java.net.SocketException) InputStreamReader(java.io.InputStreamReader) HashMap(java.util.HashMap) ResponseException(org.nanohttpd.protocols.http.NanoHTTPD.ResponseException) IOException(java.io.IOException) SSLException(javax.net.ssl.SSLException) Response(org.nanohttpd.protocols.http.response.Response) SocketTimeoutException(java.net.SocketTimeoutException) ByteArrayInputStream(java.io.ByteArrayInputStream) BufferedReader(java.io.BufferedReader) ArrayList(java.util.ArrayList) List(java.util.List) CookieHandler(org.nanohttpd.protocols.http.content.CookieHandler)

Aggregations

ByteArrayInputStream (java.io.ByteArrayInputStream)5 CookieHandler (org.nanohttpd.protocols.http.content.CookieHandler)5 ByteArrayOutputStream (java.io.ByteArrayOutputStream)4 Test (org.junit.Test)4 HTTPSession (org.nanohttpd.protocols.http.HTTPSession)4 Response (org.nanohttpd.protocols.http.response.Response)3 HashSet (java.util.HashSet)2 BufferedReader (java.io.BufferedReader)1 IOException (java.io.IOException)1 InputStreamReader (java.io.InputStreamReader)1 SocketException (java.net.SocketException)1 SocketTimeoutException (java.net.SocketTimeoutException)1 SimpleDateFormat (java.text.SimpleDateFormat)1 ArrayList (java.util.ArrayList)1 Date (java.util.Date)1 HashMap (java.util.HashMap)1 List (java.util.List)1 SSLException (javax.net.ssl.SSLException)1 ResponseException (org.nanohttpd.protocols.http.NanoHTTPD.ResponseException)1