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); + } }
