From 23272ac87c2a0f089901ef74542a2352b645edf9 Mon Sep 17 00:00:00 2001 From: Dmitry Panov Date: Wed, 9 Aug 2017 12:59:59 +0300 Subject: [PATCH] Fix of non thread safe map reqHeaders - SOAP_ACTION is shared between different requests despite thread.local.request.context=true. Reproduced under load of 100 transactions per second. --- .../SoapPreProtocolOutInterceptor.java | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/SoapPreProtocolOutInterceptor.java b/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/SoapPreProtocolOutInterceptor.java index 7c78ed77e81..d4be2d53d18 100644 --- a/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/SoapPreProtocolOutInterceptor.java +++ b/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/SoapPreProtocolOutInterceptor.java @@ -114,17 +114,16 @@ private void setSoapAction(SoapMessage message) { String action = getSoapAction(message, boi); if (message.getVersion() instanceof Soap11) { + Map> tempReqHeaders = new TreeMap>(String.CASE_INSENSITIVE_ORDER); Map> reqHeaders - = CastUtils.cast((Map)message.get(Message.PROTOCOL_HEADERS)); - if (reqHeaders == null) { - reqHeaders = new TreeMap>(String.CASE_INSENSITIVE_ORDER); + = CastUtils.cast((Map)message.get(Message.PROTOCOL_HEADERS)); + if (reqHeaders != null) { + tempReqHeaders.putAll(reqHeaders); } - - if (reqHeaders.size() == 0) { - message.put(Message.PROTOCOL_HEADERS, reqHeaders); + if (!tempReqHeaders.containsKey(SoapBindingConstants.SOAP_ACTION)) { + tempReqHeaders.put(SoapBindingConstants.SOAP_ACTION, Collections.singletonList(action)); } - - reqHeaders.put(SoapBindingConstants.SOAP_ACTION, Collections.singletonList(action)); + message.put(Message.PROTOCOL_HEADERS, tempReqHeaders); } else if (message.getVersion() instanceof Soap12 && !"\"\"".equals(action)) { String ct = (String) message.get(Message.CONTENT_TYPE);