package com.airbnb.airpal.resources; import com.airbnb.airpal.core.store.files.ExpiringFileStore; import com.google.common.io.ByteStreams; import com.google.inject.Inject; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import javax.ws.rs.core.StreamingOutput; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.OutputStream; @Path("/api/files") public class FilesResource { private final ExpiringFileStore fileStore; @Inject public FilesResource(ExpiringFileStore fileStore) { this.fileStore = fileStore; } @GET @Path("/{fileName}") @Produces(MediaType.APPLICATION_OCTET_STREAM) public Response getFile(@PathParam("fileName") String fileName) { final File file = fileStore.get(fileName); if (file == null) { return Response.status(Response.Status.NOT_FOUND).build(); } else { return Response.ok(new StreamingOutput() { @Override public void write(OutputStream output) throws IOException, WebApplicationException { // TODO: Make this use chunked encoding? try (FileInputStream inputStream = new FileInputStream(file)) { ByteStreams.copy(inputStream, output); } finally { output.close(); } } }).build(); } } }