X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=zxingorg%2Fsrc%2Fcom%2Fgoogle%2Fzxing%2Fweb%2FDecodeServlet.java;h=4ed5f5a393fbffd916949aa1208f8eb04b796ca8;hb=608fe313d82bb79f0f5a96856697bdfb4a6305d3;hp=7041175e78f373adfcb64fcdcf272129d6ccc166;hpb=f1954bd1080850658b65fb15bc5274347f57ce1c;p=zxing.git diff --git a/zxingorg/src/com/google/zxing/web/DecodeServlet.java b/zxingorg/src/com/google/zxing/web/DecodeServlet.java index 7041175e..4ed5f5a3 100644 --- a/zxingorg/src/com/google/zxing/web/DecodeServlet.java +++ b/zxingorg/src/com/google/zxing/web/DecodeServlet.java @@ -16,44 +16,43 @@ package com.google.zxing.web; +import com.google.zxing.BarcodeFormat; +import com.google.zxing.BinaryBitmap; import com.google.zxing.DecodeHintType; +import com.google.zxing.LuminanceSource; import com.google.zxing.MultiFormatReader; import com.google.zxing.Reader; import com.google.zxing.ReaderException; import com.google.zxing.Result; -import com.google.zxing.BarcodeFormat; -import com.google.zxing.client.j2se.BufferedImageMonochromeBitmapSource; +import com.google.zxing.client.j2se.BufferedImageLuminanceSource; import com.google.zxing.client.result.ParsedResult; import com.google.zxing.client.result.ResultParser; +import com.google.zxing.common.HybridBinarizer; + 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; import org.apache.http.HttpResponse; import org.apache.http.HttpVersion; +import org.apache.http.HttpEntity; import org.apache.http.client.HttpClient; -import org.apache.http.client.params.HttpClientParams; import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpUriRequest; 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.conn.ClientConnectionManager; import org.apache.http.impl.client.DefaultHttpClient; -import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager; +import org.apache.http.impl.conn.SingleClientConnManager; import org.apache.http.params.BasicHttpParams; import org.apache.http.params.HttpParams; import org.apache.http.params.HttpProtocolParams; -import javax.imageio.ImageIO; -import javax.servlet.ServletConfig; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; import java.awt.image.BufferedImage; import java.io.IOException; import java.io.InputStream; @@ -68,10 +67,18 @@ import java.util.List; import java.util.Vector; import java.util.logging.Logger; +import javax.imageio.ImageIO; +import javax.servlet.ServletConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + /** * {@link HttpServlet} which decodes images containing barcodes. Given a URL, it will * retrieve the image and decode it. It can also process image files uploaded via POST. - * + * * @author Sean Owen */ public final class DecodeServlet extends HttpServlet { @@ -85,7 +92,7 @@ public final class DecodeServlet extends HttpServlet { static { HINTS = new Hashtable(5); HINTS.put(DecodeHintType.TRY_HARDER, Boolean.TRUE); - Vector possibleFormats = new Vector(); + Vector possibleFormats = new Vector(); possibleFormats.add(BarcodeFormat.UPC_A); possibleFormats.add(BarcodeFormat.UPC_E); possibleFormats.add(BarcodeFormat.EAN_8); @@ -95,10 +102,12 @@ public final class DecodeServlet extends HttpServlet { possibleFormats.add(BarcodeFormat.ITF); possibleFormats.add(BarcodeFormat.QR_CODE); possibleFormats.add(BarcodeFormat.DATAMATRIX); + possibleFormats.add(BarcodeFormat.PDF417); HINTS.put(DecodeHintType.POSSIBLE_FORMATS, possibleFormats); } - private HttpClient client; + private HttpParams params; + private SchemeRegistry registry; private DiskFileItemFactory diskFileItemFactory; @Override @@ -107,23 +116,21 @@ public final class DecodeServlet extends HttpServlet { Logger logger = Logger.getLogger("com.google.zxing"); logger.addHandler(new ServletContextLogHandler(servletConfig.getServletContext())); - HttpParams params = new BasicHttpParams(); + params = new BasicHttpParams(); HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1); - SchemeRegistry registry = new SchemeRegistry(); + registry = new SchemeRegistry(); registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); registry.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443)); - client = new DefaultHttpClient(new ThreadSafeClientConnManager(params, registry), params); - diskFileItemFactory = new DiskFileItemFactory(); log.info("DecodeServlet configured"); } @Override - protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { - + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { String imageURIString = request.getParameter("u"); if (imageURIString == null || imageURIString.length() == 0) { response.sendRedirect("badurl.jspx"); @@ -142,11 +149,33 @@ public final class DecodeServlet extends HttpServlet { return; } - HttpGet getRequest = new HttpGet(imageURI); + ClientConnectionManager connectionManager = new SingleClientConnManager(params, registry); + HttpClient client = new DefaultHttpClient(connectionManager, params); + + HttpUriRequest getRequest = new HttpGet(imageURI); getRequest.addHeader("Connection", "close"); // Avoids CLOSE_WAIT socket issue? try { - HttpResponse getResponse = client.execute(getRequest); + + HttpResponse getResponse; + try { + getResponse = client.execute(getRequest); + } catch (IllegalArgumentException iae) { + // Thrown if hostname is bad or null + getRequest.abort(); + response.sendRedirect("badurl.jspx"); + return; + } catch (SocketException se) { + // Thrown if hostname is bad or null + getRequest.abort(); + response.sendRedirect("badurl.jspx"); + return; + } catch (UnknownHostException uhe) { + getRequest.abort(); + response.sendRedirect("badurl.jspx"); + return; + } + if (getResponse.getStatusLine().getStatusCode() != HttpServletResponse.SC_OK) { response.sendRedirect("badurl.jspx"); return; @@ -155,24 +184,19 @@ public final class DecodeServlet extends HttpServlet { response.sendRedirect("badimage.jspx"); return; } + log.info("Decoding " + imageURI); - InputStream is = getResponse.getEntity().getContent(); + HttpEntity entity = getResponse.getEntity(); + InputStream is = entity.getContent(); try { processStream(is, request, response); } finally { + entity.consumeContent(); is.close(); } - } 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 (UnknownHostException uhe) { - getRequest.abort(); - response.sendRedirect("badurl.jspx"); + + } finally { + connectionManager.shutdown(); } } @@ -213,8 +237,8 @@ public final class DecodeServlet extends HttpServlet { } - private static void processStream(InputStream is, HttpServletRequest request, HttpServletResponse response) - throws ServletException, IOException { + private static void processStream(InputStream is, ServletRequest request, + HttpServletResponse response) throws ServletException, IOException { BufferedImage image = ImageIO.read(is); if (image == null) { response.sendRedirect("badimage.jspx"); @@ -224,7 +248,9 @@ public final class DecodeServlet extends HttpServlet { Reader reader = new MultiFormatReader(); Result result; try { - result = reader.decode(new BufferedImageMonochromeBitmapSource(image), HINTS); + LuminanceSource source = new BufferedImageLuminanceSource(image); + BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source)); + result = reader.decode(bitmap, HINTS); } catch (ReaderException re) { log.info("DECODE FAILED: " + re.toString()); response.sendRedirect("notfound.jspx");