You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by dk...@apache.org on 2009/06/26 21:20:09 UTC

svn commit: r788823 - in /cxf/branches/2.2.x-fixes: ./ rt/transports/http/src/main/java/org/apache/cxf/transport/servlet/ rt/transports/http/src/test/java/org/apache/cxf/transport/servlet/ systests/src/test/java/org/apache/cxf/systest/jaxrs/ systests/s...

Author: dkulp
Date: Fri Jun 26 19:20:08 2009
New Revision: 788823

URL: http://svn.apache.org/viewvc?rev=788823&view=rev
Log:
Merged revisions 788030 via svnmerge from 
https://svn.apache.org/repos/asf/cxf/trunk

........
  r788030 | sergeyb | 2009-06-24 10:05:50 -0400 (Wed, 24 Jun 2009) | 1 line
  
  Updating AbstractCxfServlet to support arbitrary HTTP methods
........

Added:
    cxf/branches/2.2.x-fixes/rt/transports/http/src/test/java/org/apache/cxf/transport/servlet/
      - copied from r788030, cxf/trunk/rt/transports/http/src/test/java/org/apache/cxf/transport/servlet/
    cxf/branches/2.2.x-fixes/rt/transports/http/src/test/java/org/apache/cxf/transport/servlet/AbstractCXFServletTest.java
      - copied unchanged from r788030, cxf/trunk/rt/transports/http/src/test/java/org/apache/cxf/transport/servlet/AbstractCXFServletTest.java
    cxf/branches/2.2.x-fixes/systests/src/test/java/org/apache/cxf/systest/jaxrs/resources/retrieveRequest.txt
      - copied unchanged from r788030, cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/resources/retrieveRequest.txt
Modified:
    cxf/branches/2.2.x-fixes/   (props changed)
    cxf/branches/2.2.x-fixes/rt/transports/http/src/main/java/org/apache/cxf/transport/servlet/AbstractCXFServlet.java
    cxf/branches/2.2.x-fixes/systests/src/test/java/org/apache/cxf/systest/jaxrs/BookStoreSpring.java
    cxf/branches/2.2.x-fixes/systests/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerSpringBookTest.java

Propchange: cxf/branches/2.2.x-fixes/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Fri Jun 26 19:20:08 2009
@@ -1 +1 @@
-/cxf/trunk:782728-782730,783097,783294,783396,784059,784181-784184,784893,784895,785279-785282,785468,785621,785624,785651,785734,785866,786142,786271-786272,786395,786512,786514,786582-786583,786638,786647,786850,787200,787269,787277-787279,787290-787291,787305,787323,787366,787849,788451
+/cxf/trunk:782728-782730,783097,783294,783396,784059,784181-784184,784893,784895,785279-785282,785468,785621,785624,785651,785734,785866,786142,786271-786272,786395,786512,786514,786582-786583,786638,786647,786850,787200,787269,787277-787279,787290-787291,787305,787323,787366,787849,788030,788451

Propchange: cxf/branches/2.2.x-fixes/
------------------------------------------------------------------------------
Binary property 'svnmerge-integrated' - no diff available.

Modified: cxf/branches/2.2.x-fixes/rt/transports/http/src/main/java/org/apache/cxf/transport/servlet/AbstractCXFServlet.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.2.x-fixes/rt/transports/http/src/main/java/org/apache/cxf/transport/servlet/AbstractCXFServlet.java?rev=788823&r1=788822&r2=788823&view=diff
==============================================================================
--- cxf/branches/2.2.x-fixes/rt/transports/http/src/main/java/org/apache/cxf/transport/servlet/AbstractCXFServlet.java (original)
+++ cxf/branches/2.2.x-fixes/rt/transports/http/src/main/java/org/apache/cxf/transport/servlet/AbstractCXFServlet.java Fri Jun 26 19:20:08 2009
@@ -20,12 +20,16 @@
 
 import java.io.IOException;
 import java.lang.ref.WeakReference;
+import java.util.Arrays;
 import java.util.Hashtable;
+import java.util.List;
 import java.util.Map;
 import java.util.logging.Logger;
 
 import javax.servlet.ServletConfig;
 import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
 import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
@@ -40,9 +44,16 @@
 
 
 public abstract class AbstractCXFServlet extends HttpServlet {
+    
     static final Map<String, WeakReference<Bus>> BUS_MAP = new Hashtable<String, WeakReference<Bus>>();
     static final Logger LOG = getLogger();
     
+    /**
+     * List of well-known HTTP 1.1 verbs, with POST and GET being the most used verbs at the top 
+     */
+    private static final List<String> KNOWN_HTTP_VERBS = 
+        Arrays.asList(new String[]{"POST", "GET", "PUT", "DELETE", "HEAD", "OPTIONS", "TRACE"});
+    
     protected Bus bus;
     protected ServletTransportFactory servletTransportFactory;
     protected ServletController controller;
@@ -137,11 +148,13 @@
         bus.shutdown(true);
     }
     
-    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException {
+    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
+        throws ServletException {
         invoke(request, response);
     }
 
-    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException {
+    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
+        throws ServletException {
         invoke(request, response);
     }
 
@@ -152,12 +165,56 @@
     }
 
     @Override
-    protected void doPut(HttpServletRequest request, HttpServletResponse response) throws ServletException,
-        IOException {
+    protected void doPut(HttpServletRequest request, HttpServletResponse response) 
+        throws ServletException, IOException {
+        invoke(request, response);
+    }
+    
+    @Override
+    protected void doHead(HttpServletRequest request, HttpServletResponse response) 
+        throws ServletException, IOException {
+        invoke(request, response);
+    }
+    
+    @Override
+    protected void doOptions(HttpServletRequest request, HttpServletResponse response) 
+        throws ServletException, IOException {
         invoke(request, response);
     }
     
-    private  void invoke(HttpServletRequest request, HttpServletResponse response) throws ServletException {
+    
+    
+    /**
+     * {@inheritDoc}
+     * 
+     * javax.http.servlet.HttpServlet does not let to override the code which deals with
+     * unrecognized HTTP verbs such as PATCH (being standardized), WebDav ones, etc.
+     * Thus we let CXF servlets process unrecognized HTTP verbs directly, otherwise we delegate
+     * to HttpService  
+     */
+    @Override
+    public void service(ServletRequest req, ServletResponse res)
+        throws ServletException, IOException {
+        
+        HttpServletRequest      request;
+        HttpServletResponse     response;
+        
+        try {
+            request = (HttpServletRequest) req;
+            response = (HttpServletResponse) res;
+        } catch (ClassCastException e) {
+            throw new ServletException("Unrecognized HTTP request or response object");
+        }
+        
+        String method = request.getMethod();
+        if (KNOWN_HTTP_VERBS.contains(method)) {
+            super.service(request, response);
+        } else {
+            invoke(request, response);
+        }
+    }
+    
+    protected void invoke(HttpServletRequest request, HttpServletResponse response) throws ServletException {
         try {
             BusFactory.setThreadDefaultBus(getBus());
             controller.invoke(request, response);

Modified: cxf/branches/2.2.x-fixes/systests/src/test/java/org/apache/cxf/systest/jaxrs/BookStoreSpring.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.2.x-fixes/systests/src/test/java/org/apache/cxf/systest/jaxrs/BookStoreSpring.java?rev=788823&r1=788822&r2=788823&view=diff
==============================================================================
--- cxf/branches/2.2.x-fixes/systests/src/test/java/org/apache/cxf/systest/jaxrs/BookStoreSpring.java (original)
+++ cxf/branches/2.2.x-fixes/systests/src/test/java/org/apache/cxf/systest/jaxrs/BookStoreSpring.java Fri Jun 26 19:20:08 2009
@@ -129,7 +129,7 @@
     
     @RETRIEVE
     @Path("books/aegis/retrieve")
-    @Produces({"application/html;q=1.0", "application/xml;q=0.5", "application/json;q=0.5" })
+    @Produces({"application/html;q=0.5", "application/xml;q=1.0", "application/json;q=0.5" })
     public Book getBookAegisRetrieve() {
         return getBookAegis();
     }

Modified: cxf/branches/2.2.x-fixes/systests/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerSpringBookTest.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.2.x-fixes/systests/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerSpringBookTest.java?rev=788823&r1=788822&r2=788823&view=diff
==============================================================================
--- cxf/branches/2.2.x-fixes/systests/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerSpringBookTest.java (original)
+++ cxf/branches/2.2.x-fixes/systests/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerSpringBookTest.java Fri Jun 26 19:20:08 2009
@@ -19,8 +19,11 @@
 
 package org.apache.cxf.systest.jaxrs;
 
+import java.io.BufferedReader;
 import java.io.File;
 import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.net.Socket;
 import java.net.URL;
 import java.net.URLConnection;
 import java.util.HashMap;
@@ -31,7 +34,6 @@
 
 import org.apache.commons.httpclient.HttpClient;
 import org.apache.commons.httpclient.methods.FileRequestEntity;
-import org.apache.commons.httpclient.methods.GetMethod;
 import org.apache.commons.httpclient.methods.PostMethod;
 import org.apache.commons.httpclient.methods.RequestEntity;
 import org.apache.cxf.helpers.IOUtils;
@@ -232,20 +234,29 @@
     }
     
     @Test
-    @Ignore
     public void testRetrieveBookAegis3() throws Exception {
-        GetMethod get = new GetMethod("http://localhost:9080/the/thebooks4/bookstore/books/aegis/retrieve");
-        get.setRequestHeader("Content-Type", "*/*");
-        get.setRequestHeader("Accept", "application/xml");
-        HttpClient httpClient = new HttpClient();
-        try {
-            httpClient.executeMethod(get);           
-            String aegisData = getStringFromInputStream(get.getResponseBodyAsStream());
-            InputStream expected = getClass().getResourceAsStream("resources/expected_add_book_aegis.txt");
-            assertEquals(getStringFromInputStream(expected), aegisData);
-        } finally {
-            get.releaseConnection();
+        
+        Socket s = new Socket("localhost", 9080);
+        
+        InputStream is = this.getClass().getResourceAsStream("resources/retrieveRequest.txt");
+        byte[] bytes = IOUtils.readBytesFromStream(is);
+        s.getOutputStream().write(bytes);
+        s.getOutputStream().flush();
+        
+        BufferedReader r = new BufferedReader(new InputStreamReader(s.getInputStream()));
+        StringBuilder sb = new StringBuilder();
+        String str = null;
+        while ((str = r.readLine()) != null) {
+            sb.append(str);
         }
+        
+        String aegisData = sb.toString();
+        s.getInputStream().close();
+        s.close();
+        String expected = getStringFromInputStream(
+                              getClass().getResourceAsStream("resources/expected_add_book_aegis.txt"));
+        assertTrue(aegisData.contains(expected));
+        
     }
     
     @Test