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 13:45, Sergey Beryozkin <[email protected]
<mailto:[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 <tel:%2B34%2093%20357%2099%2027>
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]>
<mailto:[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> <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]>
<mailto:[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>
<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]> <mailto:[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>
<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>
<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>
<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>
<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>
<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]>
<mailto:juliocarlos.barrera@__i2cat.net
<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>
<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]>
<mailto:[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>
<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]>
<mailto:[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