Java tutorial
/* Copyright (C) 2011 Anton Vodonosov (avodonosov@yandex.ru) * See LICENSE for details. */ package cltestgrid; import com.google.appengine.api.files.AppEngineFile; import com.google.appengine.api.files.FileReadChannel; import com.google.appengine.api.files.FileServiceFactory; import org.apache.commons.io.IOUtils; import java.io.BufferedInputStream; import java.io.IOException; import java.io.InputStream; import java.nio.channels.Channels; import java.util.zip.GZIPInputStream; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import static javax.servlet.http.HttpServletResponse.SC_MOVED_PERMANENTLY; import javax.servlet.ServletException; public class GetBlob extends HttpServlet { public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException { String userAgent = req.getHeader("User-Agent"); if (userAgent != null && userAgent.contains("Baiduspider")) { resp.setStatus(SC_MOVED_PERMANENTLY); resp.setHeader("Location", "http://www.baidu.com/search/spider.html"); resp.setHeader("X-READ-ME", "Please honor robots.txt and don't waste our resources. http://cl-test-grid.appspot.com/robots.txt"); return; } final String key = req.getParameter("key"); String filename = "/gs/cl-test-grid-logs/" + key; AppEngineFile file = new AppEngineFile(filename); FileReadChannel readChannel = null; InputStream inputStream = null; try { final boolean lock = false; readChannel = FileServiceFactory.getFileService().openReadChannel(file, lock); inputStream = Channels.newInputStream(readChannel); resp.setContentType("text/plain"); // The log files are gzipped, but we can't serve gzipped content, // because GAE gzips servlet output itlself and so logs would end-up gzipped twice. // Therefore we need to ungzip the log. InputStream ungzipper = new GZIPInputStream(new BufferedInputStream(inputStream, 100 * 1024)); IOUtils.copy(ungzipper, resp.getOutputStream()); resp.getOutputStream().flush(); } finally { IOUtils.closeQuietly(inputStream); IOUtils.closeQuietly(readChannel); } } }