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.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.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$URLConnectionWrappedOutputStream.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>>
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/**><h__ttps://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-**>
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
<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:[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://547215.n5.nabble.com/*__*JaxRS-**
<http://547215.n5.nabble.com/**JaxRS-**><http://547215.n5.__nabble.com/JaxRS-**
<http://547215.n5.nabble.com/JaxRS-**>>
Client-with-Deletes-td5731444.__******html<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:/**/cxf.547215.n5.__nabble.com/**JaxRS-Client-__with-Deletes-**
<http://cxf.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