Skip to content

Commit 13d9fb6

Browse files
committed
Add range endpoint
1 parent 436b474 commit 13d9fb6

File tree

2 files changed

+52
-0
lines changed

2 files changed

+52
-0
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ Java httpbin supports a subset of httpbin endpoints:
3131
- `/delay/:n` Delays responding for _min(n, 10)_ seconds.
3232
- `/bytes/:n` Generates _n_ random bytes of binary data, accepts optional _seed_ integer parameter.
3333
- `/base64/:s` Returns a base64 decoded :s input
34+
- `/range/:s` Return a subset of data based on Content-range header.
3435
- `/cookies` Returns the cookies.
3536
- `/cookies/set?name=value` Sets one or more simple cookies.
3637
- `/cookies/delete?name` Deletes one or more simple cookies.

src/main/java/org/gaul/httpbin/HttpBinHandler.java

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -560,6 +560,57 @@ baos, new Deflater(Deflater.DEFAULT_COMPRESSION,
560560
servletResponse.setStatus(HttpServletResponse.SC_OK);
561561
os.write(body);
562562
os.flush();
563+
baseRequest.setHandled(true);
564+
return;
565+
} else if (method.equals("GET") && uri.startsWith("/range/")) {
566+
Utils.copy(is, Utils.NULL_OUTPUT_STREAM);
567+
568+
long size = Long.parseLong(uri.substring("/range/".length()));
569+
long start;
570+
long end;
571+
String range = request.getHeader("Range");
572+
if (range != null && range.startsWith("bytes=")) {
573+
range = range.substring("bytes=".length());
574+
String[] ranges = range.split("-", 2);
575+
if (ranges[0].isEmpty()) {
576+
start = size - Long.parseLong(ranges[1]);
577+
end = size - 1;
578+
} else if (ranges[1].isEmpty()) {
579+
start = Long.parseLong(ranges[0]);
580+
end = size - 1;
581+
} else {
582+
start = Long.parseLong(ranges[0]);
583+
end = Long.parseLong(ranges[1]);
584+
}
585+
if (end + 1 > size || start > end) {
586+
servletResponse.setStatus(HttpServletResponse.
587+
SC_REQUESTED_RANGE_NOT_SATISFIABLE);
588+
servletResponse.addHeader("ETag", "range" + size);
589+
servletResponse.addHeader("Content-Range",
590+
"bytes */" + size);
591+
baseRequest.setHandled(true);
592+
return;
593+
}
594+
servletResponse.setStatus(
595+
HttpServletResponse.SC_PARTIAL_CONTENT);
596+
} else {
597+
start = 0;
598+
end = size - 1;
599+
servletResponse.setStatus(HttpServletResponse.SC_OK);
600+
}
601+
602+
servletResponse.addHeader("ETag", "range" + size);
603+
servletResponse.addHeader("Content-Length",
604+
String.valueOf(end - start + 1));
605+
servletResponse.addHeader("Content-Range",
606+
"bytes " + start + "-" + end + "/" + size);
607+
servletResponse.addHeader("Accept-ranges", "bytes");
608+
609+
for (long i = start; i <= end; ++i) {
610+
os.write((char) ('a' + (i % 26)));
611+
}
612+
os.flush();
613+
563614
baseRequest.setHandled(true);
564615
return;
565616
} else if (method.equals("GET") && uri.equals("/image/jpeg")) {

0 commit comments

Comments
 (0)