/* * Copyright 2006-2008 Sxip Identity Corporation */ package org.openid4java.discovery.yadis; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import java.io.*; /** * Simple servlet that builds up responses from varios test-data files * for testing the Yadis protocol. * * @author Marius Scurtescu, Johnny Bufu */ public class YadisTestServlet extends HttpServlet { String _testDataPath; public YadisTestServlet() throws ServletException { _testDataPath = System.getProperty("YADIS_TEST_DATA"); if (_testDataPath == null) throw new ServletException("YADIS_TEST_DATA path not initialized"); } public void doHead(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // set the headers String headersFile = request.getParameter("headers"); setHeadersFromFile(headersFile, response); } /** * Builds a response based on the parameters received in the request, * with the following conventions: * * - the header name-values are extracted from a file with the name specified * by the "headers" or "getheaders" (if they need to be different * for HEAD and GET requests) parameters; * the file should contain a "headername=value" pair on each line * Status code should be given on a line with the header name "status" * * - if there is a "xrds" parameter, its value should point to a file * which is streamed for download * * - otherwise, if there is a "html" parameter, its value should point * to a file which is returned as a HTML resonse * * Headers will always be set if specified; only one of "xrds" and "html" * (in this order) will be handled. */ public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String headersFile = request.getParameter("headers"); String getHeadersFile = request.getParameter("getheaders"); String xrdsFile = request.getParameter("xrds"); String htmlFile = request.getParameter("html"); // set the headers if (getHeadersFile != null) setHeadersFromFile(getHeadersFile, response); else if (headersFile != null) setHeadersFromFile(headersFile, response); // XRDS download if (xrdsFile != null) { BufferedInputStream input = new BufferedInputStream( new FileInputStream(_testDataPath + "/xrds/" + xrdsFile)); ServletOutputStream output = response.getOutputStream(); byte[] data = new byte[8192]; int bytesRead = input.read(data, 0, data.length); while (bytesRead > 0) { output.write(data, 0, bytesRead); bytesRead = input.read(data, 0, data.length); } input.close(); output.close(); } else if (htmlFile != null) // HTML response { BufferedReader input = new BufferedReader( new FileReader(_testDataPath + "/html/" + htmlFile)); //PrintWriter output = new PrintWriter( response.getWriter()); ServletOutputStream output = response.getOutputStream(); String line = input.readLine(); while (line != null) { output.println(line); line = input.readLine(); } input.close(); output.close(); } } private void setHeadersFromFile(String filename, HttpServletResponse response) throws IOException { BufferedReader input = new BufferedReader( new FileReader(_testDataPath + "/headers/" + filename)); String line; while ((line = input.readLine()) != null) { int equalPos = line.indexOf("="); if (equalPos > -1) { String headerName = line.substring(0, equalPos); String headerValue = line.substring(equalPos + 1); if (headerName.equals("status")) response.setStatus(Integer.parseInt(headerValue)); else { response.addHeader(headerName, headerValue); } } } } }