Author: lryan
Date: Thu Feb 7 09:40:33 2008
New Revision: 619525
URL: http://svn.apache.org/viewvc?rev=619525&view=rev
Log:
Fix error handling, post handling in makeRequest
Fix response binding in ProxyHandler
Fix handling of double-encoded URLS and URLs of the form x.y.com?a=b
Modified:
incubator/shindig/trunk/features/core/io.js
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/ProxyHandler.java
Modified: incubator/shindig/trunk/features/core/io.js
URL:
http://svn.apache.org/viewvc/incubator/shindig/trunk/features/core/io.js?rev=619525&r1=619524&r2=619525&view=diff
==============================================================================
--- incubator/shindig/trunk/features/core/io.js (original)
+++ incubator/shindig/trunk/features/core/io.js Thu Feb 7 09:40:33 2008
@@ -60,6 +60,11 @@
if (xobj.readyState !== 4) {
return;
}
+ if (xobj.status !== 200) {
+ // TODO Need to work on standardizing errors
+ callback({errors : ["Error " + xobj.status] });
+ return;
+ }
var txt = xobj.responseText;
// remove unparseable cruft.
// TODO: really remove this by eliminating it. It's not any real security
@@ -76,6 +81,10 @@
case "JSON":
case "FEED":
resp.data = gadgets.json.parse(resp.text);
+ if (!resp.data) {
+ resp.errors = ["failed to parse JSON"];
+ resp.data = null;
+ }
break;
case "DOM":
var dom;
@@ -84,12 +93,20 @@
dom.async = false;
dom.validateOnParse = false;
dom.resolveExternals = false;
- dom.loadXML(resp.text);
+ if (!dom.loadXML(resp.text)) {
+ resp.errors = ["failed to parse XML"];
+ } else {
+ resp.data = dom;
+ }
} else {
var parser = new DOMParser();
dom = parser.parseFromString(resp.text, "text/xml");
+ if ("parsererror" == dom.documentElement.nodeName) {
+ resp.errors = ["failed to parse XML"];
+ } else {
+ resp.data = dom;
+ }
}
- resp.data = dom;
break;
default:
resp.data = resp.text;
@@ -128,7 +145,7 @@
encodeURIComponent(url));
// Check if authorization is requested
- if (opt_params.AUTHORIZATION &&
+ if (opt_params && opt_params.AUTHORIZATION &&
gadgets.io.AuthorizationType[opt_params.AUTHORIZATION.toUpperCase()]
!= gadgets.io.AuthorizationType.NONE) {
newUrl += "&authz=" + opt_params.AUTHORIZATION.toLowerCase();
@@ -143,8 +160,16 @@
xhr.onreadystatechange = gadgets.util.makeClosure(null,
processResponse, url, callback, params, xhr);
}
- xhr.setRequestHeader('Content-Type',
'application/x-www-form-urlencoded');
- xhr.send("postData=" + encodeURIComponent(params.postData));
+ if (params.METHOD == "POST") {
+ xhr.setRequestHeader('Content-Type',
'application/x-www-form-urlencoded');
+ if (params.postData) {
+ xhr.send("postData=" + encodeURIComponent(params.postData));
+ } else {
+ xhr.send("postData=");
+ }
+ } else {
+ xhr.send();
+ }
},
/**
Modified:
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/ProxyHandler.java
URL:
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/ProxyHandler.java?rev=619525&r1=619524&r2=619525&view=diff
==============================================================================
---
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/ProxyHandler.java
(original)
+++
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/ProxyHandler.java
Thu Feb 7 09:40:33 2008
@@ -34,6 +34,8 @@
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLDecoder;
+import java.net.URI;
+import java.net.URISyntaxException;
import java.util.List;
import java.util.Map;
@@ -71,22 +73,26 @@
RemoteContent results = fetchContent(signedUrl, request,
new ProcessingOptions());
- String output;
- try {
- String json = new JSONObject().put(originalUrl.toString(), new
JSONObject()
- .put("body", new String(results.getByteArray()))
- .put("rc", results.getHttpStatusCode())
- ).toString();
- output = UNPARSEABLE_CRUFT + json;
- } catch (JSONException e) {
- output = "";
+ response.setStatus(results.getHttpStatusCode());
+ if (results.getHttpStatusCode() == HttpServletResponse.SC_OK) {
+ String output;
+ try {
+ // Use raw param as key as URL may have to be decoded
+ String json = new JSONObject().put(request.getParameter("url"), new
JSONObject()
+ .put("body", new String(results.getByteArray()))
+ .put("rc", results.getHttpStatusCode())
+ ).toString();
+ output = UNPARSEABLE_CRUFT + json;
+ } catch (JSONException e) {
+ output = "";
+ }
+
+ setCachingHeaders(response);
+ response.setContentType("application/json; charset=utf-8");
+ response.setHeader("Content-Disposition", "attachment;filename=p.txt");
+ PrintWriter pw = response.getWriter();
+ pw.write(output);
}
- response.setStatus(HttpServletResponse.SC_OK);
- setCachingHeaders(response);
- response.setContentType("application/json; charset=utf-8");
- response.setHeader("Content-Disposition", "attachment;filename=p.txt");
- PrintWriter pw = response.getWriter();
- pw.write(output);
}
public void fetch(HttpServletRequest request,
@@ -152,26 +158,42 @@
* @return A URL object of the URL
* @throws ServletException if the URL fails security checks or is malformed.
*/
- private URL extractAndValidateUrl(HttpServletRequest request)
+ private URL extractAndValidateUrl(HttpServletRequest request)
throws ServletException {
String url = request.getParameter("url");
if (url == null) {
throw new ServletException("Missing url parameter");
}
- // TODO: are there other tests that should be here?
- // url.matches("[a-zA-Z0-9_:%&#+-]+"), perhaps?
- if (!url.startsWith("http://")) {
- throw new ServletException("url parameter does not start with http://");
- }
-
- URL origin;
try {
- origin = new URL(url);
- } catch (MalformedURLException e) {
- throw new ServletException("Malformed url parameter");
+ URI origin = new URI(request.getParameter("url"));
+ if (origin.getScheme() == null) {
+ // No scheme, assume it was double-encoded.
+ origin = new URI(
+ URLDecoder.decode(request.getParameter("url"),
request.getCharacterEncoding()));
+ if (origin.getScheme() == null) {
+ throw new ServletException("Invalid URL " + origin.toString());
+ }
+ }
+ if (!origin.getScheme().equals("http")) {
+ throw new ServletException("Unsupported protocol: " +
origin.getScheme());
+ }
+ if (origin.getPath() == null || origin.getPath().length() == 0) {
+ // Forcibly set the path to "/" if it is empty
+ origin = new URI(origin.getScheme(),
+ origin.getUserInfo(), origin.getHost(),
+ origin.getPort(),
+ "/", origin.getQuery(),
+ origin.getFragment());
+ }
+ return origin.toURL();
+ } catch (URISyntaxException use) {
+ throw new ServletException("Malformed URL " + use.getMessage());
+ } catch (MalformedURLException mfe) {
+ throw new ServletException("Malformed URL " + mfe.getMessage());
+ } catch (UnsupportedEncodingException uee) {
+ throw new ServletException("Unsupported encoding " + uee.getMessage());
}
- return origin;
}
/**