Bad news then. Anyway the filter does not work, because the calls requestContext.setUri(...) did not change the real URI used at the end. But the method requestContext.setMEthod(...) worked...
[image: i2cat] Julio C. Barrera Juez Office phone: +34 93 357 99 27 Distributed Applications and Networks Area (DANA) i2CAT Foundation, Barcelona, Spain http://dana.i2cat.net On 17 October 2013 13:45, Sergey Beryozkin <[email protected]> wrote: > Hi > > The method is definitely returned in CXF 2.7.7, I've just added a test > confirming that. A lot of fixes went into the client-side 2.0 code, some of > it is still on the trunk only as they deal more with various very edgy TCK > issues, I'm not sure yet if they should make to CXF 2.7.8 or not, but a > method getter works in 2.7.7 > > Re the actual exception, I guess this is because we don't have DELETE with > body supported yet > > Sergey > > On 17/10/13 11:51, Julio Carlos Barrera Juez wrote: > >> Hi Sergey. >> >> First of all, excuse me by the duplicate message. >> >> I have just written a Filter like this: >> >> public class PostToDeleteWithBodyFilter implements ClientRequestFilter { >> >> public final static StringEXTRA_PATH= "/mutatePOSTtoDELETE"; >> >> >> @Override >> public void filter(ClientRequestContext requestContext) throws >> IOException { >> String method = requestContext.getMethod(); >> String path = requestContext.getUri().**getPath(); >> >> if (path != null && path.endsWith(EXTRA_PATH)) { >> // remove EXTRA_PATH >> requestContext.setUri(URI.**create(path.substring(0, path.length() - >> EXTRA_PATH.length()))); >> // transform POST into DELETE >> requestContext.setMethod("**DELETE"); >> } >> } >> } >> >> I have some issues again. The method var is null. And the most >> important, an exception is thrown when I use this filter: >> >> Caused by: java.io.IOException: IOException invoking >> http://<my_server>/real_path/**mutatePOSTtoDELETE: insufficient data >> written >> at sun.reflect.**NativeConstructorAccessorImpl.**newInstance0(Native >> Method) >> at >> sun.reflect.**NativeConstructorAccessorImpl.**newInstance(** >> NativeConstructorAccessorImpl.**java:39) >> at >> sun.reflect.**DelegatingConstructorAccessorI**mpl.newInstance(** >> DelegatingConstructorAccessorI**mpl.java:27) >> at java.lang.reflect.Constructor.**newInstance(Constructor.java:**513) >> at >> org.apache.cxf.transport.http.**HTTPConduit$**WrappedOutputStream.** >> mapException(HTTPConduit.java:**1338) >> at >> org.apache.cxf.transport.http.**HTTPConduit$**WrappedOutputStream.close(* >> *HTTPConduit.java:1322) >> at org.apache.cxf.transport.**AbstractConduit.close(** >> AbstractConduit.java:56) >> at org.apache.cxf.transport.http.**HTTPConduit.close(HTTPConduit.** >> java:622) >> at >> org.apache.cxf.interceptor.**MessageSenderInterceptor$** >> MessageSenderEndingInterceptor**.handleMessage(** >> MessageSenderInterceptor.java:**62) >> ... 31 more >> Caused by: java.io.IOException: insufficient data written >> at >> sun.net.www.protocol.http.**HttpURLConnection$** >> StreamingOutputStream.close(**HttpURLConnection.java:2861) >> at >> sun.net.www.protocol.http.**HttpURLConnection.**getInputStream(** >> HttpURLConnection.java:1175) >> at java.net.HttpURLConnection.**getResponseCode(** >> HttpURLConnection.java:379) >> at >> org.apache.cxf.transport.http.**URLConnectionHTTPConduit$** >> URLConnectionWrappedOutputStre**am.getResponseCode(** >> URLConnectionHTTPConduit.java:**260) >> at >> org.apache.cxf.transport.http.**HTTPConduit$**WrappedOutputStream.** >> handleResponseInternal(**HTTPConduit.java:1517) >> at >> org.apache.cxf.transport.http.**HTTPConduit$**WrappedOutputStream.** >> handleResponse(HTTPConduit.**java:1490) >> at >> org.apache.cxf.transport.http.**HTTPConduit$**WrappedOutputStream.close(* >> *HTTPConduit.java:1309) >> ... 34 more >> >> I tried to detect the special message to be mutated using an extra path >> string appended to the real path. It worked, it was detected, but >> something went wrong... >> >> i2cat >> Julio C. Barrera Juez >> Office phone: +34 93 357 99 27 >> Distributed Applications and Networks Area (DANA) >> i2CAT Foundation, Barcelona, Spain >> http://dana.i2cat.net <http://dana.i2cat.net/> >> >> >> >> On 17 October 2013 12:17, Sergey Beryozkin <[email protected] >> <mailto:[email protected]>> wrote: >> >> Hi >> >> Can you register an instance of JAX-RS 2.0 ClientRequestFilter (as a >> provider) and set your method & request URI if needed there ? >> That should make it simpler for you. >> >> Re using a custom CXF interceptor, it really should have the >> properties which you check already set on the message passed to >> handleMessage(), that message is an out message, so you should have >> "message == message.getExchange().__**getOutMessage()" hold true. >> >> >> Cheers, Sergey >> >> >> On 17/10/13 08:11, Julio Carlos Barrera Juez wrote: >> >> I'm trying to workaround this problem with an output CXF >> interceptor. I >> have modified the DELETE request to be a POST request allowing a >> body. I >> want that my interceptor will detect the POST request and will >> change it to >> a DELETE. I'm having some problems to achieve it. How can the >> interceptor >> modify the message object to achieve my goal? >> >> I have written something like this: >> >> public class PostToDeleteWithBodyIntercepto**__r extends >> AbstractPhaseInterceptor<__**Message> { >> >> >> public final static String EXTRA_PATH = "/mutatePOSTtoDELETE"; >> >> public PostToDeleteWithBodyIntercepto**__r() { >> >> super(Phase.PRE_PROTOCOL); >> } >> >> public void handleMessage(Message message) { >> String path = (String) >> message.getExchange().__**getOutMessage().get(Message.__** >> REQUEST_URI); >> String method = (String) >> message.getExchange().__**getOutMessage().get(Message.__** >> HTTP_REQUEST_METHOD); >> >> if (method != null && method.equals("POST") && path != null && >> path.endsWith(EXTRA_PATH)) { >> // TODO remove EXTRA_PATH >> // TODO transform POST into DELETE >> } >> } >> } >> >> I have a few doubts: >> >> - I don't know how to modify the path and the method of the >> request. I >> >> have tried modifying the content of the >> - I don't know what is the exact phase where apply it. >> - Why do I need to look for exchange, out message to see >> current path >> >> and method? It should be in the message, but the values are >> null. >> >> Thank you! >> >> [image: i2cat] >> Julio C. Barrera Juez >> Office phone: +34 93 357 99 27 <tel:%2B34%2093%20357%2099%**2027> >> >> Distributed Applications and Networks Area (DANA) >> i2CAT Foundation, Barcelona, Spain >> http://dana.i2cat.net >> >> >> On 16 October 2013 16:54, Sergey Beryozkin <[email protected] >> <mailto:[email protected]>> wrote: >> >> Hi, >> >> On 16/10/13 15:36, Julio Carlos Barrera Juez wrote: >> >> Yes, the server is not under my control. I want to >> develop a client >> because >> I like how CXF works and it is a dependency for other >> issues in my >> project. >> Obviously I would never develop a service with body in >> DELETE requests. >> >> The, taking into account that I'm using CXF 2.7.x, is it >> possible to >> workaround my problem using CXF? >> >> Probably not at the moment, >> >> I've opened >> >> https://issues.apache.org/**__**jira/browse/CXF-5337<https://issues.apache.org/**__jira/browse/CXF-5337> >> >> <https://issues.apache.org/****jira/browse/CXF-5337<https://issues.apache.org/**jira/browse/CXF-5337> >> ><https://**__issues.apache.org/jira/**browse/__CXF-5337<http://issues.apache.org/jira/browse/__CXF-5337> >> >> >> <https://issues.apache.org/**jira/browse/CXF-5337<https://issues.apache.org/jira/browse/CXF-5337> >> >> >> >> >> Please watch it. >> >> In meantime, may be it is possible to 'tunnel' it, example, >> use POST but >> set some header with the real/intended HTTP verb such as >> DELETE, the target >> server would need to replace POST with DELETE, the easy way >> is to say >> create Servlet filter which will use HTTPServletRequest >> wrapper to return >> DELETE, some work is needed there but no changes to the >> server code itself >> will be required. >> >> Otherwise - try snapshots once CXF-5337 gets resolved >> >> Thanks, Sergey >> >> Thank you Sergey! >> >> [image: i2cat] >> Julio C. Barrera Juez >> Office phone: +34 93 357 99 27 >> <tel:%2B34%2093%20357%2099%**2027> >> >> Distributed Applications and Networks Area (DANA) >> i2CAT Foundation, Barcelona, Spain >> http://dana.i2cat.net >> >> >> On 16 October 2013 16:23, Sergey Beryozkin >> <[email protected] <mailto:[email protected]>> >> wrote: >> >> Right, looks like the following has to be done with >> HTTPClient: >> >> >> https://code.google.com/p/****** >> __rest-client/source/browse/**<https://code.google.com/p/****__rest-client/source/browse/**> >> <https://code.google.com/p/***** >> *rest-client/source/browse/**<https://code.google.com/p/****rest-client/source/browse/**> >> >**<h__ttps://code.google.com/p/****__rest-client/source/browse/****<http://code.google.com/p/**__rest-client/source/browse/**> >> <https://code.google.com/p/**** >> rest-client/source/browse/**<https://code.google.com/p/**rest-client/source/browse/**> >> >> >> restclient-lib/src/main/java/*** >> __***org/wiztools/restclient/_**_http/**** >> EntityEnclosingDelete.java<__**htt**ps:// >> code.google.com/p/__**rest-** <http://code.google.com/p/__rest-**> >> >> <http://code.google.com/p/**rest-**<http://code.google.com/p/rest-**> >> > >> client/source/browse/**__** >> restclient-lib/src/main/java/***__* >> org/wiztools/restclient/http/*** >> __*EntityEnclosingDelete.java<**ht__tps://code.google.com/p/** >> rest-__client/source/browse/__**restclient-lib/src/main/java/_** >> _org/wiztools/restclient/http/**__EntityEnclosingDelete.java<http://code.google.com/p/rest-__client/source/browse/__restclient-lib/src/main/java/__org/wiztools/restclient/http/__EntityEnclosingDelete.java> >> >> <https://code.google.com/p/** >> rest-client/source/browse/**restclient-lib/src/main/java/** >> org/wiztools/restclient/http/**EntityEnclosingDelete.java<https://code.google.com/p/rest-client/source/browse/restclient-lib/src/main/java/org/wiztools/restclient/http/EntityEnclosingDelete.java> >> >> >> >> >> >> >> This is the code based on the advice from HttpClient >> forums. >> >> I guess we should check if CXF Async Conduit can be >> updated respectively >> >> By the way, I'm assuming you have to do DELETE with >> a body because you >> have some existing/legacy service expecting it this >> way ? Now and then >> users ask about it, and I don't mind to get the >> Async HTTP conduit >> updated >> a bit anyway, but if you have say a CXF server >> listening, then I'm sure >> there could be an easier way :-) >> >> Cheers, Sergey >> >> >> On 16/10/13 15:11, Julio Carlos Barrera Juez wrote: >> >> Looking for logs, I've realized that the property >> is producing changes. >> >> I >> mean the Async HTTP client is being used. >> However my DELETE request has >> no >> body. My client interface is JAX-RS annotated, >> my Resource class is JaxB >> annotated: >> >> @Path("/server/path") >> @DELETE >> @Consumes(MediaType.****__**APPLICATION_JSON) >> >> >> >> public void deleteResource(Resource >> resource); >> >> I have a create method working with de same >> configuration and it works: >> >> @Path("/server/path") >> @POST >> @Consumes(MediaType.****__**APPLICATION_JSON) >> >> >> >> public void createResource(Resource >> resource); >> >> I'm using Jackson as JSON serializer, but I >> guess it has no relation >> with >> this problem. >> >> These log lines show that the DELETE request has >> content-lenght 0 and >> the Async HTTP client is being used >> >> [I/O dispatcher 2] DEBUG >> org.apache.cxf.transport.http.** >> __****asyncclient.****__**AsyncHTTPConduitFactory$2 >> >> >> - >> >> Connection leased: [id: 2][route: >> {}->http://my_server][total kept >> alive: >> 0; route allocated: 1 of 1000; total allocated: >> 0 of 5000] >> [I/O dispatcher 2] DEBUG >> org.apache.cxf.transport.http.** >> __****asyncclient.****__**AsyncHTTPConduitFactory$3 >> >> >> - >> [exchange: 3] Connection allocated: >> [id:2][route:{}->http:/my_****** >> __server][state:null] >> >> [I/O dispatcher 2] DEBUG >> org.apache.http.impl.nio.**** >> reactor.IOSessionImpl >> - >> http-outgoing-2 192.168.254.86:35152 >> <http://192.168.254.86:35152><** >> ->server___****ip[ACTIVE][r:]: >> >> Set >> attribute >> http.nio.exchange-handler >> [I/O dispatcher 2] DEBUG >> org.apache.http.impl.nio.**** >> reactor.IOSessionImpl >> - >> http-outgoing-2 192.168.254.86:35152 >> <http://192.168.254.86:35152><** >> ->server___****ip[ACTIVE][rw:]**: >> >> Event >> set [w] >> [I/O dispatcher 2] DEBUG >> org.apache.http.impl.nio.**** >> reactor.IOSessionImpl >> - >> http-outgoing-2 192.168.254.86:35152 >> <http://192.168.254.86:35152><** >> ->server___****ip[ACTIVE][rw:]**: >> >> Set >> >> >> attribute http.nio.http-exchange-state >> [I/O dispatcher 2] DEBUG >> org.apache.cxf.transport.http.** >> __****asyncclient.****__**AsyncHTTPConduitFactory$3 >> >> >> - >> >> [exchange: 3] Attempt 1 to execute request >> [I/O dispatcher 2] DEBUG >> org.apache.http.impl.nio.**** >> reactor.IOSessionImpl >> - >> http-outgoing-2 192.168.254.86:35152 >> <http://192.168.254.86:35152><** >> ->server___****ip[ACTIVE][rw:]**: >> >> Set >> timeout >> 60000 >> [I/O dispatcher 2] DEBUG >> org.apache.http.client.**** >> >> protocol.RequestAuthCache >> >> - >> Auth cache not set in the context >> [I/O dispatcher 2] DEBUG >> org.apache.http.client.****__**protocol.****__** >> RequestTargetAuthentication >> >> - >> >> Target >> >> auth >> state: UNCHALLENGED >> [I/O dispatcher 2] DEBUG >> org.apache.http.client.****__**protocol.****__** >> RequestProxyAuthentication >> >> - >> >> Proxy >> >> auth >> state: UNCHALLENGED >> [I/O dispatcher 2] DEBUG org.apache.http.headers >> - http-outgoing-2 >> * >> DELETE* /server/path HTTP/1.1 >> >> [I/O dispatcher 2] DEBUG org.apache.http.headers >> - http-outgoing-2 >> >> Accept: text/plain >> [I/O dispatcher 2] DEBUG org.apache.http.headers >> - http-outgoing-2 >> >> User-Agent: Apache CXF 2.7.4 >> [I/O dispatcher 2] DEBUG org.apache.http.headers >> - http-outgoing-2 >> >> *Content-Length: >> 0* >> >> [I/O dispatcher 2] DEBUG org.apache.http.headers >> - http-outgoing-2 >> >> Host: >> my_server >> [I/O dispatcher 2] DEBUG org.apache.http.headers >> - http-outgoing-2 >> >> Connection: Keep-Alive >> >> [image: i2cat] >> Julio C. Barrera Juez >> Office phone: +34 93 357 99 27 >> <tel:%2B34%2093%20357%2099%**2027> >> >> Distributed Applications and Networks Area (DANA) >> i2CAT Foundation, Barcelona, Spain >> http://dana.i2cat.net >> >> >> On 16 October 2013 15:17, Julio Carlos Barrera >> Juez < >> [email protected] >> >> <mailto:juliocarlos.barrera@**i2cat.net<[email protected]>>> >> wrote: >> >> I don't know how to install CXF Async HTTP >> transport. I have the maven >> >> artifact in my project dependencies, but >> nothing else. >> >> [image: i2cat] >> Julio C. Barrera Juez >> Office phone: +34 93 357 99 27 >> <tel:%2B34%2093%20357%2099%**2027> >> >> Distributed Applications and Networks Area >> (DANA) >> i2CAT Foundation, Barcelona, Spain >> http://dana.i2cat.net >> >> >> On 16 October 2013 13:14, Sergey Beryozkin >> <[email protected] >> <mailto:[email protected]>> >> >> wrote: >> >> I guess you don't have CXF Async HTTP >> transport installed ? >> >> Other than that I've no idea, if it >> won;t work with the Async module >> then >> I guess it is possible to do >> Sergey >> >> On 16/10/13 11:49, Julio Carlos Barrera >> Juez wrote: >> >> I tried to use this information >> before, but I don't know how to >> solve >> >> my >> problem. >> >> I have something like this: >> >> ProxyClassLoader classLoader = new >> ProxyClassLoader(); >> >> classLoader.addLoader(******__** >> IServiceInterface.class.**** >> getClassLoader()); >> classLoader.addLoader(******__** >> JAXRSClientFactoryBean.class.***__***** >> >> >> >> >> getClassLoader()); >> >> JAXRSClientFactoryBean bean = new >> JAXRSClientFactoryBean(); >> bean.setAddress(uri); >> bean.setResourceClass(******__** >> IServiceInterface.class); >> >> bean.setClassLoader(******__** >> classLoader); >> >> >> >> >> >> client (IServiceInterface) >> bean.create(); >> >> Then I can use the client object as >> usual. But if fails sending >> DELETE >> requests with body. >> >> I tried doing this: >> >> ProxyClassLoader classLoader = new >> ProxyClassLoader(); >> >> classLoader.addLoader(******__** >> IServiceInterface.class.**** >> getClassLoader()); >> classLoader.addLoader(******__** >> JAXRSClientFactoryBean.class.***__***** >> >> >> >> >> getClassLoader()); >> >> JAXRSClientFactoryBean bean = new >> JAXRSClientFactoryBean(); >> bean.setAddress(uri); >> bean.setResourceClass(******__** >> IServiceInterface.class); >> >> bean.setClassLoader(******__** >> classLoader); >> >> >> >> >> >> // allow body in DELETE requests >> Client client = bean.create(); >> >> WebClient.getConfig(client).**** >> __****getRequestContext().put(**"*__* >> >> use.**** >> async.http.conduit", >> true); >> >> (IServiceInterface) >> client.******__** >> whateverMethodThatSendsDelete(**__** >> >> >> ****); >> >> >> >> But it didn't work. >> >> What am I missing? >> >> [image: i2cat] >> Julio C. Barrera Juez >> Office phone: +34 93 357 99 27 >> <tel:%2B34%2093%20357%2099%**2027> >> >> Distributed Applications and >> Networks Area (DANA) >> i2CAT Foundation, Barcelona, Spain >> http://dana.i2cat.net >> >> >> On 16 October 2013 12:00, Sergey >> Beryozkin <[email protected] >> <mailto:[email protected]>> >> >> wrote: >> >> Hi >> >> >> On 16/10/13 09:18, Julio Carlos >> Barrera Juez wrote: >> >> Hi. >> >> >> I'm creating a REST client >> using JAXRSClientFactoryBean >> and >> ProxyClassLoader based on a >> JAXRS annotated Java >> interface. >> >> I want to send a DELETE with >> body, which is not >> recommended by >> RESTful >> philosophy, but it is >> allowed by HTTP 1.1 RFC. >> >> The body is not sent by the >> client and I have read a lot >> of >> problems >> to >> allow it. >> >> Is it possible send a body >> in my DELETE requests with >> this >> configuration? >> >> Please check this thread >> >> >> http://cxf.547215.n5.nabble. >> ****__******com/JaxRS-Client-with-**** >> >> Deletes-**** >> td5731444.html<http://cxf.****** >> __54**7215.n5.nabble.com/**JaxRS-*__***<http://7215.n5.nabble.com/JaxRS-*__***> >> <http://7215.n5.nabble.com/** >> JaxRS-**** <http://7215.n5.nabble.com/JaxRS-****>><http://7215.n5.** >> nabble.com/__JaxRS-** <http://7215.n5.nabble.com/__JaxRS-**> >> <http://7215.n5.nabble.com/** >> JaxRS-** <http://7215.n5.nabble.com/JaxRS-**>>> >> <http://547215.n5.nabble.com/*** >> __*JaxRS-** <http://547215.n5.nabble.com/*__*JaxRS-**> >> <http://547215.n5.nabble.com/*** >> *JaxRS-** <http://547215.n5.nabble.com/**JaxRS-**>><http://547215.n5.__** >> nabble.com/JaxRS-** <http://nabble.com/JaxRS-**> >> <http://547215.n5.nabble.com/** >> JaxRS-** <http://547215.n5.nabble.com/JaxRS-**>>> >> >> >> Client-with-Deletes-td5731444.** >> __******html<http://cxf.**547215. <http://cxf.547215.>__n5. >> <http://cxf.547215.n5.>**** >> nabble.com/JaxRS-Client-with-*** >> __***Deletes-td5731444.html<http://nabble.com/JaxRS-Client-with-*__***Deletes-td5731444.html> >> <http://nabble.com/JaxRS-** >> Client-with-****Deletes-**td5731444.html<http://nabble.com/JaxRS-Client-with-****Deletes-td5731444.html> >> ><http__://nabbl**e.com/JaxRS-Client-__with-****Deletes-td5731444.html<http://nabble.com/JaxRS-Client-__with-**Deletes-td5731444.html> >> <http://nabble.com/JaxRS-** >> Client-with-**Deletes-**td5731444.html<http://nabble.com/JaxRS-Client-with-**Deletes-td5731444.html> >> >> >> <http:/**/cxf.547215.n5.__nabb** >> le.com/**JaxRS-Client-__with-**Deletes-**<http://nabble.com/**JaxRS-Client-__with-Deletes-**> >> <http://cxf.547215.n5.nabble.** >> com/**JaxRS-Client-with-**Deletes-**<http://cxf.547215.n5.nabble.com/**JaxRS-Client-with-Deletes-**> >> > >> >> td5731444.html<http://cxf.__54** >> 7215.n5.nabble.com/JaxRS-__**Client-with-Deletes-td5731444.**__html<http://547215.n5.nabble.com/JaxRS-__Client-with-Deletes-td5731444.__html> >> >> <http://cxf.547215.n5.nabble.** >> com/JaxRS-Client-with-Deletes-**td5731444.html<http://cxf.547215.n5.nabble.com/JaxRS-Client-with-Deletes-td5731444.html> >> >> >> >> >> >> >> >> >> >> >> Cheers, Sergey >> >> >> >> >> Thank you! >> >> >> Regards, Julio >> >> >> [image: i2cat] >> Julio C. Barrera Juez >> Office phone: +34 93 357 99 >> 27 >> <tel:%2B34%2093%20357%2099%** >> 2027> >> >> Distributed Applications and >> Networks Area (DANA) >> i2CAT Foundation, Barcelona, >> Spain >> http://dana.i2cat.net >> >> >> >> >> >> >> -- >> >> Sergey Beryozkin >> >> Talend Community Coders >> http://coders.talend.com/ >> >> Blog: http://sberyozkin.blogspot.com >> >> >> >> >> >> >> -- >> Sergey Beryozkin >> >> Talend Community Coders >> http://coders.talend.com/ >> >> Blog: http://sberyozkin.blogspot.com >> >> >> >> >> -- >> Sergey Beryozkin >> >> Talend Community Coders >> http://coders.talend.com/ >> >> Blog: http://sberyozkin.blogspot.com >> >> >> >> >> >>
