Skip to content
This repository was archived by the owner on Oct 20, 2022. It is now read-only.

Commit 2791a53

Browse files
Fix the response content type of JSON/P
1 parent a263d09 commit 2791a53

File tree

2 files changed

+111
-20
lines changed

2 files changed

+111
-20
lines changed

src/main/java/com/google/visualization/datasource/ResponseWriter.java

Lines changed: 32 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@ public class ResponseWriter {
4040
*/
4141
private ResponseWriter() {}
4242

43-
4443
/**
4544
* Sets the specified responseMessage on the given <code>HttpServletResponse</code>.
4645
* This method assumes the <code>StatusType</code> is 'OK'.
@@ -56,17 +55,24 @@ public static void setServletResponse(String responseMessage,
5655
OutputType type = dataSourceParameters.getOutputType();
5756
switch (type) {
5857
case CSV:
59-
setServletResponseCSV(responseMessage, dataSourceParameters, res);
58+
setServletResponseCSV(dataSourceParameters, res);
59+
writeServletResponse(responseMessage, res);
6060
break;
6161
case TSV_EXCEL:
62-
setServletResponseTSVExcel(responseMessage, dataSourceParameters, res);
62+
setServletResponseTSVExcel(dataSourceParameters, res);
63+
writeServletResponse(responseMessage, res, "UTF-16LE", UTF_16LE_BOM);
6364
break;
6465
case HTML:
65-
setServletResponseHTML(responseMessage, res);
66+
setServletResponseHTML(res);
67+
writeServletResponse(responseMessage, res);
6668
break;
6769
case JSONP:
70+
setServletResponseJSONP(res);
71+
writeServletResponse(responseMessage, res);
72+
break;
6873
case JSON:
69-
setServletResponseJSON(responseMessage, res);
74+
setServletResponseJSON(res);
75+
writeServletResponse(responseMessage, res);
7076
break;
7177
default:
7278
// This should never happen.
@@ -85,8 +91,8 @@ public static void setServletResponse(String responseMessage,
8591
*
8692
* @throws IOException In case of a I/O error.
8793
*/
88-
private static void setServletResponseCSV(String responseMessage,
89-
DataSourceParameters dataSourceParameters, HttpServletResponse res) throws IOException {
94+
static void setServletResponseCSV(DataSourceParameters dataSourceParameters,
95+
HttpServletResponse res) {
9096
res.setContentType("text/csv; charset=UTF-8");
9197
String outFileName = dataSourceParameters.getOutFileName();
9298

@@ -95,8 +101,7 @@ private static void setServletResponseCSV(String responseMessage,
95101
outFileName = outFileName + ".csv";
96102
}
97103

98-
res.setHeader("content-disposition", "attachment; filename=" + outFileName);
99-
writeServletResponse(responseMessage, res);
104+
res.setHeader("Content-Disposition", "attachment; filename=" + outFileName);
100105
}
101106

102107
/**
@@ -109,12 +114,11 @@ private static void setServletResponseCSV(String responseMessage,
109114
*
110115
* @throws IOException In case of a I/O error.
111116
*/
112-
private static void setServletResponseTSVExcel(String responseMessage,
113-
DataSourceParameters dsParams, HttpServletResponse res) throws IOException {
117+
static void setServletResponseTSVExcel(DataSourceParameters dsParams,
118+
HttpServletResponse res) {
114119
res.setContentType("text/csv; charset=UTF-16LE");
115120
String outFileName = dsParams.getOutFileName();
116121
res.setHeader("Content-Disposition", "attachment; filename=" + outFileName);
117-
writeServletResponse(responseMessage, res, "UTF-16LE", UTF_16LE_BOM);
118122
}
119123

120124
/**
@@ -126,10 +130,21 @@ private static void setServletResponseTSVExcel(String responseMessage,
126130
*
127131
* @throws IOException In case of a I/O error.
128132
*/
129-
private static void setServletResponseHTML(String responseMessage, HttpServletResponse res)
130-
throws IOException {
133+
static void setServletResponseHTML(HttpServletResponse res) {
131134
res.setContentType("text/html; charset=UTF-8");
132-
writeServletResponse(responseMessage, res);
135+
}
136+
137+
/**
138+
* Sets the HTTP servlet response for a JSONP output type.
139+
* This method assumes the <code>StatusType</code> is 'OK'.
140+
*
141+
* @param responseMessage The response char sequence.
142+
* @param res The HTTP response.
143+
*
144+
* @throws IOException In case of a I/O error.
145+
*/
146+
static void setServletResponseJSONP(HttpServletResponse res) {
147+
res.setContentType("text/javascript; charset=UTF-8");
133148
}
134149

135150
/**
@@ -141,10 +156,8 @@ private static void setServletResponseHTML(String responseMessage, HttpServletRe
141156
*
142157
* @throws IOException In case of a I/O error.
143158
*/
144-
private static void setServletResponseJSON(String responseMessage, HttpServletResponse res)
145-
throws IOException {
146-
res.setContentType("text/plain; charset=UTF-8");
147-
writeServletResponse(responseMessage, res);
159+
static void setServletResponseJSON(HttpServletResponse res) {
160+
res.setContentType("application/json; charset=UTF-8");
148161
}
149162

150163
/**

src/test/java/com/google/visualization/datasource/ResponseWriterTest.java

Lines changed: 79 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,18 @@
2929
import com.google.visualization.datasource.datatable.value.ValueType;
3030
import com.google.visualization.datasource.render.JsonRenderer;
3131

32+
import java.util.List;
33+
34+
import javax.servlet.http.HttpServletResponse;
35+
3236
import junit.framework.TestCase;
3337

34-
import java.util.List;
38+
import static org.easymock.EasyMock.createMock;
39+
import static org.easymock.EasyMock.expect;
40+
import static org.easymock.EasyMock.eq;
41+
import static org.easymock.EasyMock.expectLastCall;
42+
import static org.easymock.EasyMock.replay;
43+
import static org.easymock.EasyMock.verify;
3544

3645

3746
/**
@@ -151,4 +160,73 @@ public void testGenerateJsonResponseError() throws DataSourceException {
151160
"babylon(" + expected + ");",
152161
JsonRenderer.renderJsonResponse(dsParamsJsonP, responseStatus, data).toString());
153162
}
163+
164+
public void testCSVResponse() throws DataSourceException {
165+
final String csvContentType = "text/csv; charset=UTF-8";
166+
final String csvheaderName = "Content-Disposition";
167+
final String csvheaderValue = "attachment; filename=testFile.csv";
168+
169+
DataSourceParameters dsParamsCSV =
170+
new DataSourceParameters("outFileName:testFile;out:csv");
171+
172+
HttpServletResponse mockHttpServletResponse = createMock(HttpServletResponse.class);
173+
mockHttpServletResponse.setContentType(eq(csvContentType));
174+
mockHttpServletResponse.setHeader(eq(csvheaderName), eq(csvheaderValue));
175+
expectLastCall();
176+
177+
replay(mockHttpServletResponse);
178+
ResponseWriter.setServletResponseCSV(dsParamsCSV, mockHttpServletResponse);
179+
verify(mockHttpServletResponse);
180+
}
181+
182+
public void testTSVExcelResponse() throws DataSourceException {
183+
final String tsvExcelContentType = "text/csv; charset=UTF-16LE";
184+
final String headerName = "Content-Disposition";
185+
final String headerValue = "attachment; filename=testFile.xls";
186+
187+
DataSourceParameters dsParamsTsvExcel =
188+
new DataSourceParameters("outFileName:testFile.xls;out:tsv_excel");
189+
190+
HttpServletResponse mockHttpServletResponse = createMock(HttpServletResponse.class);
191+
mockHttpServletResponse.setContentType(eq(tsvExcelContentType));
192+
mockHttpServletResponse.setHeader(eq(headerName), eq(headerValue));
193+
expectLastCall();
194+
195+
replay(mockHttpServletResponse);
196+
ResponseWriter.setServletResponseTSVExcel(dsParamsTsvExcel, mockHttpServletResponse);
197+
verify(mockHttpServletResponse);
198+
}
199+
200+
public void testHTMLResponseContentType() {
201+
final String HtmlContentType = "text/html; charset=UTF-8";
202+
HttpServletResponse mockHttpServletResponse = createMock(HttpServletResponse.class);
203+
mockHttpServletResponse.setContentType(eq(HtmlContentType));
204+
expectLastCall();
205+
206+
replay(mockHttpServletResponse);
207+
ResponseWriter.setServletResponseHTML(mockHttpServletResponse);
208+
verify(mockHttpServletResponse);
209+
}
210+
211+
public void testJsonResponseContentType() {
212+
final String jsonContentType = "application/json; charset=UTF-8";
213+
HttpServletResponse mockHttpServletResponse = createMock(HttpServletResponse.class);
214+
mockHttpServletResponse.setContentType(eq(jsonContentType));
215+
expectLastCall();
216+
217+
replay(mockHttpServletResponse);
218+
ResponseWriter.setServletResponseJSON(mockHttpServletResponse);
219+
verify(mockHttpServletResponse);
220+
}
221+
222+
public void testJsonpResponseContentType() {
223+
final String jsonpContentType = "text/javascript; charset=UTF-8";
224+
HttpServletResponse mockHttpServletResponse = createMock(HttpServletResponse.class);
225+
mockHttpServletResponse.setContentType(eq(jsonpContentType));
226+
expectLastCall();
227+
228+
replay(mockHttpServletResponse);
229+
ResponseWriter.setServletResponseJSONP(mockHttpServletResponse);
230+
verify(mockHttpServletResponse);
231+
}
154232
}

0 commit comments

Comments
 (0)