Some small improvements in error handling based on exceptions observed at zxing.org
[zxing.git] / zxingorg / src / com / google / zxing / web / DecodeServlet.java
index 6a67be7..e5ea042 100644 (file)
@@ -28,6 +28,7 @@ import org.apache.commons.fileupload.FileItem;
 import org.apache.commons.fileupload.FileUploadException;
 import org.apache.commons.fileupload.disk.DiskFileItemFactory;
 import org.apache.commons.fileupload.servlet.ServletFileUpload;
+import org.apache.commons.lang.StringEscapeUtils;
 import org.apache.http.Header;
 import org.apache.http.HttpException;
 import org.apache.http.HttpMessage;
@@ -35,9 +36,9 @@ import org.apache.http.HttpResponse;
 import org.apache.http.HttpVersion;
 import org.apache.http.client.HttpClient;
 import org.apache.http.client.methods.HttpGet;
-import org.apache.http.conn.PlainSocketFactory;
-import org.apache.http.conn.Scheme;
-import org.apache.http.conn.SchemeRegistry;
+import org.apache.http.conn.scheme.PlainSocketFactory;
+import org.apache.http.conn.scheme.Scheme;
+import org.apache.http.conn.scheme.SchemeRegistry;
 import org.apache.http.conn.ssl.SSLSocketFactory;
 import org.apache.http.impl.client.DefaultHttpClient;
 import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;
@@ -57,10 +58,10 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStreamWriter;
 import java.io.Writer;
+import java.net.SocketException;
 import java.net.URI;
 import java.net.URISyntaxException;
 import java.net.UnknownHostException;
-import java.util.Arrays;
 import java.util.Hashtable;
 import java.util.List;
 import java.util.Timer;
@@ -160,7 +161,12 @@ public final class DecodeServlet extends HttpServlet {
       } finally {
         is.close();
       }
-    } catch (InterruptedException ie) {
+    } catch (IllegalArgumentException iae) {
+      // Thrown if hostname is bad or null
+      getRequest.abort();
+      response.sendRedirect("badurl.jspx");
+    } catch (SocketException se) {
+      // Thrown if hostname is bad or null
       getRequest.abort();
       response.sendRedirect("badurl.jspx");
     } catch (HttpException he) {
@@ -229,8 +235,8 @@ public final class DecodeServlet extends HttpServlet {
 
     if (request.getParameter("full") == null) {
       response.setContentType("text/plain");
-      response.setCharacterEncoding("UTF-8");
-      Writer out = new OutputStreamWriter(response.getOutputStream(), "UTF-8");
+      response.setCharacterEncoding("UTF8");
+      Writer out = new OutputStreamWriter(response.getOutputStream(), "UTF8");
       try {
         out.write(result.getText());
       } finally {
@@ -240,12 +246,24 @@ public final class DecodeServlet extends HttpServlet {
       request.setAttribute("result", result);
       byte[] rawBytes = result.getRawBytes();
       if (rawBytes != null) {
-        request.setAttribute("rawBytesString", Arrays.toString(rawBytes));
+        request.setAttribute("rawBytesString", arrayToString(rawBytes));
       } else {
         request.setAttribute("rawBytesString", "(Not applicable)");
       }
-      ParsedResult parsedResult = ResultParser.parseReaderResult(result);
+      String text = result.getText();
+      if (text != null) {
+        request.setAttribute("text", StringEscapeUtils.escapeXml(text));
+      } else {
+        request.setAttribute("text", "(Not applicable)");
+      }
+      ParsedResult parsedResult = ResultParser.parseResult(result);
       request.setAttribute("parsedResult", parsedResult);
+      String displayResult = parsedResult.getDisplayResult();
+      if (displayResult != null) {
+        request.setAttribute("displayResult", StringEscapeUtils.escapeXml(displayResult));
+      } else {
+        request.setAttribute("displayResult", "(Not applicable)");
+      }
       request.getRequestDispatcher("decoderesult.jspx").forward(request, response);
     }
   }
@@ -261,6 +279,28 @@ public final class DecodeServlet extends HttpServlet {
     return true;
   }
 
+  private static String arrayToString(byte[] bytes) {
+    int length = bytes.length;
+    StringBuilder result = new StringBuilder(length << 2);
+    int i = 0;
+    while (i < length) {
+      int max = Math.min(i + 8, length);
+      for (int j = i; j < max; j++) {
+        int value = bytes[j] & 0xFF;
+        result.append(Integer.toHexString(value / 16));
+        result.append(Integer.toHexString(value % 16));
+        result.append(' ');
+      }
+      result.append('\n');
+      i += 8;
+    }
+    for (int j = i - 8; j < length; j++) {
+      result.append(Integer.toHexString(bytes[j] & 0xFF));
+      result.append(' ');
+    }
+    return result.toString();
+  }
+
   @Override
   public void destroy() {
     log.config("DecodeServlet shutting down...");