Repository: olingo-odata2
Updated Branches:
  refs/heads/master 307abde3a -> 087f2364a


[OLINGO-840] Enable default HEAD request handling


Project: http://git-wip-us.apache.org/repos/asf/olingo-odata2/repo
Commit: http://git-wip-us.apache.org/repos/asf/olingo-odata2/commit/087f2364
Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata2/tree/087f2364
Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata2/diff/087f2364

Branch: refs/heads/master
Commit: 087f2364a5e515a6bd2874c7ee80b0f6e630c073
Parents: 307abde
Author: mibo <[email protected]>
Authored: Wed Dec 23 09:56:07 2015 +0100
Committer: mibo <[email protected]>
Committed: Wed Dec 23 10:40:38 2015 +0100

----------------------------------------------------------------------
 .../odata2/api/processor/ODataRequest.java      |  4 ++
 .../api/processor/ODataSingleProcessor.java     | 12 +++---
 .../olingo/odata2/core/ODataContextImpl.java    |  4 +-
 .../olingo/odata2/core/ODataRequestImpl.java    | 15 +++++++
 .../odata2/core/rest/ODataSubLocator.java       |  6 +--
 .../olingo/odata2/core/rest/RestUtil.java       |  9 +++-
 .../odata2/core/servlet/ODataServlet.java       | 40 +++++++++++++-----
 .../odata2/core/servlet/ODataServletTest.java   | 28 +++++++++++++
 .../olingo/odata2/fit/basic/BasicHttpTest.java  | 43 ++++++++++++++------
 9 files changed, 125 insertions(+), 36 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/087f2364/odata2-lib/odata-api/src/main/java/org/apache/olingo/odata2/api/processor/ODataRequest.java
----------------------------------------------------------------------
diff --git 
a/odata2-lib/odata-api/src/main/java/org/apache/olingo/odata2/api/processor/ODataRequest.java
 
b/odata2-lib/odata-api/src/main/java/org/apache/olingo/odata2/api/processor/ODataRequest.java
index 8c3190f..4b7a43f 100644
--- 
a/odata2-lib/odata-api/src/main/java/org/apache/olingo/odata2/api/processor/ODataRequest.java
+++ 
b/odata2-lib/odata-api/src/main/java/org/apache/olingo/odata2/api/processor/ODataRequest.java
@@ -43,6 +43,8 @@ public abstract class ODataRequest {
 
   public abstract ODataHttpMethod getMethod();
 
+  public abstract String getHttpMethod();
+
   public abstract List<Locale> getAcceptableLanguages();
 
   public abstract String getContentType();
@@ -112,6 +114,8 @@ public abstract class ODataRequest {
 
     public abstract ODataRequestBuilder requestHeaders(Map<String, 
List<String>> headers);
 
+    public abstract ODataRequestBuilder httpMethod(String httpMethod);
+
     public abstract ODataRequestBuilder body(InputStream body);
 
     public abstract ODataRequestBuilder pathInfo(PathInfo pathInfo);

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/087f2364/odata2-lib/odata-api/src/main/java/org/apache/olingo/odata2/api/processor/ODataSingleProcessor.java
----------------------------------------------------------------------
diff --git 
a/odata2-lib/odata-api/src/main/java/org/apache/olingo/odata2/api/processor/ODataSingleProcessor.java
 
b/odata2-lib/odata-api/src/main/java/org/apache/olingo/odata2/api/processor/ODataSingleProcessor.java
index 3c0004c..27b8aa2 100644
--- 
a/odata2-lib/odata-api/src/main/java/org/apache/olingo/odata2/api/processor/ODataSingleProcessor.java
+++ 
b/odata2-lib/odata-api/src/main/java/org/apache/olingo/odata2/api/processor/ODataSingleProcessor.java
@@ -361,11 +361,13 @@ public abstract class ODataSingleProcessor implements 
MetadataProcessor, Service
     final Edm entityDataModel = getContext().getService().getEntityDataModel();
     final String serviceRoot = 
getContext().getPathInfo().getServiceRoot().toASCIIString();
 
-    final ODataResponse response = 
EntityProvider.writeServiceDocument(contentType, entityDataModel, serviceRoot);
-    final ODataResponseBuilder odataResponseBuilder = 
ODataResponse.fromResponse(response).header(
-        ODataHttpHeaders.DATASERVICEVERSION, ODataServiceVersion.V10);
-
-    return odataResponseBuilder.build();
+    if(getContext().getHttpMethod().equals("HEAD")) {
+      return ODataResponse.header(ODataHttpHeaders.DATASERVICEVERSION, 
ODataServiceVersion.V10).build();
+    } else {
+      final ODataResponse response = 
EntityProvider.writeServiceDocument(contentType, entityDataModel, serviceRoot);
+      return ODataResponse.fromResponse(response)
+          .header(ODataHttpHeaders.DATASERVICEVERSION, 
ODataServiceVersion.V10).build();
+    }
   }
 
   /**

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/087f2364/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ODataContextImpl.java
----------------------------------------------------------------------
diff --git 
a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ODataContextImpl.java
 
b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ODataContextImpl.java
index 54679ac..e2c4ff0 100644
--- 
a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ODataContextImpl.java
+++ 
b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ODataContextImpl.java
@@ -56,9 +56,7 @@ public class ODataContextImpl implements ODataContext {
     setServiceFactory(factory);
     setRequest(request);
     setPathInfo(request.getPathInfo());
-    if (request.getMethod() != null) {
-      setHttpMethod(request.getMethod().name());
-    }
+    setHttpMethod(request.getHttpMethod());
     setAcceptableLanguages(request.getAcceptableLanguages());
     setDebugMode(checkDebugMode(request.getQueryParameters()));
   }

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/087f2364/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ODataRequestImpl.java
----------------------------------------------------------------------
diff --git 
a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ODataRequestImpl.java
 
b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ODataRequestImpl.java
index 41a45a7..07a9ead 100644
--- 
a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ODataRequestImpl.java
+++ 
b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ODataRequestImpl.java
@@ -38,6 +38,7 @@ import org.apache.olingo.odata2.core.commons.ContentType;
 public class ODataRequestImpl extends ODataRequest {
 
   private ODataHttpMethod method;
+  private String httpMethod;
   private CaseInsensitiveMap requestHeaders = new CaseInsensitiveMap();
   private InputStream body;
   private PathInfo pathInfo;
@@ -89,6 +90,11 @@ public class ODataRequestImpl extends ODataRequest {
   }
 
   @Override
+  public String getHttpMethod() {
+    return httpMethod;
+  }
+
+  @Override
   public PathInfo getPathInfo() {
     return pathInfo;
   }
@@ -100,6 +106,7 @@ public class ODataRequestImpl extends ODataRequest {
 
   public class ODataRequestBuilderImpl extends ODataRequestBuilder {
     private ODataHttpMethod method;
+    private String httpMethod;
     private CaseInsensitiveMap requestHeaders = new CaseInsensitiveMap();
     private InputStream body;
     private PathInfo pathInfo;
@@ -111,6 +118,7 @@ public class ODataRequestImpl extends ODataRequest {
     @Override
     public ODataRequest build() {
       ODataRequestImpl.this.method = method;
+      ODataRequestImpl.this.httpMethod = httpMethod;
       ODataRequestImpl.this.requestHeaders = requestHeaders;
       ODataRequestImpl.this.body = body;
       ODataRequestImpl.this.pathInfo = pathInfo;
@@ -134,6 +142,12 @@ public class ODataRequestImpl extends ODataRequest {
     }
 
     @Override
+    public ODataRequestBuilder httpMethod(String httpMethod) {
+      this.httpMethod = httpMethod;
+      return this;
+    }
+
+    @Override
     public ODataRequestBuilder body(final InputStream body) {
       this.body = body;
       return this;
@@ -190,6 +204,7 @@ public class ODataRequestImpl extends ODataRequest {
     public ODataRequestBuilder fromRequest(final ODataRequest request) {
       pathInfo = request.getPathInfo();
       method = request.getMethod();
+      httpMethod = request.getHttpMethod();
       body = request.getBody();
       if (request.getContentType() != null) {
         contentType = ContentType.create(request.getContentType());

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/087f2364/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/rest/ODataSubLocator.java
----------------------------------------------------------------------
diff --git 
a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/rest/ODataSubLocator.java
 
b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/rest/ODataSubLocator.java
index 5727b1d..50e4a6e 100644
--- 
a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/rest/ODataSubLocator.java
+++ 
b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/rest/ODataSubLocator.java
@@ -143,10 +143,7 @@ public final class ODataSubLocator {
 
   @HEAD
   public Response handleHead() throws ODataException {
-    // RFC 2616, 5.1.1: "An origin server SHOULD return the status code [...]
-    // 501 (Not Implemented) if the method is unrecognized or not implemented
-    // by the origin server."
-    return returnNotImplementedResponse(ODataNotImplementedException.COMMON);
+    return handleGet();
   }
 
   private Response handle(final ODataHttpMethod method) throws ODataException {
@@ -177,6 +174,7 @@ public final class ODataSubLocator {
 
     subLocator.serviceFactory = param.getServiceFactory();
     subLocator.request = 
ODataRequest.acceptableLanguages(param.getHttpHeaders().getAcceptableLanguages())
+        .httpMethod(param.getServletRequest().getMethod())
         .acceptHeaders(RestUtil.extractAcceptHeaders(param))
         .body(RestUtil.contentAsStream(RestUtil.extractRequestContent(param)))
         .pathInfo(RestUtil.buildODataPathInfo(param))

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/087f2364/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/rest/RestUtil.java
----------------------------------------------------------------------
diff --git 
a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/rest/RestUtil.java
 
b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/rest/RestUtil.java
index b726f9b..d65c9f3 100644
--- 
a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/rest/RestUtil.java
+++ 
b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/rest/RestUtil.java
@@ -56,9 +56,16 @@ import org.apache.olingo.odata2.core.commons.Decoder;
  */
 public class RestUtil {
   public static Response convertResponse(final ODataResponse odataResponse) {
+    return convertResponse(odataResponse, false);
+  }
+
+  public static Response convertResponse(final ODataResponse odataResponse, 
final boolean omitResponseBody) {
     try {
       ResponseBuilder responseBuilder =
-          
Response.noContent().status(odataResponse.getStatus().getStatusCode()).entity(odataResponse.getEntity());
+          
Response.noContent().status(odataResponse.getStatus().getStatusCode());
+      if(!omitResponseBody) {
+        responseBuilder.entity(odataResponse.getEntity());
+      }
 
       for (final String name : odataResponse.getHeaderNames()) {
         responseBuilder = responseBuilder.header(name, 
odataResponse.getHeader(name));

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/087f2364/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/servlet/ODataServlet.java
----------------------------------------------------------------------
diff --git 
a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/servlet/ODataServlet.java
 
b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/servlet/ODataServlet.java
index 764380b..d067655 100644
--- 
a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/servlet/ODataServlet.java
+++ 
b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/servlet/ODataServlet.java
@@ -138,6 +138,8 @@ public class ODataServlet extends HttpServlet {
       handleRequest(req, ODataHttpMethod.PATCH, resp, serviceFactory);
     } else if (ODataHttpMethod.MERGE.name().equals(method)) {
       handleRequest(req, ODataHttpMethod.MERGE, resp, serviceFactory);
+    } else if (HTTP_METHOD_HEAD.equals(method)) {
+      handleRequest(req, ODataHttpMethod.GET, resp, serviceFactory);
     } else if (HTTP_METHOD_HEAD.equals(method) || 
HTTP_METHOD_OPTIONS.equals(method)) {
       createNotImplementedResponse(req, ODataNotImplementedException.COMMON, 
resp, serviceFactory);
     } else {
@@ -157,9 +159,11 @@ public class ODataServlet extends HttpServlet {
       handleRequest(req, ODataHttpMethod.PUT, resp, serviceFactory);
     } else if (ODataHttpMethod.GET.name().equals(xHttpMethod)) {
       handleRequest(req, ODataHttpMethod.GET, resp, serviceFactory);
+    } else if (HTTP_METHOD_HEAD.equals(xHttpMethod)) {
+      handleRequest(req, ODataHttpMethod.GET, resp, serviceFactory);
     } else if (ODataHttpMethod.POST.name().equals(xHttpMethod)) {
       handleRequest(req, ODataHttpMethod.POST, resp, serviceFactory);
-    } else if (HTTP_METHOD_HEAD.equals(xHttpMethod) || 
HTTP_METHOD_OPTIONS.equals(xHttpMethod)) {
+    } else if (HTTP_METHOD_OPTIONS.equals(xHttpMethod)) {
       createNotImplementedResponse(req, ODataNotImplementedException.COMMON, 
resp, serviceFactory);
     } else {
       createNotImplementedResponse(req, ODataNotImplementedException.COMMON, 
resp, serviceFactory);
@@ -181,17 +185,18 @@ public class ODataServlet extends HttpServlet {
         createNotAcceptableResponse(req, ODataNotAcceptableException.COMMON, 
resp, serviceFactory);
         return;
       }
-      ODataRequest odataRequest = null;
+      ODataRequest odataRequest;
       try {
         odataRequest = ODataRequest.method(method)
-        
.contentType(RestUtil.extractRequestContentType(req.getContentType()).toContentTypeString())
-        
.acceptHeaders(RestUtil.extractAcceptHeaders(req.getHeader(HttpHeaders.ACCEPT)))
-        
.acceptableLanguages(RestUtil.extractAcceptableLanguage(req.getHeader(HttpHeaders.ACCEPT_LANGUAGE)))
-        .pathInfo(RestUtil.buildODataPathInfo(req, pathSplit))
-        
.allQueryParameters(RestUtil.extractAllQueryParameters(req.getQueryString()))
-        .requestHeaders(RestUtil.extractHeaders(req))
-        .body(req.getInputStream())
-        .build();
+          .httpMethod(req.getMethod())
+          
.contentType(RestUtil.extractRequestContentType(req.getContentType()).toContentTypeString())
+          
.acceptHeaders(RestUtil.extractAcceptHeaders(req.getHeader(HttpHeaders.ACCEPT)))
+          
.acceptableLanguages(RestUtil.extractAcceptableLanguage(req.getHeader(HttpHeaders.ACCEPT_LANGUAGE)))
+          .pathInfo(RestUtil.buildODataPathInfo(req, pathSplit))
+          
.allQueryParameters(RestUtil.extractAllQueryParameters(req.getQueryString()))
+          .requestHeaders(RestUtil.extractHeaders(req))
+          .body(req.getInputStream())
+          .build();
       } catch (IllegalArgumentException e) {
         throw new 
ODataBadRequestException(ODataBadRequestException.INVALID_REQUEST, e);
       }
@@ -208,7 +213,9 @@ public class ODataServlet extends HttpServlet {
 
         ODataRequestHandler requestHandler = new 
ODataRequestHandler(serviceFactory, service, context);
         final ODataResponse odataResponse = 
requestHandler.handle(odataRequest);
-        createResponse(resp, odataResponse);
+        //
+        boolean omitResponseBody = HTTP_METHOD_HEAD.equals(req.getMethod());
+        createResponse(resp, odataResponse, omitResponseBody);
       }
     } catch (Exception e) {
       ODataExceptionWrapper wrapper = new ODataExceptionWrapper(req, 
serviceFactory);
@@ -252,12 +259,23 @@ public class ODataServlet extends HttpServlet {
   }
 
   protected void createResponse(final HttpServletResponse resp, final 
ODataResponse response) throws IOException {
+    createResponse(resp, response, false);
+  }
+
+  protected void createResponse(final HttpServletResponse resp, final 
ODataResponse response,
+                                final boolean omitResponseBody)
+      throws IOException {
+
     resp.setStatus(response.getStatus().getStatusCode());
     resp.setContentType(response.getContentHeader());
     for (String headerName : response.getHeaderNames()) {
       resp.setHeader(headerName, response.getHeader(headerName));
     }
 
+    if(omitResponseBody) {
+      return;
+    }
+
     Object entity = response.getEntity();
     if (entity != null) {
       ServletOutputStream out = resp.getOutputStream();

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/087f2364/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/servlet/ODataServletTest.java
----------------------------------------------------------------------
diff --git 
a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/servlet/ODataServletTest.java
 
b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/servlet/ODataServletTest.java
index d814b5a..78baf5f 100644
--- 
a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/servlet/ODataServletTest.java
+++ 
b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/servlet/ODataServletTest.java
@@ -142,6 +142,34 @@ public class ODataServletTest {
     
Mockito.verify(respMock).setContentLength(content.getBytes("utf-8").length);
   }
 
+  @Test
+  public void testInputStreamResponse() throws Exception {
+    ODataServlet servlet = new ODataServlet();
+    prepareServlet(servlet);
+
+    final ByteArrayOutputStream bout = new ByteArrayOutputStream();
+    final ServletOutputStream out = new ServletOutputStream() {
+      @Override
+      public void write(int i) throws IOException {
+        bout.write(i);
+      }
+    };
+    Mockito.when(respMock.getOutputStream()).thenReturn(out);
+
+    HttpServletResponse servletResponse = 
Mockito.mock(HttpServletResponse.class);
+    Mockito.when(servletResponse.getOutputStream()).thenReturn(out);
+
+    ODataResponse odataResponse = Mockito.mock(ODataResponse.class);
+    
Mockito.when(odataResponse.getStatus()).thenReturn(HttpStatusCodes.ACCEPTED);
+    Mockito.when(odataResponse.getHeaderNames()).thenReturn(new 
HashSet<String>());
+    InputStream input = new ByteArrayInputStream("SomeData".getBytes());
+    Mockito.when(odataResponse.getEntity()).thenReturn(input);
+    servlet.createResponse(servletResponse, odataResponse, true);
+
+    String outputContent = new String(bout.toByteArray());
+    Assert.assertEquals("", outputContent);
+  }
+
 
   @Test
   public void inputStreamResponse() throws Exception {

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/087f2364/odata2-lib/odata-fit/src/test/java/org/apache/olingo/odata2/fit/basic/BasicHttpTest.java
----------------------------------------------------------------------
diff --git 
a/odata2-lib/odata-fit/src/test/java/org/apache/olingo/odata2/fit/basic/BasicHttpTest.java
 
b/odata2-lib/odata-fit/src/test/java/org/apache/olingo/odata2/fit/basic/BasicHttpTest.java
index 408373c..a0efd4c 100644
--- 
a/odata2-lib/odata-fit/src/test/java/org/apache/olingo/odata2/fit/basic/BasicHttpTest.java
+++ 
b/odata2-lib/odata-fit/src/test/java/org/apache/olingo/odata2/fit/basic/BasicHttpTest.java
@@ -19,6 +19,7 @@
 package org.apache.olingo.odata2.fit.basic;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 import static org.mockito.Matchers.any;
 import static org.mockito.Mockito.mock;
@@ -31,12 +32,7 @@ import javax.ws.rs.HttpMethod;
 
 import org.apache.http.HttpEntity;
 import org.apache.http.HttpResponse;
-import org.apache.http.client.methods.HttpDelete;
-import org.apache.http.client.methods.HttpHead;
-import org.apache.http.client.methods.HttpOptions;
-import org.apache.http.client.methods.HttpPatch;
-import org.apache.http.client.methods.HttpPost;
-import org.apache.http.client.methods.HttpPut;
+import org.apache.http.client.methods.*;
 import org.apache.http.entity.StringEntity;
 import org.apache.olingo.odata2.api.commons.HttpStatusCodes;
 import org.apache.olingo.odata2.api.commons.ODataHttpMethod;
@@ -107,6 +103,27 @@ public class BasicHttpTest extends AbstractBasicTest {
   }
 
   @Test
+  public void head() throws Exception {
+    HttpResponse response = executeHeadRequest("/");
+    assertEquals(HttpStatusCodes.OK.getStatusCode(), 
response.getStatusLine().getStatusCode());
+    assertNull(response.getEntity());
+
+    response = executeHeadRequest("$metadata");
+    assertEquals(HttpStatusCodes.OK.getStatusCode(), 
response.getStatusLine().getStatusCode());
+    assertNull(response.getEntity());
+
+    response = executeHeadRequest("//////$metadata");
+    assertEquals(HttpStatusCodes.OK.getStatusCode(), 
response.getStatusLine().getStatusCode());
+    assertNull(response.getEntity());
+    response = executeHeadRequest("/./$metadata");
+    assertEquals(HttpStatusCodes.NOT_FOUND.getStatusCode(), 
response.getStatusLine().getStatusCode());
+    assertNull(response.getEntity());
+    response = executeHeadRequest("$metadata/./");
+    assertEquals(HttpStatusCodes.BAD_REQUEST.getStatusCode(), 
response.getStatusLine().getStatusCode());
+  }
+
+
+  @Test
   public void put() throws Exception {
     final HttpPut put = new HttpPut(URI.create(getEndpoint().toString() + 
"aaa/bbb/ccc"));
     final HttpResponse response = getHttpClient().execute(put);
@@ -196,10 +213,7 @@ public class BasicHttpTest extends AbstractBasicTest {
 
   @Test
   public void unsupportedMethod() throws Exception {
-    HttpResponse response = getHttpClient().execute(new 
HttpHead(getEndpoint()));
-    assertEquals(HttpStatusCodes.NOT_IMPLEMENTED.getStatusCode(), 
response.getStatusLine().getStatusCode());
-
-    response = getHttpClient().execute(new HttpOptions(getEndpoint()));
+    HttpResponse response = getHttpClient().execute(new 
HttpOptions(getEndpoint()));
     assertEquals(HttpStatusCodes.NOT_IMPLEMENTED.getStatusCode(), 
response.getStatusLine().getStatusCode());
   }
 
@@ -218,6 +232,7 @@ public class BasicHttpTest extends AbstractBasicTest {
     tunnelPost("X-HTTP-Method", ODataHttpMethod.PUT);
     tunnelPost("X-HTTP-Method", ODataHttpMethod.GET);
     tunnelPost("X-HTTP-Method", ODataHttpMethod.POST);
+    tunnelPost("X-HTTP-Method", "HEAD", HttpStatusCodes.NOT_FOUND);
 
     tunnelPost("X-HTTP-Method-Override", ODataHttpMethod.MERGE);
     tunnelPost("X-HTTP-Method-Override", ODataHttpMethod.PATCH);
@@ -225,6 +240,7 @@ public class BasicHttpTest extends AbstractBasicTest {
     tunnelPost("X-HTTP-Method-Override", ODataHttpMethod.PUT);
     tunnelPost("X-HTTP-Method-Override", ODataHttpMethod.GET);
     tunnelPost("X-HTTP-Method-Override", ODataHttpMethod.POST);
+    tunnelPost("X-HTTP-Method-Override", "HEAD", HttpStatusCodes.NOT_FOUND);
   }
 
   private void tunnelPost(final String header, final ODataHttpMethod method) 
throws IOException {
@@ -256,8 +272,6 @@ public class BasicHttpTest extends AbstractBasicTest {
 
   @Test
   public void tunneledUnsupportedMethod() throws Exception {
-    tunnelPost("X-HTTP-Method", HttpMethod.HEAD, 
HttpStatusCodes.NOT_IMPLEMENTED);
-    tunnelPost("X-HTTP-Method-Override", HttpMethod.HEAD, 
HttpStatusCodes.NOT_IMPLEMENTED);
     tunnelPost("X-HTTP-Method", HttpMethod.OPTIONS, 
HttpStatusCodes.NOT_IMPLEMENTED);
     tunnelPost("X-HTTP-Method-Override", HttpMethod.OPTIONS, 
HttpStatusCodes.NOT_IMPLEMENTED);
   }
@@ -271,4 +285,9 @@ public class BasicHttpTest extends AbstractBasicTest {
   public void tunneledUnknownMethodOverride() throws Exception {
     tunnelPost("X-HTTP-Method-Override", "xxx", 
HttpStatusCodes.NOT_IMPLEMENTED);
   }
+
+  protected HttpResponse executeHeadRequest(final String request) throws 
IOException {
+    final HttpHead head = new HttpHead(URI.create(getEndpoint().toString() + 
request));
+    return getHttpClient().execute(head);
+  }
 }

Reply via email to