aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Hawke <paul.hawke@gmail.com>2014-04-25 22:06:29 -0500
committerPaul Hawke <paul.hawke@gmail.com>2014-04-25 22:06:29 -0500
commitfe8be79fa8d8b131d5d39e77ae0baabd177d5ec1 (patch)
treea8db5b57389e41d5b360080aa1b779879a9c816f
parent4c5193750925d7081a4a12cea8f3a8d49fb56d8d (diff)
downloadnanohttpd-fe8be79fa8d8b131d5d39e77ae0baabd177d5ec1.tar.gz
Fix to only send content-length header if not already sent
-rw-r--r--core/src/main/java/fi/iki/elonen/NanoHTTPD.java59
1 files changed, 27 insertions, 32 deletions
diff --git a/core/src/main/java/fi/iki/elonen/NanoHTTPD.java b/core/src/main/java/fi/iki/elonen/NanoHTTPD.java
index 2676a70..ce292a4 100644
--- a/core/src/main/java/fi/iki/elonen/NanoHTTPD.java
+++ b/core/src/main/java/fi/iki/elonen/NanoHTTPD.java
@@ -1,19 +1,6 @@
package fi.iki.elonen;
-import java.io.BufferedReader;
-import java.io.ByteArrayInputStream;
-import java.io.Closeable;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.OutputStream;
-import java.io.PrintWriter;
-import java.io.RandomAccessFile;
-import java.io.PushbackInputStream;
-import java.io.UnsupportedEncodingException;
+import java.io.*;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
@@ -218,7 +205,9 @@ public abstract class NanoHTTPD {
try {
safeClose(myServerSocket);
closeAllConnections();
- myThread.join();
+ if (myThread != null) {
+ myThread.join();
+ }
} catch (Exception e) {
e.printStackTrace();
}
@@ -227,8 +216,7 @@ public abstract class NanoHTTPD {
/**
* Registers that a new connection has been set up.
*
- * @param socket
- * the {@link Socket} for the connection.
+ * @param socket the {@link Socket} for the connection.
*/
public synchronized void registerConnection(Socket socket) {
openConnections.add(socket);
@@ -606,7 +594,7 @@ public abstract class NanoHTTPD {
public void addHeader(String name, String value) {
header.put(name, value);
}
-
+
public String getHeader(String name) {
return header.get(name);
}
@@ -646,7 +634,11 @@ public abstract class NanoHTTPD {
if (requestMethod != Method.HEAD && chunkedTransfer) {
sendAsChunked(outputStream, pw);
} else {
- sendAsFixedLength(outputStream, pw);
+ int pending = data != null ? data.available() : 0;
+ sendContentLengthHeaderIfNotAlreadyPresent(pw, header, pending);
+ pw.print("\r\n");
+ pw.flush();
+ sendAsFixedLength(outputStream, pending);
}
outputStream.flush();
safeClose(data);
@@ -655,16 +647,26 @@ public abstract class NanoHTTPD {
}
}
- protected void sendConnectionHeaderIfNotAlreadyPresent(PrintWriter pw, Map<String, String> header) {
- boolean connectionAlreadySent = false;
- for (String headerName : header.keySet()) {
- connectionAlreadySent |= headerName.equalsIgnoreCase("connection");
+ protected void sendContentLengthHeaderIfNotAlreadyPresent(PrintWriter pw, Map<String, String> header, int size) {
+ if (!headerAlreadySent(header, "content-length")) {
+ pw.print("Content-Length: "+ size +"\r\n");
}
- if (!connectionAlreadySent) {
+ }
+
+ protected void sendConnectionHeaderIfNotAlreadyPresent(PrintWriter pw, Map<String, String> header) {
+ if (!headerAlreadySent(header, "connection")) {
pw.print("Connection: keep-alive\r\n");
}
}
+ private boolean headerAlreadySent(Map<String, String> header, String name) {
+ boolean alreadySent = false;
+ for (String headerName : header.keySet()) {
+ alreadySent |= headerName.equalsIgnoreCase(name);
+ }
+ return alreadySent;
+ }
+
private void sendAsChunked(OutputStream outputStream, PrintWriter pw) throws IOException {
pw.print("Transfer-Encoding: chunked\r\n");
pw.print("\r\n");
@@ -681,13 +683,7 @@ public abstract class NanoHTTPD {
outputStream.write(String.format("0\r\n\r\n").getBytes());
}
- private void sendAsFixedLength(OutputStream outputStream, PrintWriter pw) throws IOException {
- int pending = data != null ? data.available() : 0; // This is to support partial sends, see serveFile()
- pw.print("Content-Length: "+pending+"\r\n");
-
- pw.print("\r\n");
- pw.flush();
-
+ private void sendAsFixedLength(OutputStream outputStream, int pending) throws IOException {
if (requestMethod != Method.HEAD && data != null) {
int BUFFER_SIZE = 16 * 1024;
byte[] buff = new byte[BUFFER_SIZE];
@@ -697,7 +693,6 @@ public abstract class NanoHTTPD {
break;
}
outputStream.write(buff, 0, read);
-
pending -= read;
}
}