| | |
| | | import com.sun.net.httpserver.Headers; |
| | | import com.sun.net.httpserver.HttpExchange; |
| | | import com.sun.net.httpserver.HttpHandler; |
| | | import de.uhilger.minsrv.Server; |
| | | import java.io.File; |
| | | import java.io.FileInputStream; |
| | | import java.io.IOException; |
| | |
| | | public static final String STR_BLANK = " "; |
| | | public static final String STR_DASH = "-"; |
| | | public static final String STR_COMMA = ","; |
| | | public static final String STR_SLASH = "/"; |
| | | public static final String STR_DOT = "."; |
| | | public static final String STR_NOT_FOUND = " not found."; |
| | | public static final String LM_PATTERN = "EEE, dd MMM yyyy HH:mm:ss zzz"; |
| | |
| | | if (headers.containsKey(RANGE_HEADER)) { |
| | | serveFileParts(e, new File(basePath, fName)); |
| | | } else { |
| | | if (fName.endsWith(STR_SLASH)) { |
| | | if (fName.endsWith(Server.STR_SLASH)) { |
| | | fName += WELCOME_FILE; |
| | | } |
| | | serveFile(e, new File(basePath, fName)); |
| | |
| | | } |
| | | } |
| | | |
| | | private String contentRangeHdr(Range range, File file) { |
| | | StringBuilder sb = new StringBuilder(); |
| | | sb.append(STR_BYTES); |
| | | sb.append(STR_BLANK); |
| | | sb.append(range.getStart()); |
| | | sb.append(STR_DASH); |
| | | sb.append(range.getEnd()); |
| | | sb.append(STR_SLASH); |
| | | sb.append(file.length()); |
| | | return sb.toString(); |
| | | } |
| | | |
| | | private void setCommonHeaders(Headers resHeaders, File file) throws IOException { |
| | | resHeaders.add(ACCEPT_RANGES_HEADER, STR_BYTES); |
| | | String mimeType = Files.probeContentType(file.toPath()); |
| | | if (mimeType != null) { |
| | | resHeaders.add(CONTENT_TYPE, mimeType); |
| | | } |
| | | SimpleDateFormat sdf = new SimpleDateFormat(LM_PATTERN); |
| | | Date date = new Date(file.lastModified()); |
| | | resHeaders.add(LAST_MODIFIED_DATE_HEADER, sdf.format(date)); |
| | | } |
| | | |
| | | /** |
| | | * Die Byte-Ranges aus dem Range-Header ermitteln. |
| | | * |
| | |
| | | } |
| | | |
| | | /** |
| | | * Einen Content-Range Header erzeugen |
| | | * |
| | | * @param range die Range, aus deren Inhalt der Header erzeugt werden soll |
| | | * @param file die Datei, die den Inhalt liefert, der vom Header |
| | | * bezeichnet wird |
| | | * @return der Inhalt des Content-Range Headers |
| | | */ |
| | | private String contentRangeHdr(Range range, File file) { |
| | | StringBuilder sb = new StringBuilder(); |
| | | sb.append(STR_BYTES); |
| | | sb.append(STR_BLANK); |
| | | sb.append(range.getStart()); |
| | | sb.append(STR_DASH); |
| | | sb.append(range.getEnd()); |
| | | sb.append(Server.STR_SLASH); |
| | | sb.append(file.length()); |
| | | return sb.toString(); |
| | | } |
| | | |
| | | /** |
| | | * Die Header erzeugen, die unabhängig davon, ob der ganze |
| | | * Inhalt oder nur Teile davon ausgeliefert werden sollen, in der |
| | | * Antwort stehen sollen |
| | | * |
| | | * @param resHeaders das Objekt, in das die Header erzeugt werden |
| | | * @param file die Datei, für die die Header gelten |
| | | * @throws IOException falls etwas schief geht entsteht dieser Fehler |
| | | */ |
| | | private void setCommonHeaders(Headers resHeaders, File file) throws IOException { |
| | | resHeaders.add(ACCEPT_RANGES_HEADER, STR_BYTES); |
| | | String mimeType = Files.probeContentType(file.toPath()); |
| | | if (mimeType != null) { |
| | | resHeaders.add(CONTENT_TYPE, mimeType); |
| | | } |
| | | SimpleDateFormat sdf = new SimpleDateFormat(LM_PATTERN); |
| | | Date date = new Date(file.lastModified()); |
| | | resHeaders.add(LAST_MODIFIED_DATE_HEADER, sdf.format(date)); |
| | | } |
| | | |
| | | /** |
| | | * Eine nicht gefunden Antwort senden |
| | | * |
| | | * @param e das Objekt mit Methoden zur Untersuchung der Anfrage sowie zum |
| | |
| | | * @param fname Name der Datei, die nicht gefunden wurde |
| | | * @throws IOException falls etwas schief geht entsteht dieser Fehler |
| | | */ |
| | | public void sendNotFound(HttpExchange e, String fname) throws IOException { |
| | | private void sendNotFound(HttpExchange e, String fname) throws IOException { |
| | | OutputStream os = e.getResponseBody(); |
| | | String response = fname + STR_NOT_FOUND; |
| | | byte[] bytes = response.getBytes(StandardCharsets.UTF_8); |
| | |
| | | } |
| | | |
| | | /** |
| | | * Eine Range |
| | | * Eine Range bezeichnet einen zusammenhängenden Bereich |
| | | * aus Bytes, der sich aus den Bytepositionen des Beginns und Endes |
| | | * des Bereiches ergibt. |
| | | */ |
| | | class Range { |
| | | |