1package fi.iki.elonen.integration;
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
36import static org.junit.Assert.assertEquals;
37
38import java.nio.charset.Charset;
39import java.util.ArrayList;
40import java.util.Collections;
41import java.util.List;
42import java.util.Map;
43
44import org.apache.http.HttpEntity;
45import org.apache.http.HttpResponse;
46import org.apache.http.NameValuePair;
47import org.apache.http.client.ResponseHandler;
48import org.apache.http.client.entity.UrlEncodedFormEntity;
49import org.apache.http.client.methods.HttpGet;
50import org.apache.http.client.methods.HttpPost;
51import org.apache.http.entity.mime.HttpMultipartMode;
52import org.apache.http.entity.mime.MultipartEntity;
53import org.apache.http.entity.mime.content.StringBody;
54import org.apache.http.impl.client.BasicResponseHandler;
55import org.apache.http.message.BasicNameValuePair;
56import org.apache.http.util.EntityUtils;
57import org.junit.Test;
58
59import fi.iki.elonen.NanoHTTPD;
60import fi.iki.elonen.NanoHTTPD.Response.Status;
61
62/**
63 * @author Paul S. Hawke (paul.hawke@gmail.com) On: 5/19/13 at 5:36 PM
64 */
65public class GetAndPostIntegrationTest extends IntegrationTestBase<GetAndPostIntegrationTest.TestServer> {
66
67    public static class TestServer extends NanoHTTPD {
68
69        public String response;
70
71        public TestServer() {
72            super(8192);
73        }
74
75        @Override
76        public Response serve(String uri, Method method, Map<String, String> header, Map<String, String> parms, Map<String, String> files) {
77            StringBuilder sb = new StringBuilder(String.valueOf(method) + ':' + this.response);
78
79            if (parms.size() > 1) {
80                parms.remove("NanoHttpd.QUERY_STRING");
81                sb.append("-params=").append(parms.size());
82                List<String> p = new ArrayList<String>(parms.keySet());
83                Collections.sort(p);
84                for (String k : p) {
85                    sb.append(';').append(k).append('=').append(parms.get(k));
86                }
87            }
88            if ("/chin".equals(uri)) {
89                return newFixedLengthResponse(Status.OK, "application/octet-stream", sb.toString());
90            } else {
91                return newFixedLengthResponse(sb.toString());
92            }
93        }
94    }
95
96    @Override
97    public TestServer createTestServer() {
98        return new TestServer();
99    }
100
101    @Test
102    public void testGetRequestWithParameters() throws Exception {
103        this.testServer.response = "testGetRequestWithParameters";
104
105        HttpGet httpget = new HttpGet("http://localhost:8192/?age=120&gender=Male");
106        ResponseHandler<String> responseHandler = new BasicResponseHandler();
107        String responseBody = this.httpclient.execute(httpget, responseHandler);
108
109        assertEquals("GET:testGetRequestWithParameters-params=2;age=120;gender=Male", responseBody);
110    }
111
112    @Test
113    public void testPostRequestWithFormEncodedParameters() throws Exception {
114        this.testServer.response = "testPostRequestWithFormEncodedParameters";
115
116        HttpPost httppost = new HttpPost("http://localhost:8192/");
117        List<NameValuePair> postParameters = new ArrayList<NameValuePair>();
118        postParameters.add(new BasicNameValuePair("age", "120"));
119        postParameters.add(new BasicNameValuePair("gender", "Male"));
120        httppost.setEntity(new UrlEncodedFormEntity(postParameters));
121
122        ResponseHandler<String> responseHandler = new BasicResponseHandler();
123        String responseBody = this.httpclient.execute(httppost, responseHandler);
124
125        assertEquals("POST:testPostRequestWithFormEncodedParameters-params=2;age=120;gender=Male", responseBody);
126    }
127
128    @Test
129    public void testPostRequestWithMultipartEncodedParameters() throws Exception {
130        this.testServer.response = "testPostRequestWithMultipartEncodedParameters";
131
132        HttpPost httppost = new HttpPost("http://localhost:8192/");
133        MultipartEntity reqEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);
134        reqEntity.addPart("age", new StringBody("120"));
135        reqEntity.addPart("gender", new StringBody("Male"));
136        httppost.setEntity(reqEntity);
137
138        ResponseHandler<String> responseHandler = new BasicResponseHandler();
139        String responseBody = this.httpclient.execute(httppost, responseHandler);
140
141        assertEquals("POST:testPostRequestWithMultipartEncodedParameters-params=2;age=120;gender=Male", responseBody);
142    }
143
144    @Test
145    public void testPostWithNoParameters() throws Exception {
146        this.testServer.response = "testPostWithNoParameters";
147
148        HttpPost httppost = new HttpPost("http://localhost:8192/");
149        ResponseHandler<String> responseHandler = new BasicResponseHandler();
150        String responseBody = this.httpclient.execute(httppost, responseHandler);
151
152        assertEquals("POST:testPostWithNoParameters", responseBody);
153    }
154
155    @Test
156    public void testSimpleGetRequest() throws Exception {
157        this.testServer.response = "testSimpleGetRequest";
158
159        HttpGet httpget = new HttpGet("http://localhost:8192/");
160        ResponseHandler<String> responseHandler = new BasicResponseHandler();
161        String responseBody = this.httpclient.execute(httpget, responseHandler);
162
163        assertEquals("GET:testSimpleGetRequest", responseBody);
164    }
165
166    @Test
167    public void testPostRequestWithMultipartExtremEncodedParameters() throws Exception {
168        this.testServer.response = "testPostRequestWithMultipartEncodedParameters";
169
170        HttpPost httppost = new HttpPost("http://localhost:8192/chin");
171        MultipartEntity reqEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE, "sfsadfasdf", Charset.forName("UTF-8"));
172        reqEntity.addPart("specialString", new StringBody("拖拉图片到浏览器,可以实现预览功能", "text/plain", Charset.forName("UTF-8")));
173        reqEntity.addPart("gender", new StringBody("图片名称", Charset.forName("UTF-8")) {
174
175            @Override
176            public String getFilename() {
177                return "图片名称";
178            }
179        });
180        httppost.setEntity(reqEntity);
181        HttpResponse response = this.httpclient.execute(httppost);
182
183        HttpEntity entity = response.getEntity();
184        String responseBody = EntityUtils.toString(entity, "UTF-8");
185
186        assertEquals("POST:testPostRequestWithMultipartEncodedParameters-params=2;gender=图片名称;specialString=拖拉图片到浏览器,可以实现预览功能", responseBody);
187    }
188}
189