Skip to content

Commit 403771a

Browse files
committed
WarcServer: support serving resource records
1 parent 38a9270 commit 403771a

File tree

1 file changed

+32
-17
lines changed

1 file changed

+32
-17
lines changed

src/org/netpreserve/jwarc/net/WarcServer.java

Lines changed: 32 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -142,27 +142,42 @@ private void replay(HttpExchange exchange, String target, Instant date, boolean
142142
try (FileChannel channel = FileChannel.open(capture.file(), READ)) {
143143
channel.position(capture.position());
144144
WarcReader reader = new WarcReader(channel);
145-
WarcResponse record = (WarcResponse) reader.next().get();
146-
HttpResponse http = record.http();
147-
HttpResponse.Builder b = new HttpResponse.Builder(http.status(), http.reason());
148-
for (Map.Entry<String, List<String>> e : http.headers().map().entrySet()) {
149-
if (e.getKey().equalsIgnoreCase("Strict-Transport-Security")) continue;
150-
if (e.getKey().equalsIgnoreCase("Transfer-Encoding")) continue;
151-
if (e.getKey().equalsIgnoreCase("Public-Key-Pins")) continue;
152-
for (String value : e.getValue()) {
153-
b.addHeader(e.getKey(), value);
145+
WarcRecord record = reader.next().get();
146+
HttpResponse.Builder responseBuilder;
147+
MessageBody body;
148+
MediaType contentType = MediaType.OCTET_STREAM;
149+
if (record instanceof WarcResponse) {
150+
HttpResponse http = ((WarcResponse)record).http();
151+
responseBuilder = new HttpResponse.Builder(http.status(), http.reason());
152+
for (Map.Entry<String, List<String>> entry : http.headers().map().entrySet()) {
153+
if (entry.getKey().equalsIgnoreCase("Strict-Transport-Security")) continue;
154+
if (entry.getKey().equalsIgnoreCase("Transfer-Encoding")) continue;
155+
if (entry.getKey().equalsIgnoreCase("Public-Key-Pins")) continue;
156+
if (entry.getKey().equalsIgnoreCase("Content-Type")) {
157+
contentType = MediaType.parseLeniently(entry.getValue().get(0));
158+
}
159+
for (String value : entry.getValue()) {
160+
responseBuilder.addHeader(entry.getKey(), value);
161+
}
154162
}
163+
body = http.body();
164+
} else if (record instanceof WarcResource) {
165+
responseBuilder = new HttpResponse.Builder(200, "OK");
166+
contentType = record.contentType();
167+
body = record.body();
168+
} else {
169+
throw new IllegalArgumentException("Unexpected record type: " + record.getClass());
155170
}
156-
b.setHeader("Connection", "keep-alive");
157-
b.setHeader("Memento-Datetime", RFC_1123_UTC.format(record.date()));
158-
if (!proxy) b.setHeader("Link", mementoLinks(versions, capture));
159-
if (proxy) b.setHeader("Vary", "Accept-Datetime");
160-
MessageBody body = http.body();
161-
if (!proxy && HTML.equals(http.contentType().base())) {
171+
responseBuilder.setHeader("Connection", "keep-alive");
172+
responseBuilder.setHeader("Memento-Datetime", RFC_1123_UTC.format(record.date()));
173+
if (!proxy) responseBuilder.setHeader("Link", mementoLinks(versions, capture));
174+
if (proxy) responseBuilder.setHeader("Vary", "Accept-Datetime");
175+
176+
if (!proxy && HTML.equals(contentType.base())) {
162177
body = LengthedBody.create(body, ByteBuffer.wrap(script.getBytes(US_ASCII)), script.length() + body.size());
163178
}
164-
b.body(http.contentType(), body, body.size());
165-
exchange.send(b.build());
179+
responseBuilder.body(contentType, body, body.size());
180+
exchange.send(responseBuilder.build());
166181
}
167182
}
168183

0 commit comments

Comments
 (0)