@@ -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