aboutsummaryrefslogtreecommitdiff
path: root/webserver/src/main
diff options
context:
space:
mode:
authorritchie <ritchie@gmx.at>2015-05-14 09:40:10 +0200
committerritchie <ritchie@gmx.at>2015-05-14 09:40:10 +0200
commit9e1ec7bff40d70d31953a04dd448665aaf549395 (patch)
treee775b6e887e3747648e9dbc87a953e6f1863e9e0 /webserver/src/main
parentd685218eacc23e69f685a76113665f50cc560edf (diff)
downloadnanohttpd-9e1ec7bff40d70d31953a04dd448665aaf549395.tar.gz
some cleanup and mergig for #122 also long as resquest size added
Diffstat (limited to 'webserver/src/main')
-rw-r--r--webserver/src/main/java/fi/iki/elonen/InternalRewrite.java8
-rw-r--r--webserver/src/main/java/fi/iki/elonen/ServerRunner.java8
-rw-r--r--webserver/src/main/java/fi/iki/elonen/SimpleWebServer.java75
-rw-r--r--webserver/src/main/java/fi/iki/elonen/WebServerPlugin.java8
-rw-r--r--webserver/src/main/java/fi/iki/elonen/WebServerPluginInfo.java8
5 files changed, 70 insertions, 37 deletions
diff --git a/webserver/src/main/java/fi/iki/elonen/InternalRewrite.java b/webserver/src/main/java/fi/iki/elonen/InternalRewrite.java
index fe9d2a4..960f2e7 100644
--- a/webserver/src/main/java/fi/iki/elonen/InternalRewrite.java
+++ b/webserver/src/main/java/fi/iki/elonen/InternalRewrite.java
@@ -8,18 +8,18 @@ package fi.iki.elonen;
* %%
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
- *
+ *
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
- *
+ *
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
- *
+ *
* 3. Neither the name of the nanohttpd nor the names of its contributors
* may be used to endorse or promote products derived from this software without
* specific prior written permission.
- *
+ *
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
diff --git a/webserver/src/main/java/fi/iki/elonen/ServerRunner.java b/webserver/src/main/java/fi/iki/elonen/ServerRunner.java
index 039aac0..d08eb01 100644
--- a/webserver/src/main/java/fi/iki/elonen/ServerRunner.java
+++ b/webserver/src/main/java/fi/iki/elonen/ServerRunner.java
@@ -8,18 +8,18 @@ package fi.iki.elonen;
* %%
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
- *
+ *
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
- *
+ *
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
- *
+ *
* 3. Neither the name of the nanohttpd nor the names of its contributors
* may be used to endorse or promote products derived from this software without
* specific prior written permission.
- *
+ *
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
diff --git a/webserver/src/main/java/fi/iki/elonen/SimpleWebServer.java b/webserver/src/main/java/fi/iki/elonen/SimpleWebServer.java
index fec6c1d..acedc4a 100644
--- a/webserver/src/main/java/fi/iki/elonen/SimpleWebServer.java
+++ b/webserver/src/main/java/fi/iki/elonen/SimpleWebServer.java
@@ -8,18 +8,18 @@ package fi.iki.elonen;
* %%
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
- *
+ *
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
- *
+ *
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
- *
+ *
* 3. Neither the name of the nanohttpd nor the names of its contributors
* may be used to endorse or promote products derived from this software without
* specific prior written permission.
- *
+ *
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
@@ -35,6 +35,7 @@ package fi.iki.elonen;
import java.io.File;
import java.io.FileInputStream;
+import java.io.FileNotFoundException;
import java.io.FilenameFilter;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
@@ -511,13 +512,27 @@ public class SimpleWebServer extends NanoHTTPD {
}
}
+ // get if-range header. If present, it must match etag or else we
+ // should ignore the range request
+ String ifRange = header.get("if-range");
+ boolean headerIfRangeMissingOrMatching = (ifRange == null || etag.equals(ifRange));
+
+ String ifNoneMatch = header.get("if-none-match");
+ boolean headerIfNoneMatchPresentAndMatching = ifNoneMatch != null && (ifNoneMatch.equals("*") || ifNoneMatch.equals(etag));
+
// Change return code and add Content-Range header when skipping is
// requested
long fileLen = file.length();
- if (range != null && startFrom >= 0) {
- if (startFrom >= fileLen) {
- res = newFixedLengthResponse(Response.Status.RANGE_NOT_SATISFIABLE, NanoHTTPD.MIME_PLAINTEXT, "");
- res.addHeader("Content-Range", "bytes 0-0/" + fileLen);
+
+ if (headerIfRangeMissingOrMatching && range != null && startFrom >= 0 && startFrom < fileLen) {
+ // range request that matches current etag
+ // and the startFrom of the range is satisfiable
+ if (headerIfNoneMatchPresentAndMatching) {
+ // range request that matches current etag
+ // and the startFrom of the range is satisfiable
+ // would return range from file
+ // respond with not-modified
+ res = newFixedLengthResponse(Response.Status.NOT_MODIFIED, mime, "");
res.addHeader("ETag", etag);
} else {
if (endAt < 0) {
@@ -528,28 +543,39 @@ public class SimpleWebServer extends NanoHTTPD {
newLen = 0;
}
- final long dataLen = newLen;
- FileInputStream fis = new FileInputStream(file) {
-
- @Override
- public int available() throws IOException {
- return (int) dataLen;
- }
- };
+ FileInputStream fis = new FileInputStream(file);
fis.skip(startFrom);
- res = newFixedLengthResponse(Response.Status.PARTIAL_CONTENT, mime, fis, (int) file.length());
+ res = newFixedLengthResponse(Response.Status.PARTIAL_CONTENT, mime, fis, newLen);
res.addHeader("Accept-Ranges", "bytes");
- res.addHeader("Content-Length", "" + dataLen);
+ res.addHeader("Content-Length", "" + newLen);
res.addHeader("Content-Range", "bytes " + startFrom + "-" + endAt + "/" + fileLen);
res.addHeader("ETag", etag);
}
} else {
- if (etag.equals(header.get("if-none-match"))) {
+
+ if (headerIfRangeMissingOrMatching && range != null && startFrom >= fileLen) {
+ // return the size of the file
+ // 4xx responses are not trumped by if-none-match
+ res = newFixedLengthResponse(Response.Status.RANGE_NOT_SATISFIABLE, NanoHTTPD.MIME_PLAINTEXT, "");
+ res.addHeader("Content-Range", "bytes */" + fileLen);
+ res.addHeader("ETag", etag);
+ } else if (range == null && headerIfNoneMatchPresentAndMatching) {
+ // full-file-fetch request
+ // would return entire file
+ // respond with not-modified
res = newFixedLengthResponse(Response.Status.NOT_MODIFIED, mime, "");
+ res.addHeader("ETag", etag);
+ } else if (!headerIfRangeMissingOrMatching && headerIfNoneMatchPresentAndMatching) {
+ // range request that doesn't match current etag
+ // would return entire (different) file
+ // respond with not-modified
+
+ res = newFixedLengthResponse(Response.Status.NOT_MODIFIED, mime, "");
+ res.addHeader("ETag", etag);
} else {
- res = newFixedLengthResponse(Response.Status.OK, mime, new FileInputStream(file), (int) file.length());
- res.addHeader("Accept-Ranges", "bytes");
+ // supply the file
+ res = newFixedFileResponse(file, mime);
res.addHeader("Content-Length", "" + fileLen);
res.addHeader("ETag", etag);
}
@@ -560,4 +586,11 @@ public class SimpleWebServer extends NanoHTTPD {
return res;
}
+
+ private Response newFixedFileResponse(File file, String mime) throws FileNotFoundException {
+ Response res;
+ res = newFixedLengthResponse(Response.Status.OK, mime, new FileInputStream(file), (int) file.length());
+ res.addHeader("Accept-Ranges", "bytes");
+ return res;
+ }
}
diff --git a/webserver/src/main/java/fi/iki/elonen/WebServerPlugin.java b/webserver/src/main/java/fi/iki/elonen/WebServerPlugin.java
index bfd5000..8b490d3 100644
--- a/webserver/src/main/java/fi/iki/elonen/WebServerPlugin.java
+++ b/webserver/src/main/java/fi/iki/elonen/WebServerPlugin.java
@@ -8,18 +8,18 @@ package fi.iki.elonen;
* %%
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
- *
+ *
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
- *
+ *
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
- *
+ *
* 3. Neither the name of the nanohttpd nor the names of its contributors
* may be used to endorse or promote products derived from this software without
* specific prior written permission.
- *
+ *
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
diff --git a/webserver/src/main/java/fi/iki/elonen/WebServerPluginInfo.java b/webserver/src/main/java/fi/iki/elonen/WebServerPluginInfo.java
index 72a5df9..0fe5f4e 100644
--- a/webserver/src/main/java/fi/iki/elonen/WebServerPluginInfo.java
+++ b/webserver/src/main/java/fi/iki/elonen/WebServerPluginInfo.java
@@ -8,18 +8,18 @@ package fi.iki.elonen;
* %%
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
- *
+ *
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
- *
+ *
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
- *
+ *
* 3. Neither the name of the nanohttpd nor the names of its contributors
* may be used to endorse or promote products derived from this software without
* specific prior written permission.
- *
+ *
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.