1   /*
2    * Copyright 2004 Sun Microsystems, Inc.
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    *     http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   *
16   */
17  package com.sun.syndication.fetcher.impl;
18  
19  import java.io.BufferedReader;
20  import java.io.IOException;
21  import java.io.InputStream;
22  import java.io.InputStreamReader;
23  import java.io.OutputStream;
24  import java.util.zip.GZIPOutputStream;
25  
26  import javax.servlet.ServletException;
27  import javax.servlet.http.HttpServletRequest;
28  import javax.servlet.http.HttpServletResponse;
29  
30  
31  public class FetcherTestServlet extends javax.servlet.http.HttpServlet {
32  
33  	/***
34  	 * @see javax.servlet.http.HttpServlet#doGet(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
35  	 */
36  	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
37  		
38  		if ("TRUE".equalsIgnoreCase(request.getParameter("redirect"))) {
39  			//	testing redirection support			
40  			response.sendRedirect(request.getRequestURI());
41  			return;
42  		} else if (request.getParameter("error") != null) {
43  			//response.sendError(HttpServletResponse.SC_NOT_FOUND);	
44  			int errorToThrow = Integer.parseInt(request.getParameter("error"));
45  			response.sendError(errorToThrow);
46  			return;
47  		} else {
48  			
49  			// We manually set the date headers using strings
50  			// instead of the get/setDateHeader methods because
51  			// those methods return longs, which has too much
52  			// precision for the real date headers
53  			// this is just a random date
54  			String lastModifiedDate = "Thu, 08 Jan 2009 23:06:39 GMT"; 
55  			String eTag = "123456";
56  			
57  			if ("TRUE".equalsIgnoreCase(request.getParameter("refreshfeed"))) {
58  				lastModifiedDate = "Fri, 09 Jan 2009 12:06:39 GMT";
59  				eTag = "abcde"; 
60  			}
61  			
62  			boolean serveFeed = checkModified(request, lastModifiedDate, eTag);
63  			boolean gzip = "TRUE".equalsIgnoreCase(request.getParameter("gzipfeed"));
64  			
65  			if (serveFeed) {
66  				sendFeedData(response, lastModifiedDate, eTag, gzip);
67  				return;					
68  			} else {
69  				response.sendError(HttpServletResponse.SC_NOT_MODIFIED);
70  				return;							
71  			}
72  		}							
73  	}
74  
75  	private boolean checkModified(HttpServletRequest request, String lastModifiedDate, String eTag) {
76  		
77  		String requestedETag = request.getHeader("If-None-Match");			
78  		String requestedLastModified = request.getHeader("If-Modified-Since");
79  		boolean modified = true;
80  		boolean mustServer = false;			
81  		if (requestedETag != null) {
82  			if (eTag.equals(requestedETag)) {
83  				modified = false;
84  			} else {
85  				modified = true;
86  				mustServer = true;				
87  			}
88  		}
89  		if (requestedLastModified != null) {
90  			if (lastModifiedDate.equals(requestedLastModified)) {
91  				modified = false;
92  			} else {
93  				modified = true;
94  				mustServer = true;					
95  			}
96  		}
97  		boolean serveFeed = (modified || mustServer);
98  		return serveFeed;
99  	}
100 
101 	private void sendFeedData(HttpServletResponse response, String lastModifiedDate, String eTag, boolean gzip) throws IOException {
102 	    OutputStream out = null;
103 	    if (gzip) {
104 	        response.setHeader("Content-Encoding", "gzip");
105 	        out = new GZIPOutputStream(response.getOutputStream());	        
106 	    } else {
107 	        out = response.getOutputStream();
108 	    }
109 	    
110 	    
111 		response.setContentType("text/xml");
112 		if (eTag != null) {
113 			response.setHeader("ETag", eTag);
114 		}		
115 		if (lastModifiedDate != null) {
116 			response.setHeader("Last-Modified", lastModifiedDate);
117 		}
118 		
119 		InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("/atom_0.3.xml");
120 		if (inputStream == null) {
121 		    inputStream = this.getClass().getResourceAsStream("/atom_0.3.xml");
122 		}
123 		
124 		BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
125 		try {
126 			String line;
127 			while ((line = reader.readLine()) != null) {									
128 				//response.getWriter().println(line);
129 			    out.write(line.getBytes());
130 				line = null;
131 			}
132 		} finally {
133 			if (reader != null) {
134 			    reader.close();
135 			}
136 		}
137 		
138 		out.close();
139 	}
140 }