Home | History | Annotate | Download | only in elonen
      1 package fi.iki.elonen;
      2 
      3 /*
      4  * #%L
      5  * NanoHttpd-Core
      6  * %%
      7  * Copyright (C) 2012 - 2015 nanohttpd
      8  * %%
      9  * Redistribution and use in source and binary forms, with or without modification,
     10  * are permitted provided that the following conditions are met:
     11  *
     12  * 1. Redistributions of source code must retain the above copyright notice, this
     13  *    list of conditions and the following disclaimer.
     14  *
     15  * 2. Redistributions in binary form must reproduce the above copyright notice,
     16  *    this list of conditions and the following disclaimer in the documentation
     17  *    and/or other materials provided with the distribution.
     18  *
     19  * 3. Neither the name of the nanohttpd nor the names of its contributors
     20  *    may be used to endorse or promote products derived from this software without
     21  *    specific prior written permission.
     22  *
     23  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
     24  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
     25  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     26  * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
     27  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
     28  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     29  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
     30  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
     31  * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
     32  * OF THE POSSIBILITY OF SUCH DAMAGE.
     33  * #L%
     34  */
     35 
     36 import static fi.iki.elonen.NanoHTTPD.Response.Status.OK;
     37 
     38 import java.io.ByteArrayOutputStream;
     39 import java.io.IOException;
     40 import java.io.PipedInputStream;
     41 
     42 public class HttpChunkedResponseTest extends HttpServerTest {
     43 
     44     private static class ChunkedInputStream extends PipedInputStream {
     45 
     46         int chunk = 0;
     47 
     48         String[] chunks;
     49 
     50         private ChunkedInputStream(String[] chunks) {
     51             this.chunks = chunks;
     52         }
     53 
     54         @Override
     55         public synchronized int read(byte[] buffer, int off, int len) throws IOException {
     56             // Too implementation-linked, but...
     57             for (int i = 0; i < this.chunks[this.chunk].length(); ++i) {
     58                 buffer[i] = (byte) this.chunks[this.chunk].charAt(i);
     59             }
     60             return this.chunks[this.chunk++].length();
     61         }
     62     }
     63 
     64     @org.junit.Test
     65     public void thatChunkedContentIsChunked() throws Exception {
     66         PipedInputStream pipedInputStream = new ChunkedInputStream(new String[]{
     67             "some",
     68             "thing which is longer than sixteen characters",
     69             "whee!",
     70             ""
     71         });
     72         String[] expected = {
     73             "HTTP/1.1 200 OK",
     74             "Content-Type: what/ever",
     75             "Date: .*",
     76             "Connection: keep-alive",
     77             "Transfer-Encoding: chunked",
     78             "",
     79             "4",
     80             "some",
     81             "2d",
     82             "thing which is longer than sixteen characters",
     83             "5",
     84             "whee!",
     85             "0",
     86             ""
     87         };
     88         this.testServer.response = new NanoHTTPD(0) {
     89         }.newChunkedResponse(OK, "what/ever", pipedInputStream);
     90         this.testServer.response.setChunkedTransfer(true);
     91 
     92         ByteArrayOutputStream byteArrayOutputStream = invokeServer("GET / HTTP/1.1");
     93 
     94         assertResponse(byteArrayOutputStream, expected);
     95     }
     96 }
     97