[ https://issues.apache.org/jira/browse/WSS-702?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17766023#comment-17766023 ]
Cedric Tabin commented on WSS-702: ---------------------------------- Hi [~dkulp], thanks for the reply ! Please find attached a simple project to reproduce the problem. Simply do `mvn clean package` and you will see the test hanging forever, whereas it should crash almost immediately because it is pointed to a non-existent URL. Let me know if you need more information. Also if you have any workaround/advice, it is welcome. [^sample.zip] > Process hangs when a signature is added and server not reachable > ---------------------------------------------------------------- > > Key: WSS-702 > URL: https://issues.apache.org/jira/browse/WSS-702 > Project: WSS4J > Issue Type: Bug > Affects Versions: 3.0.1 > Environment: Linux Debian > JDK 17 > Apache CXF 4.0.2 > WSS4j 3.0.1 (and also 3.0.0) > Reporter: Cedric Tabin > Assignee: Colm O hEigeartaigh > Priority: Major > Attachments: sample.zip > > > Hello, > We are using wss4j with the Apache CXF library to connect to a SOAP web > service. The latter has some security-enabled methods which involves > signature and encryption. > When writing the unit tests related to this, we hit a strange problem: if the > signature is enabled (through `WSS4JOutInterceptor`), then the process hangs > indefinitely during marshalling without any exception regardless of any > timeout set in the configuration (although a "Connection refused" exception > should have been thrown right away since we are pointing to localhost:1234 > but this is the case for any host). > The main problem is if there is any connection issue on the client side and > the server is unreachable, the process will wait forever. > Here is the code snipped involved: > {code:java} > final ClientImpl client = (ClientImpl) ClientProxy.getClient(port); > //url points to localhost:1234 on which nothing is listening => connection > should be refused immediately > client.getRequestContext().put(Message.ENDPOINT_ADDRESS, url); > client.setThreadLocalRequestContext(true); > client.setSynchronousTimeout(10000); > final HTTPConduit httpConduit = (HTTPConduit) client.getConduit(); > HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy(); > httpClientPolicy.setReceiveTimeout(1200000); > httpClientPolicy.setAllowChunking(true); > httpClientPolicy.setMaxRetransmits(0); > httpConduit.setClient(httpClientPolicy); > TLSClientParameters tlsClientParameters = new TLSClientParameters(); > tlsClientParameters.setSecureSocketProtocol("TLSv1.3"); > tlsClientParameters.setDisableCNCheck(true); > httpConduit.setTlsClientParameters(tlsClientParameters); > { > WSEncryptionPart sigTimestamp = new WSEncryptionPart("Timestamp", > WSConstants.WSU_NS, ""); > WSEncryptionPart sigBody = new WSEncryptionPart("Body", > WSConstants.URI_SOAP11_ENV, ""); > SignatureActionToken erpSignature = new SignatureActionToken(); > erpSignature.setUser(getSignatureUser()); > erpSignature.setCryptoProperties(getOutSecurityPropFile()); > erpSignature.setKeyIdentifierId(WSConstants.BST_DIRECT_REFERENCE); > erpSignature.setSignatureAlgorithm(WSConstants.RSA_SHA256); > erpSignature.setDigestAlgorithm(WSConstants.SHA256); > erpSignature.setParts(Arrays.asList(sigTimestamp, sigBody)); > List<HandlerAction> actions = new ArrayList<>(); > actions.add(new HandlerAction(WSConstants.TS, null)); > actions.add(new HandlerAction(WSConstants.SIGN, erpSignature)); > Map<String, Object> properties = getOutSecurityProperties(); > properties.put(WSHandlerConstants.HANDLER_ACTIONS, actions); > ExtensibleWSS4JOutInterceptor wss4JOutInterceptor = new > ExtensibleWSS4JOutInterceptor(properties, getAfterSignatureCallbacks()); > wss4JOutInterceptor.setId("WSS4JOutSignatureInterceptor"); > //if this line is commented => the process fails directly (which is > correct) because nothing is listening at the endpoint > client.getOutInterceptors().add(wss4JOutInterceptor); > } > String operation = jaxbElement.getName().getLocalPart(); > Object[] object = client.invoke(operation, jaxbElement.getValue()); > return object[0]; > {code} > If the `wss4JOutInterceptor` is not added, the the process immediately fails > (which is expected). > {noformat} > org.apache.cxf.interceptor.Fault: Could not send Message. > at > org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:67) > at > org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307) > at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:528) > at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:439) > at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:354) > at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:312) > at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:332) > at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:318) > Caused by: java.net.ConnectException: ConnectException invoking > [https://localhost:1234/Invalid:] Connection refused > at > java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native > Method) > at > java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77) > at > java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) > at > java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) > at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480) > Caused by: java.net.ConnectException > at > java.net.http/jdk.internal.net.http.common.Utils.toConnectException(Utils.java:1055) > at > java.net.http/jdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:198) > at > java.net.http/jdk.internal.net.http.PlainHttpConnection.checkRetryConnect(PlainHttpConnection.java:230) > at > java.net.http/jdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$1(PlainHttpConnection.java:206) > at > java.base/java.util.concurrent.CompletableFuture.uniHandle(CompletableFuture.java:934) > at > java.base/java.util.concurrent.CompletableFuture$UniHandle.tryFire(CompletableFuture.java:911) > at > java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510) > at > java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1773) > at > java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) > at > java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) > at java.base/java.lang.Thread.run(Thread.java:833) > Caused by: java.nio.channels.ClosedChannelException > at > java.base/sun.nio.ch.SocketChannelImpl.ensureOpen(SocketChannelImpl.java:195) > at > java.base/sun.nio.ch.SocketChannelImpl.beginConnect(SocketChannelImpl.java:760) > at java.base/sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:848) > at > java.net.http/jdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$0(PlainHttpConnection.java:183) > at > java.base/java.security.AccessController.doPrivileged(AccessController.java:569) > at > java.net.http/jdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:185) > {noformat} > If any help, here is the stacktrace where the process hangs forever: > {noformat} > at java.lang.Object.wait(Object.java) > at java.io.PipedInputStream.awaitSpace(PipedInputStream.java:273) > at java.io.PipedInputStream.receive(PipedInputStream.java:231) > at java.io.PipedOutputStream.write(PipedOutputStream.java:150) > at > org.apache.cxf.io.AbstractWrappedOutputStream.write(AbstractWrappedOutputStream.java:51) > at > org.apache.cxf.io.AbstractThresholdOutputStream.write(AbstractThresholdOutputStream.java:69) > at > org.glassfish.jaxb.runtime.v2.runtime.output.UTF8XmlOutput.write(UTF8XmlOutput.java:386) > at > org.glassfish.jaxb.runtime.v2.runtime.output.Encoded.write(Encoded.java:137) > at > org.glassfish.jaxb.runtime.v2.runtime.output.UTF8XmlOutput.writePrefix(UTF8XmlOutput.java:205) > at > org.glassfish.jaxb.runtime.v2.runtime.output.UTF8XmlOutput.writeName(UTF8XmlOutput.java:209) > at > org.glassfish.jaxb.runtime.v2.runtime.output.UTF8XmlOutput.beginStartTag(UTF8XmlOutput.java:138) > at > org.glassfish.jaxb.runtime.v2.runtime.output.ForkXmlOutput.beginStartTag(ForkXmlOutput.java:48) > at > org.glassfish.jaxb.runtime.v2.runtime.XMLSerializer.leafElement(XMLSerializer.java:288) > at > org.glassfish.jaxb.runtime.v2.model.impl.RuntimeBuiltinLeafInfoImpl$StringImplImpl.writeLeafElement(RuntimeBuiltinLeafInfoImpl.java:1115) > at > org.glassfish.jaxb.runtime.v2.model.impl.RuntimeBuiltinLeafInfoImpl$StringImplImpl.writeLeafElement(RuntimeBuiltinLeafInfoImpl.java:1092) > at > org.glassfish.jaxb.runtime.v2.runtime.reflect.TransducedAccessor$CompositeTransducedAccessorImpl.writeLeafElement(TransducedAccessor.java:224) > at > org.glassfish.jaxb.runtime.v2.runtime.property.SingleElementLeafProperty.serializeBody(SingleElementLeafProperty.java:94) > at > org.glassfish.jaxb.runtime.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:334) > at > org.glassfish.jaxb.runtime.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:659) > at > org.glassfish.jaxb.runtime.v2.runtime.property.SingleElementNodeProperty.serializeBody(SingleElementNodeProperty.java:128) > at > org.glassfish.jaxb.runtime.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:334) > at > org.glassfish.jaxb.runtime.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:659) > at > org.glassfish.jaxb.runtime.v2.runtime.property.SingleElementNodeProperty.serializeBody(SingleElementNodeProperty.java:128) > at > org.glassfish.jaxb.runtime.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:334) > at > org.glassfish.jaxb.runtime.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:659) > at > org.glassfish.jaxb.runtime.v2.runtime.property.ArrayElementNodeProperty.serializeItem(ArrayElementNodeProperty.java:38) > at > org.glassfish.jaxb.runtime.v2.runtime.property.ArrayElementProperty.serializeListBody(ArrayElementProperty.java:132) > at > org.glassfish.jaxb.runtime.v2.runtime.property.ArrayERProperty.serializeBody(ArrayERProperty.java:122) > at > org.glassfish.jaxb.runtime.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:334) > at > org.glassfish.jaxb.runtime.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:659) > at > org.glassfish.jaxb.runtime.v2.runtime.property.SingleElementNodeProperty.serializeBody(SingleElementNodeProperty.java:128) > at > org.glassfish.jaxb.runtime.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:334) > at > org.glassfish.jaxb.runtime.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:659) > at > org.glassfish.jaxb.runtime.v2.runtime.property.SingleElementNodeProperty.serializeBody(SingleElementNodeProperty.java:128) > at > org.glassfish.jaxb.runtime.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:334) > at > org.glassfish.jaxb.runtime.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:659) > at > org.glassfish.jaxb.runtime.v2.runtime.property.SingleElementNodeProperty.serializeBody(SingleElementNodeProperty.java:128) > at > org.glassfish.jaxb.runtime.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:334) > at > org.glassfish.jaxb.runtime.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:659) > at > org.glassfish.jaxb.runtime.v2.runtime.property.SingleElementNodeProperty.serializeBody(SingleElementNodeProperty.java:128) > at > org.glassfish.jaxb.runtime.v2.runtime.ElementBeanInfoImpl$1.serializeBody(ElementBeanInfoImpl.java:125) > at > org.glassfish.jaxb.runtime.v2.runtime.ElementBeanInfoImpl$1.serializeBody(ElementBeanInfoImpl.java:93) > at > org.glassfish.jaxb.runtime.v2.runtime.ElementBeanInfoImpl.serializeBody(ElementBeanInfoImpl.java:316) > at > org.glassfish.jaxb.runtime.v2.runtime.ElementBeanInfoImpl.serializeRoot(ElementBeanInfoImpl.java:324) > at > org.glassfish.jaxb.runtime.v2.runtime.ElementBeanInfoImpl.serializeRoot(ElementBeanInfoImpl.java:38) > at > org.glassfish.jaxb.runtime.v2.runtime.XMLSerializer.childAsRoot(XMLSerializer.java:456) > at > org.glassfish.jaxb.runtime.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:265) > at > org.glassfish.jaxb.runtime.v2.runtime.MarshallerImpl.marshal(MarshallerImpl.java:197) > at > jakarta.xml.bind.helpers.AbstractMarshallerImpl.marshal(AbstractMarshallerImpl.java:86) > at > org.apache.cxf.jaxb.JAXBEncoderDecoder.writeObject(JAXBEncoderDecoder.java:642) > at > org.apache.cxf.jaxb.JAXBEncoderDecoder.marshall(JAXBEncoderDecoder.java:244) > at org.apache.cxf.jaxb.io.DataWriterImpl.write(DataWriterImpl.java:238) > at > org.apache.cxf.interceptor.AbstractOutDatabindingInterceptor.writeParts(AbstractOutDatabindingInterceptor.java:118) > at > org.apache.cxf.wsdl.interceptors.BareOutInterceptor.handleMessage(BareOutInterceptor.java:68) > at > org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307) > at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:528) > at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:439) > at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:354) > at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:312) > at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:332) > at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:318) > {noformat} > Any workaround is welcome. > Thanks & best regards. > -- This message was sent by Atlassian Jira (v8.20.10#820010) --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@ws.apache.org For additional commands, e-mail: dev-h...@ws.apache.org