Skip to content

Commit 0b1f2e1

Browse files
committed
Added static files
1 parent 53c1741 commit 0b1f2e1

8 files changed

Lines changed: 133 additions & 53 deletions

File tree

‎src/main/java/org/javawebstack/httpserver/Exchange.java‎

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,14 @@ public Exchange write(byte[] bytes, int offset, int length){
114114
} catch (IOException ignored){}
115115
return this;
116116
}
117+
public Exchange write(InputStream stream) throws IOException {
118+
byte[] buffer = new byte[1024];
119+
int r;
120+
while ((r = stream.read(buffer)) != -1)
121+
write(buffer, 0, r);
122+
stream.close();
123+
return this;
124+
}
117125
public Exchange close() {
118126
try {
119127
response.getOutputStream().close();
@@ -161,10 +169,8 @@ public Locale locale(Locale... possible){
161169
return possible[0];
162170
}
163171

164-
public Exchange contentType(MimeType type){
165-
if (type == null)
166-
return contentType("text/plain");
167-
return contentType(type.getMimeTypes().get(0));
172+
public Exchange contentType(MimeType type) {
173+
return contentType(type != null ? type.getMimeTypes().get(0): null);
168174
}
169175

170176
public Exchange contentType(String contentType) {

‎src/main/java/org/javawebstack/httpserver/HTTPServer.java‎

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020
import org.eclipse.jetty.server.Server;
2121
import org.eclipse.jetty.server.handler.AbstractHandler;
2222
import org.javawebstack.httpserver.handler.*;
23+
import org.javawebstack.httpserver.util.DirectoryFileProvider;
24+
import org.javawebstack.httpserver.util.ResourceFileProvider;
2325
import org.javawebstack.httpserver.websocket.InternalWebSocketAdapter;
2426
import org.javawebstack.httpserver.websocket.InternalWebSocketRequestHandler;
2527
import org.javawebstack.injector.Injector;
@@ -130,13 +132,25 @@ public HTTPServer delete(String pattern, RequestHandler... handlers){
130132
}
131133

132134
public HTTPServer staticDirectory(String pathPrefix, File directory){
133-
return get(pathPrefix+(pathPrefix.endsWith("/") ? "" : "/")+"{*:path}", new StaticDirectoryHandler(directory));
135+
return staticHandler(pathPrefix, new StaticFileHandler().add(new DirectoryFileProvider(directory)));
134136
}
135137

136138
public HTTPServer staticDirectory(String pathPrefix, String directory){
137139
return staticDirectory(pathPrefix, new File(directory));
138140
}
139141

142+
public HTTPServer staticResourceDirectory(String pathPrefix, String prefix){
143+
return staticResourceDirectory(pathPrefix, null, prefix);
144+
}
145+
146+
public HTTPServer staticResourceDirectory(String pathPrefix, ClassLoader classLoader, String prefix){
147+
return staticHandler(pathPrefix, new StaticFileHandler().add(new ResourceFileProvider(classLoader, prefix)));
148+
}
149+
150+
public HTTPServer staticHandler(String pathPrefix, StaticFileHandler handler) {
151+
return get(pathPrefix+(pathPrefix.endsWith("/") ? "" : "/")+"{*:path}", handler);
152+
}
153+
140154
public HTTPServer beforeDelete(String pattern, RequestHandler... handlers){
141155
return beforeRoute(HttpMethod.DELETE, pattern, handlers);
142156
}

‎src/main/java/org/javawebstack/httpserver/handler/StaticDirectoryHandler.java‎

Lines changed: 0 additions & 48 deletions
This file was deleted.
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package org.javawebstack.httpserver.handler;
2+
3+
import org.javawebstack.httpserver.Exchange;
4+
import org.javawebstack.httpserver.helper.MimeType;
5+
import org.javawebstack.httpserver.util.FileProvider;
6+
7+
import java.io.*;
8+
import java.util.ArrayList;
9+
import java.util.List;
10+
11+
public class StaticFileHandler implements RequestHandler {
12+
13+
private final List<FileProvider> providers = new ArrayList<>();
14+
15+
public StaticFileHandler add(FileProvider provider) {
16+
providers.add(provider);
17+
return this;
18+
}
19+
20+
public Object handle(Exchange exchange) {
21+
String path = (String) exchange.pathVariables.get("path");
22+
InputStream stream = null;
23+
for(FileProvider provider : providers) {
24+
stream = provider.getFile(path);
25+
if(stream != null)
26+
break;
27+
}
28+
if(stream == null)
29+
return null;
30+
exchange.contentType(MimeType.byFileName(path));
31+
try {
32+
exchange.write(stream);
33+
} catch (IOException exception) {
34+
return null;
35+
}
36+
return "";
37+
}
38+
39+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package org.javawebstack.httpserver.util;
2+
3+
import java.io.File;
4+
import java.io.FileInputStream;
5+
import java.io.FileNotFoundException;
6+
import java.io.InputStream;
7+
8+
public class DirectoryFileProvider implements FileProvider {
9+
10+
private final File directory;
11+
12+
public DirectoryFileProvider(File directory) {
13+
this.directory = directory;
14+
}
15+
16+
public InputStream getFile(String path) {
17+
File file = new File(directory, path);
18+
if(!file.exists() || !file.isFile() || !isInside(directory, file))
19+
return null;
20+
try {
21+
return new FileInputStream(file);
22+
} catch (FileNotFoundException ignored) {}
23+
return null;
24+
}
25+
26+
private static boolean isInside(File directory, File file) {
27+
if(file.getParentFile().equals(directory))
28+
return true;
29+
if(directory.getParentFile() == null)
30+
return false;
31+
return isInside(directory.getParentFile(), file);
32+
}
33+
34+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package org.javawebstack.httpserver.util;
2+
3+
import java.io.InputStream;
4+
5+
public interface FileProvider {
6+
7+
InputStream getFile(String path);
8+
9+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package org.javawebstack.httpserver.util;
2+
3+
import java.io.InputStream;
4+
5+
public class ResourceFileProvider implements FileProvider {
6+
7+
private final ClassLoader classLoader;
8+
private final String prefix;
9+
10+
public ResourceFileProvider(ClassLoader classLoader, String prefix) {
11+
this.classLoader = classLoader != null ? classLoader : ClassLoader.getSystemClassLoader();
12+
this.prefix = prefix;
13+
}
14+
15+
public ResourceFileProvider(String prefix) {
16+
this(null, prefix);
17+
}
18+
19+
public InputStream getFile(String path) {
20+
return classLoader.getResourceAsStream(prefix + ((!prefix.endsWith("/") && !path.startsWith("/")) ? "/" : "") + path);
21+
}
22+
23+
}

‎src/main/resources/files/test.json‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"a": "Ein Töööööst"
3+
}

0 commit comments

Comments
 (0)