diff --git a/libraries-server/pom.xml b/libraries-server/pom.xml
index a6ead8fb31..873cca9b9b 100644
--- a/libraries-server/pom.xml
+++ b/libraries-server/pom.xml
@@ -96,6 +96,19 @@
smack-java7
${smack.version}
+
+
+
+ org.nanohttpd
+ nanohttpd
+ ${nanohttpd.version}
+
+
+ org.nanohttpd
+ nanohttpd-nanolets
+ ${nanohttpd.version}
+
+
@@ -108,6 +121,7 @@
8.5.24
4.3.1
1.2.0
+ 2.3.1
\ No newline at end of file
diff --git a/libraries-server/src/main/java/com/baeldung/nanohttpd/ApplicationController.java b/libraries-server/src/main/java/com/baeldung/nanohttpd/ApplicationController.java
new file mode 100644
index 0000000000..2fa54c3ae2
--- /dev/null
+++ b/libraries-server/src/main/java/com/baeldung/nanohttpd/ApplicationController.java
@@ -0,0 +1,38 @@
+package com.baeldung.nanohttpd;
+
+import fi.iki.elonen.NanoHTTPD;
+import fi.iki.elonen.router.RouterNanoHTTPD;
+
+import java.io.IOException;
+
+public class ApplicationController extends RouterNanoHTTPD {
+
+ ApplicationController() throws IOException {
+ super(8072);
+ addMappings();
+ start(NanoHTTPD.SOCKET_READ_TIMEOUT, false);
+ }
+
+ @Override
+ public void addMappings() {
+ addRoute("/", IndexHandler.class);
+ addRoute("/users", UserHandler.class);
+ }
+
+ public static class UserHandler extends DefaultHandler {
+ @Override
+ public String getText() {
+ return "UserA, UserB, UserC";
+ }
+
+ @Override
+ public String getMimeType() {
+ return MIME_PLAINTEXT;
+ }
+
+ @Override
+ public Response.IStatus getStatus() {
+ return Response.Status.OK;
+ }
+ }
+}
\ No newline at end of file
diff --git a/libraries-server/src/main/java/com/baeldung/nanohttpd/ItemGetController.java b/libraries-server/src/main/java/com/baeldung/nanohttpd/ItemGetController.java
new file mode 100644
index 0000000000..4a9c48fbfd
--- /dev/null
+++ b/libraries-server/src/main/java/com/baeldung/nanohttpd/ItemGetController.java
@@ -0,0 +1,22 @@
+package com.baeldung.nanohttpd;
+
+import fi.iki.elonen.NanoHTTPD;
+
+import java.io.IOException;
+
+public class ItemGetController extends NanoHTTPD {
+
+ ItemGetController() throws IOException {
+ super(8071);
+ start(NanoHTTPD.SOCKET_READ_TIMEOUT, false);
+ }
+
+ @Override
+ public Response serve(IHTTPSession session) {
+ if (session.getMethod() == Method.GET) {
+ String itemIdRequestParam = session.getParameters().get("itemId").get(0);
+ return newFixedLengthResponse("Requested itemId = " + itemIdRequestParam);
+ }
+ return newFixedLengthResponse(Response.Status.NOT_FOUND, MIME_PLAINTEXT, "The requested resource does not exist");
+ }
+}
\ No newline at end of file
diff --git a/libraries-server/src/test/java/com/baeldung/nanohttpd/ApplicationControllerUnitTest.java b/libraries-server/src/test/java/com/baeldung/nanohttpd/ApplicationControllerUnitTest.java
new file mode 100644
index 0000000000..003f6ee3b7
--- /dev/null
+++ b/libraries-server/src/test/java/com/baeldung/nanohttpd/ApplicationControllerUnitTest.java
@@ -0,0 +1,37 @@
+package com.baeldung.nanohttpd;
+
+import org.apache.commons.io.IOUtils;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.impl.client.HttpClientBuilder;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import java.io.IOException;
+
+import static org.junit.Assert.*;
+
+public class ApplicationControllerUnitTest {
+
+ private static final String BASE_URL = "http://localhost:8072/";
+ private static final HttpClient CLIENT = HttpClientBuilder.create().build();
+
+ @BeforeClass
+ public static void setUp() throws IOException {
+ new ApplicationController();
+ }
+
+ @Test
+ public void givenServer_whenRootRouteRequested_thenHelloWorldReturned() throws IOException {
+ HttpResponse response = CLIENT.execute(new HttpGet(BASE_URL));
+ assertTrue(IOUtils.toString(response.getEntity().getContent()).contains("Hello world!"));
+ assertEquals(200, response.getStatusLine().getStatusCode());
+ }
+
+ @Test
+ public void givenServer_whenUsersRequested_thenThenAllUsersReturned() throws IOException {
+ HttpResponse response = CLIENT.execute(new HttpGet(BASE_URL + "users"));
+ assertEquals("UserA, UserB, UserC", IOUtils.toString(response.getEntity().getContent()));
+ }
+}
\ No newline at end of file
diff --git a/libraries-server/src/test/java/com/baeldung/nanohttpd/ItemGetControllerUnitTest.java b/libraries-server/src/test/java/com/baeldung/nanohttpd/ItemGetControllerUnitTest.java
new file mode 100644
index 0000000000..3a4f0a4d98
--- /dev/null
+++ b/libraries-server/src/test/java/com/baeldung/nanohttpd/ItemGetControllerUnitTest.java
@@ -0,0 +1,37 @@
+package com.baeldung.nanohttpd;
+
+import static org.junit.Assert.*;
+
+import org.apache.commons.io.IOUtils;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.impl.client.HttpClientBuilder;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import java.io.IOException;
+
+public class ItemGetControllerUnitTest {
+
+ private static final String URL = "http://localhost:8071";
+ private static final HttpClient CLIENT = HttpClientBuilder.create().build();
+
+ @BeforeClass
+ public static void setUp() throws IOException {
+ new ItemGetController();
+ }
+
+ @Test
+ public void givenServer_whenDoingGet_thenParamIsReadCorrectly() throws IOException {
+ HttpResponse response = CLIENT.execute(new HttpGet(URL + "?itemId=1234"));
+ assertEquals("Requested itemId = 1234", IOUtils.toString(response.getEntity().getContent()));
+ }
+
+ @Test
+ public void givenServer_whenDoingPost_then404IsReturned() throws IOException {
+ HttpResponse response = CLIENT.execute(new HttpPost(URL));
+ assertEquals(404, response.getStatusLine().getStatusCode());
+ }
+}
\ No newline at end of file