This is an automated email from the ASF dual-hosted git repository.

reta pushed a commit to branch 3.4.x-fixes
in repository https://gitbox.apache.org/repos/asf/cxf.git

commit 5bec09dd449dfbb275e457761a488629169c2bbf
Author: Andriy Redko <[email protected]>
AuthorDate: Sun May 21 09:38:31 2023 -0400

    CXF-8882: Apache HttpClient 5 async conduit does not handle authentication 
(#1279)
    
    (cherry picked from commit 153ecb7c32332882843333856ec4323e75d3f0fc)
    
    # Conflicts:
    #       systests/transport-hc5/pom.xml
    #       
systests/transport-hc5/src/test/java/org/apache/cxf/systest/hc5/http/auth/DigestAuthSupplierSpringTest.java
    (cherry picked from commit 6d68137820399873504ea5d7edeee12b0c17aaec)
    
    # Conflicts:
    #       systests/transport-hc5/pom.xml
    (cherry picked from commit 5b71d5ff2c272a826d72cce106b92231eff92eec)
---
 .../http/asyncclient/hc5/AsyncHTTPConduit.java     |   2 +-
 .../hc5/CXFHttpAsyncRequestProducer.java           |  36 +----
 systests/transport-hc5/pom.xml                     |  36 +++++
 .../http/auth/DigestAuthSupplierSpringTest.java    | 153 +++++++++++++++++++
 .../cxf/systest/hc5/http/auth/DigestAuthTest.java  | 158 ++++++++++++++++++++
 .../cxf/systest/hc5/http/auth/DigestServer.java    |  81 ++++++++++
 .../cxf/systest/hc5/http/auth/GreeterImpl.java     |  20 ++-
 .../systest/hc5/http/auth/jetty-realm.properties   |   2 +
 .../test/resources/digestauth/WEB-INF/beans.xml    |  36 +++++
 .../src/test/resources/digestauth/WEB-INF/web.xml  |  47 ++++++
 .../src/test/resources/logging.properties          |  74 +++++++++
 .../org/apache/cxf/systest/hc5/http/greeting.wsdl  | 166 +++++++++++++++++++++
 12 files changed, 770 insertions(+), 41 deletions(-)

diff --git 
a/rt/transports/http-hc5/src/main/java/org/apache/cxf/transport/http/asyncclient/hc5/AsyncHTTPConduit.java
 
b/rt/transports/http-hc5/src/main/java/org/apache/cxf/transport/http/asyncclient/hc5/AsyncHTTPConduit.java
index 830176005e..7e721628f0 100644
--- 
a/rt/transports/http-hc5/src/main/java/org/apache/cxf/transport/http/asyncclient/hc5/AsyncHTTPConduit.java
+++ 
b/rt/transports/http-hc5/src/main/java/org/apache/cxf/transport/http/asyncclient/hc5/AsyncHTTPConduit.java
@@ -606,7 +606,7 @@ public class AsyncHTTPConduit extends 
URLConnectionHTTPConduit {
             final HttpAsyncClient c = getHttpAsyncClient(tlsStrategy);
             final Credentials creds = 
(Credentials)outMessage.getContextualProperty(Credentials.class.getName());
             if (creds != null) {
-                credsProvider.setCredentials(new AnyAuthScope(), creds);
+                credsProvider.setCredentials(new AuthScope(url.getHost(), 
url.getPort()), creds);
                 ctx.setUserToken(creds.getUserPrincipal());
             }
             @SuppressWarnings("unchecked")
diff --git 
a/rt/transports/http-hc5/src/main/java/org/apache/cxf/transport/http/asyncclient/hc5/CXFHttpAsyncRequestProducer.java
 
b/rt/transports/http-hc5/src/main/java/org/apache/cxf/transport/http/asyncclient/hc5/CXFHttpAsyncRequestProducer.java
index a3e0862902..896dcfd68c 100644
--- 
a/rt/transports/http-hc5/src/main/java/org/apache/cxf/transport/http/asyncclient/hc5/CXFHttpAsyncRequestProducer.java
+++ 
b/rt/transports/http-hc5/src/main/java/org/apache/cxf/transport/http/asyncclient/hc5/CXFHttpAsyncRequestProducer.java
@@ -22,7 +22,6 @@ package org.apache.cxf.transport.http.asyncclient.hc5;
 import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStream;
-import java.net.URI;
 import java.nio.Buffer;
 import java.nio.ByteBuffer;
 import java.nio.channels.Channels;
@@ -30,8 +29,6 @@ import java.nio.channels.ReadableByteChannel;
 
 import org.apache.cxf.io.CachedOutputStream;
 import org.apache.hc.core5.http.HttpException;
-import org.apache.hc.core5.http.HttpHost;
-import org.apache.hc.core5.http.HttpRequest;
 import org.apache.hc.core5.http.nio.AsyncRequestProducer;
 import org.apache.hc.core5.http.nio.DataStreamChannel;
 import org.apache.hc.core5.http.nio.RequestChannel;
@@ -51,21 +48,6 @@ public class CXFHttpAsyncRequestProducer implements 
AsyncRequestProducer {
         this.request = request;
     }
 
-    public HttpHost getTarget() {
-        URI uri = request.getUri();
-        if (uri == null) {
-            throw new IllegalStateException("Request URI is null");
-        }
-        if (!uri.isAbsolute()) {
-            throw new IllegalStateException("Request URI is not absolute");
-        }
-        return new HttpHost(uri.getScheme(), uri.getHost(), uri.getPort());
-    }
-
-    public HttpRequest generateRequest() throws IOException, HttpException {
-        return request;
-    }
-    
     @Override
     public void produce(DataStreamChannel channel) throws IOException {
         if (content != null) {
@@ -94,28 +76,17 @@ public class CXFHttpAsyncRequestProducer implements 
AsyncRequestProducer {
         }
     }
 
-    public void requestCompleted(final HttpContext context) {
-        if (fis != null) {
-            try {
-                fis.close();
-            } catch (IOException io) {
-                //ignore
-            }
-            chan = null;
-            fis = null;
-        }
-        buffer = null;
-    }
-
+    @Override
     public void failed(final Exception ex) {
         buf.shutdown();
     }
 
+    @Override
     public boolean isRepeatable() {
         return request.getOutputStream().retransmitable();
     }
 
-    public void resetRequest() throws IOException {
+    private void resetRequest() {
         if (request.getOutputStream().retransmitable()) {
             content = request.getOutputStream().getCachedStream();
         }
@@ -139,6 +110,7 @@ public class CXFHttpAsyncRequestProducer implements 
AsyncRequestProducer {
             fis = null;
         }
         buffer = null;
+        resetRequest();
     }
 
     @Override
diff --git a/systests/transport-hc5/pom.xml b/systests/transport-hc5/pom.xml
index f4e22446a9..0870f70410 100644
--- a/systests/transport-hc5/pom.xml
+++ b/systests/transport-hc5/pom.xml
@@ -107,6 +107,11 @@
             <artifactId>jetty-alpn-server</artifactId>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>org.eclipse.jetty</groupId>
+            <artifactId>jetty-webapp</artifactId>
+            <scope>test</scope>
+        </dependency>
         <dependency>
             <groupId>org.apache.cxf</groupId>
             <artifactId>cxf-rt-frontend-jaxws</artifactId>
@@ -179,6 +184,37 @@
             <artifactId>spring-context</artifactId>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>org.springframework.security</groupId>
+            <artifactId>spring-security-config</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.security</groupId>
+            <artifactId>spring-security-web</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <version>${cxf.spring.boot.version}</version>
+            <scope>test</scope>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.springframework.boot</groupId>
+                    <artifactId>spring-boot-starter-logging</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>org.junit.jupiter</groupId>
+                    <artifactId>junit-jupiter</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 
     <profiles>
diff --git 
a/systests/transport-hc5/src/test/java/org/apache/cxf/systest/hc5/http/auth/DigestAuthSupplierSpringTest.java
 
b/systests/transport-hc5/src/test/java/org/apache/cxf/systest/hc5/http/auth/DigestAuthSupplierSpringTest.java
new file mode 100644
index 0000000000..f0abaf5596
--- /dev/null
+++ 
b/systests/transport-hc5/src/test/java/org/apache/cxf/systest/hc5/http/auth/DigestAuthSupplierSpringTest.java
@@ -0,0 +1,153 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.cxf.systest.hc5.http.auth;
+
+import javax.ws.rs.NotAuthorizedException;
+import javax.ws.rs.core.MediaType;
+
+import org.apache.cxf.jaxrs.client.WebClient;
+import org.apache.cxf.transport.http.HTTPConduit;
+import org.apache.cxf.transport.http.auth.DigestAuthSupplier;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
+import org.springframework.boot.web.server.LocalServerPort;
+import org.springframework.context.annotation.Bean;
+import 
org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.core.userdetails.User;
+import org.springframework.security.core.userdetails.UserDetails;
+import org.springframework.security.crypto.password.PasswordEncoder;
+import org.springframework.security.provisioning.InMemoryUserDetailsManager;
+import org.springframework.security.web.SecurityFilterChain;
+import 
org.springframework.security.web.authentication.www.DigestAuthenticationEntryPoint;
+import 
org.springframework.security.web.authentication.www.DigestAuthenticationFilter;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@SpringBootTest(
+    classes = {
+        DigestAuthSupplierSpringTest.SecurityConfig.class,
+        DigestAuthSupplierSpringTest.Controller.class
+    },
+    webEnvironment = WebEnvironment.RANDOM_PORT
+)
+@SpringBootApplication
+public class DigestAuthSupplierSpringTest {
+
+    private static final String USER = "alice";
+    private static final String PWD = "ecila";
+
+    @LocalServerPort
+    private int port;
+
+    @Test
+    public void test() {
+        WebClient client = WebClient.create("http://localhost:"; + port, 
(String) null);
+
+        assertThrows(NotAuthorizedException.class, () -> 
client.get(String.class));
+
+        HTTPConduit conduit = WebClient.getConfig(client).getHttpConduit();
+        conduit.setAuthSupplier(new DigestAuthSupplier());
+        conduit.getAuthorization().setUserName(USER);
+        conduit.getAuthorization().setPassword(PWD);
+
+        assertEquals(Controller.RESPONSE, client.get(String.class));
+    }
+
+    @RestController
+    static class Controller {
+
+        static final String RESPONSE = "Hi!";
+
+        @GetMapping(produces = MediaType.TEXT_PLAIN, value = "/")
+        public String get() {
+            return "Hi!";
+        }
+
+    }
+
+    static class SecurityConfig {
+
+        @Bean
+        public SecurityFilterChain filterChain(HttpSecurity http) throws 
Exception {
+            DigestAuthenticationEntryPoint authenticationEntryPoint = 
digestAuthenticationEntryPoint();
+            return http
+                .authorizeRequests().anyRequest().authenticated()
+                    .and()
+                
.exceptionHandling().authenticationEntryPoint(authenticationEntryPoint)
+                    .and()
+                
.addFilter(digestAuthenticationFilter(authenticationEntryPoint))
+                .build();
+        }
+
+        private DigestAuthenticationFilter digestAuthenticationFilter(
+            DigestAuthenticationEntryPoint authenticationEntryPoint) {
+            DigestAuthenticationFilter digestAuthenticationFilter = new 
DigestAuthenticationFilter();
+            
digestAuthenticationFilter.setUserDetailsService(userDetailsService());
+            
digestAuthenticationFilter.setAuthenticationEntryPoint(authenticationEntryPoint);
+            return digestAuthenticationFilter;
+        }
+
+        private static DigestAuthenticationEntryPoint 
digestAuthenticationEntryPoint() {
+            DigestAuthenticationEntryPoint digestAuthenticationEntryPoint = 
new DigestAuthenticationEntryPoint();
+            digestAuthenticationEntryPoint.setKey("acegi");
+            digestAuthenticationEntryPoint.setRealmName("Digest Realm");
+            return digestAuthenticationEntryPoint;
+        }
+
+        @Bean
+        public InMemoryUserDetailsManager userDetailsService() {
+            final UserDetails user = User
+                .builder()
+                .username(USER)
+                .password(PWD)
+                .roles("")
+                .build();
+            return new InMemoryUserDetailsManager(user);
+        }
+
+        @Bean
+        public static PasswordEncoder passwordEncoder() {
+            return new PasswordEncoder() {
+                @Override
+                public String encode(CharSequence rawPassword) {
+                    return rawPassword.toString();
+                }
+                @Override
+                public boolean matches(CharSequence rawPassword, String 
encodedPassword) {
+                    return rawPassword.toString().equals(encodedPassword);
+                }
+            };
+        }
+    }
+
+    public static void main(String[] args) {
+        SpringApplication.run(DigestAuthSupplierSpringTest.class, args);
+    }
+
+}
diff --git 
a/systests/transport-hc5/src/test/java/org/apache/cxf/systest/hc5/http/auth/DigestAuthTest.java
 
b/systests/transport-hc5/src/test/java/org/apache/cxf/systest/hc5/http/auth/DigestAuthTest.java
new file mode 100644
index 0000000000..050f3e7c60
--- /dev/null
+++ 
b/systests/transport-hc5/src/test/java/org/apache/cxf/systest/hc5/http/auth/DigestAuthTest.java
@@ -0,0 +1,158 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.cxf.systest.hc5.http.auth;
+
+
+import java.net.URL;
+import java.util.Map;
+
+import javax.xml.namespace.QName;
+import javax.xml.ws.BindingProvider;
+
+import org.apache.cxf.ext.logging.LoggingInInterceptor;
+import org.apache.cxf.ext.logging.LoggingOutInterceptor;
+import org.apache.cxf.frontend.ClientProxy;
+import org.apache.cxf.helpers.CastUtils;
+import org.apache.cxf.interceptor.Fault;
+import org.apache.cxf.message.Message;
+import org.apache.cxf.phase.AbstractPhaseInterceptor;
+import org.apache.cxf.phase.Phase;
+import org.apache.cxf.testutil.common.AbstractBusClientServerTestBase;
+import org.apache.cxf.testutil.common.TestUtil;
+import org.apache.cxf.transport.http.HTTPConduit;
+import org.apache.cxf.transport.http.HTTPException;
+import org.apache.cxf.transport.http.asyncclient.hc5.AsyncHTTPConduit;
+import org.apache.cxf.transport.http.auth.DigestAuthSupplier;
+import org.apache.cxf.transports.http.configuration.HTTPClientPolicy;
+import org.apache.hc.client5.http.auth.Credentials;
+import org.apache.hc.client5.http.auth.UsernamePasswordCredentials;
+import org.apache.hello_world.Greeter;
+import org.apache.hello_world.services.SOAPService;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.fail;
+
+
+public class DigestAuthTest extends AbstractBusClientServerTestBase {
+    public static final String PORT = allocatePort(DigestServer.class);
+
+    private final QName serviceName =
+        new QName("http://apache.org/hello_world";, "SOAPService");
+    private final QName mortimerQ =
+        new QName("http://apache.org/hello_world";, "Mortimer");
+
+    @BeforeClass
+    public static void startServer() throws Exception {
+        launchServer(DigestServer.class, true);
+        createStaticBus();
+    }
+
+    @Test
+    public void testDigestAuth() throws Exception {
+        final Greeter mortimer = setupClient(false);
+        final String answer = mortimer.sayHi();
+        assertEquals("Unexpected answer: " + answer, "Hi", answer);
+    }
+
+    @Test
+    public void testDigestAuthAsync() throws Exception {
+        final Greeter mortimer = setupClient(true);
+        final String answer = mortimer.sayHi();
+        assertEquals("Unexpected answer: " + answer, "Hi", answer);
+    }
+
+    @Test
+    public void testNoAuth() throws Exception {
+        URL wsdl = getClass().getResource("../greeting.wsdl");
+        assertNotNull("WSDL is null", wsdl);
+        
+        SOAPService service = new SOAPService(wsdl, serviceName);
+        assertNotNull("Service is null", service);
+
+        Greeter mortimer = service.getPort(mortimerQ, Greeter.class);
+        assertNotNull("Port is null", mortimer);
+
+        TestUtil.setAddress(mortimer, "http://localhost:"; + PORT + 
"/digestauth/greeter");
+
+        try {
+            String answer = mortimer.sayHi();
+            fail("Unexpected reply (" + answer + "). Should throw exception");
+        } catch (Exception e) {
+            Throwable cause = e.getCause();
+            assertEquals(HTTPException.class, cause.getClass());
+            HTTPException he = (HTTPException)cause;
+            assertEquals(401, he.getResponseCode());
+        }
+    }
+
+    private Greeter setupClient(boolean async) throws Exception {
+        URL wsdl = getClass().getResource("../greeting.wsdl");
+        assertNotNull("WSDL is null", wsdl);
+        
+        SOAPService service = new SOAPService(wsdl, serviceName);
+        assertNotNull("Service is null", service);
+
+        Greeter mortimer = service.getPort(mortimerQ, Greeter.class);
+        assertNotNull("Port is null", mortimer);
+
+        BindingProvider bp = (BindingProvider)mortimer;
+        ClientProxy.getClient(mortimer).getInInterceptors().add(new 
LoggingInInterceptor());
+        ClientProxy.getClient(mortimer).getOutInterceptors().add(new 
LoggingOutInterceptor());
+        bp.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
+                "http://localhost:"; + PORT + "/digestauth/greeter");
+        HTTPConduit cond = 
(HTTPConduit)ClientProxy.getClient(mortimer).getConduit();
+        HTTPClientPolicy client = new HTTPClientPolicy();
+        client.setConnectionTimeout(600000);
+        client.setReceiveTimeout(600000);
+        cond.setClient(client);
+        if (async) {
+            if (cond instanceof AsyncHTTPConduit) {
+                UsernamePasswordCredentials creds = new 
UsernamePasswordCredentials("foo", "bar".toCharArray());
+                bp.getRequestContext().put(Credentials.class.getName(), creds);
+                bp.getRequestContext().put(AsyncHTTPConduit.USE_ASYNC, 
Boolean.TRUE);
+                client.setAutoRedirect(true);
+            } else {
+                fail("Not an async conduit");
+            }
+        } else {
+            bp.getRequestContext().put(BindingProvider.USERNAME_PROPERTY, 
"foo");
+            bp.getRequestContext().put(BindingProvider.PASSWORD_PROPERTY, 
"bar");
+            cond.setAuthSupplier(new DigestAuthSupplier());
+        }
+
+        ClientProxy.getClient(mortimer).getOutInterceptors()
+            .add(new 
AbstractPhaseInterceptor<Message>(Phase.PRE_STREAM_ENDING) {
+
+                public void handleMessage(Message message) throws Fault {
+                    Map<String, ?> headers = CastUtils.cast((Map<?, 
?>)message.get(Message.PROTOCOL_HEADERS));
+                    if (headers.containsKey("Proxy-Authorization")) {
+                        throw new RuntimeException("Should not have 
Proxy-Authorization");
+                    }
+                }
+            });
+        client.setAllowChunking(false);
+        return mortimer;
+    }
+}
+
diff --git 
a/systests/transport-hc5/src/test/java/org/apache/cxf/systest/hc5/http/auth/DigestServer.java
 
b/systests/transport-hc5/src/test/java/org/apache/cxf/systest/hc5/http/auth/DigestServer.java
new file mode 100644
index 0000000000..dd0c5cef9c
--- /dev/null
+++ 
b/systests/transport-hc5/src/test/java/org/apache/cxf/systest/hc5/http/auth/DigestServer.java
@@ -0,0 +1,81 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.cxf.systest.hc5.http.auth;
+
+import java.net.URL;
+
+import org.apache.cxf.testutil.common.AbstractBusTestServerBase;
+import org.eclipse.jetty.security.HashLoginService;
+import org.eclipse.jetty.security.LoginService;
+import org.eclipse.jetty.server.Handler;
+import org.eclipse.jetty.server.handler.DefaultHandler;
+import org.eclipse.jetty.server.handler.HandlerCollection;
+import org.eclipse.jetty.util.resource.Resource;
+import org.eclipse.jetty.webapp.WebAppContext;
+
+public class DigestServer extends AbstractBusTestServerBase {
+    public static final String PORT = allocatePort(DigestServer.class);
+
+    private org.eclipse.jetty.server.Server server;
+
+    private void configureServer() throws Exception {
+        URL resource = getClass().getResource("jetty-realm.properties");
+
+        LoginService realm =
+            new HashLoginService("BookStoreRealm", resource.toString());
+        server.addBean(realm);
+    }
+
+    protected void run() {
+        server = new org.eclipse.jetty.server.Server(Integer.parseInt(PORT));
+
+        WebAppContext webappcontext = new WebAppContext();
+        webappcontext.setContextPath("/digestauth");
+        
webappcontext.setBaseResource(Resource.newClassPathResource("/digestauth"));
+
+        HandlerCollection handlers = new HandlerCollection();
+        handlers.setHandlers(new Handler[] {webappcontext, new 
DefaultHandler()});
+
+        server.setHandler(handlers);
+
+        try {
+            configureServer();
+            server.start();
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+    public void tearDown() throws Exception {
+        if (server != null) {
+            server.stop();
+            server.destroy();
+            server = null;
+        }
+    }
+    public static void main(String[] args) {
+        try {
+            DigestServer s = new DigestServer();
+            s.start();
+        } catch (Exception ex) {
+            ex.printStackTrace();
+            System.exit(-1);
+        }
+    }
+
+}
diff --git 
a/rt/transports/http-hc5/src/main/java/org/apache/cxf/transport/http/asyncclient/hc5/AnyAuthScope.java
 
b/systests/transport-hc5/src/test/java/org/apache/cxf/systest/hc5/http/auth/GreeterImpl.java
similarity index 69%
rename from 
rt/transports/http-hc5/src/main/java/org/apache/cxf/transport/http/asyncclient/hc5/AnyAuthScope.java
rename to 
systests/transport-hc5/src/test/java/org/apache/cxf/systest/hc5/http/auth/GreeterImpl.java
index c79815fe70..ff92540a45 100644
--- 
a/rt/transports/http-hc5/src/main/java/org/apache/cxf/transport/http/asyncclient/hc5/AnyAuthScope.java
+++ 
b/systests/transport-hc5/src/test/java/org/apache/cxf/systest/hc5/http/auth/GreeterImpl.java
@@ -16,18 +16,22 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.cxf.systest.hc5.http.auth;
 
-package org.apache.cxf.transport.http.asyncclient.hc5;
+import org.apache.hello_world.Greeter;
+import org.apache.hello_world.messages.PingMeFault;
 
-import org.apache.hc.client5.http.auth.AuthScope;
+public class GreeterImpl implements Greeter {
 
-class AnyAuthScope extends AuthScope {
-    AnyAuthScope() {
-        super(null, null, 1, null, null);
+    public String sayHi() {
+        return "Hi";
     }
 
-    @Override
-    public int match(AuthScope that) {
-        return 1;
+    public void pingMe() throws PingMeFault {
     }
+
+    public String greetMe(String requestType) {
+        return null;
+    }
+
 }
diff --git 
a/systests/transport-hc5/src/test/java/org/apache/cxf/systest/hc5/http/auth/jetty-realm.properties
 
b/systests/transport-hc5/src/test/java/org/apache/cxf/systest/hc5/http/auth/jetty-realm.properties
new file mode 100644
index 0000000000..0d950fbd8f
--- /dev/null
+++ 
b/systests/transport-hc5/src/test/java/org/apache/cxf/systest/hc5/http/auth/jetty-realm.properties
@@ -0,0 +1,2 @@
+foo: bar,ROLE_USER
+
diff --git 
a/systests/transport-hc5/src/test/resources/digestauth/WEB-INF/beans.xml 
b/systests/transport-hc5/src/test/resources/digestauth/WEB-INF/beans.xml
new file mode 100644
index 0000000000..670c00064f
--- /dev/null
+++ b/systests/transport-hc5/src/test/resources/digestauth/WEB-INF/beans.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements. See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership. The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License. You may obtain a copy of the License at
+  
+  http://www.apache.org/licenses/LICENSE-2.0
+  
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied. See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-->
+<beans xmlns="http://www.springframework.org/schema/beans";
+    xmlns:http="http://cxf.apache.org/transports/http/configuration";
+    xmlns:jaxws="http://cxf.apache.org/jaxws";
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
+    xsi:schemaLocation="
+        http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans.xsd
+        http://cxf.apache.org/transports/http/configuration 
http://cxf.apache.org/schemas/configuration/http-conf.xsd
+        http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd
+    ">
+    <import resource="classpath:META-INF/cxf/cxf.xml"/>
+    <import resource="classpath:META-INF/cxf/cxf-servlet.xml"/>
+    <http:destination 
name="{http://apache.org/hello_world}Mortimer.http-destination";>
+        <!-- Nothing to Configure here for Mortimer -->
+    </http:destination>
+    <bean id="greeterImpl" 
class="org.apache.cxf.systest.hc5.http.auth.GreeterImpl" />
+    <jaxws:endpoint address="/greeter" implementor="#greeterImpl" 
publish="true"/>
+</beans>
diff --git 
a/systests/transport-hc5/src/test/resources/digestauth/WEB-INF/web.xml 
b/systests/transport-hc5/src/test/resources/digestauth/WEB-INF/web.xml
new file mode 100644
index 0000000000..5f3e2fe065
--- /dev/null
+++ b/systests/transport-hc5/src/test/resources/digestauth/WEB-INF/web.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!-- Licensed to the Apache Software Foundation (ASF) under one or more 
contributor 
+        license agreements. See the NOTICE file distributed with this work for 
additional 
+        information regarding copyright ownership. The ASF licenses this file 
to 
+        you under the Apache License, Version 2.0 (the "License"); you may not 
use 
+        this file except in compliance with the License. You may obtain a copy 
of 
+        the License at http://www.apache.org/licenses/LICENSE-2.0 Unless 
required 
+        by applicable law or agreed to in writing, software distributed under 
the 
+        License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR 
CONDITIONS 
+        OF ANY KIND, either express or implied. See the License for the 
specific 
+        language governing permissions and limitations under the License. -->
+<web-app xmlns="http://java.sun.com/xml/ns/javaee"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
+    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd";
+    version="3.0">
+    <context-param>
+        <param-name>contextConfigLocation</param-name>
+        <param-value>WEB-INF/beans.xml</param-value>
+    </context-param>
+    <listener>
+        
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
+    </listener>
+    <servlet>
+        <servlet-name>CXFServlet</servlet-name>
+        
<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
+        <load-on-startup>1</load-on-startup>
+    </servlet>
+    <servlet-mapping>
+        <servlet-name>CXFServlet</servlet-name>
+        <url-pattern>/*</url-pattern>
+    </servlet-mapping>
+    <security-constraint>
+        <web-resource-collection>
+            <web-resource-name>CXFServlet</web-resource-name>
+            <url-pattern>/*</url-pattern>
+        </web-resource-collection>
+        <auth-constraint>
+            <role-name>ROLE_USER</role-name>
+        </auth-constraint>
+    </security-constraint>
+    <login-config>
+        <auth-method>DIGEST</auth-method>
+        <realm-name>BookStoreRealm</realm-name>
+    </login-config>
+    <security-role>
+        <role-name>ROLE_USER</role-name>
+    </security-role>
+</web-app>
diff --git a/systests/transport-hc5/src/test/resources/logging.properties 
b/systests/transport-hc5/src/test/resources/logging.properties
new file mode 100644
index 0000000000..b2e5a799c8
--- /dev/null
+++ b/systests/transport-hc5/src/test/resources/logging.properties
@@ -0,0 +1,74 @@
+#
+#
+#    Licensed to the Apache Software Foundation (ASF) under one
+#    or more contributor license agreements. See the NOTICE file
+#    distributed with this work for additional information
+#    regarding copyright ownership. The ASF licenses this file
+#    to you under the Apache License, Version 2.0 (the
+#    "License"); you may not use this file except in compliance
+#    with the License. You may obtain a copy of the License at
+#
+#    http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing,
+#    software distributed under the License is distributed on an
+#    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+#    KIND, either express or implied. See the License for the
+#    specific language governing permissions and limitations
+#    under the License.
+#
+#
+############################################################
+#      Default Logging Configuration File
+#
+# You can use a different file by specifying a filename
+# with the java.util.logging.config.file system property.  
+# For example java -Djava.util.logging.config.file=myfile
+############################################################
+
+############################################################
+#      Global properties
+############################################################
+
+# "handlers" specifies a comma separated list of log Handler 
+# classes.  These handlers will be installed during VM startup.
+# Note that these classes must be on the system classpath.
+# By default we only configure a ConsoleHandler, which will only
+# show messages at the INFO and above levels.
+#handlers= java.util.logging.ConsoleHandler
+
+# To also add the FileHandler, use the following line instead.
+#handlers= java.util.logging.FileHandler, java.util.logging.ConsoleHandler
+
+# Default global logging level.
+# This specifies which kinds of events are logged across
+# all loggers.  For any given facility this global level
+# can be overriden by a facility specific level
+# Note that the ConsoleHandler also has a separate level
+# setting to limit messages printed to the console.
+.level= INFO
+
+############################################################
+# Handler specific properties.
+# Describes specific configuration info for Handlers.
+############################################################
+
+# default file output is in user's home directory.
+java.util.logging.FileHandler.pattern = %h/java%u.log
+java.util.logging.FileHandler.limit = 50000
+java.util.logging.FileHandler.count = 1
+java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatter
+
+# Limit the message that are printed on the console to INFO and above.
+java.util.logging.ConsoleHandler.level = INFO
+java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
+
+
+############################################################
+# Facility specific properties.
+# Provides extra control for each logger.
+############################################################
+
+# For example, set the com.xyz.foo logger to only log SEVERE
+# messages:
+#com.xyz.foo.level = SEVERE
diff --git 
a/systests/transport-hc5/src/test/resources/org/apache/cxf/systest/hc5/http/greeting.wsdl
 
b/systests/transport-hc5/src/test/resources/org/apache/cxf/systest/hc5/http/greeting.wsdl
new file mode 100644
index 0000000000..c12bdfe88a
--- /dev/null
+++ 
b/systests/transport-hc5/src/test/resources/org/apache/cxf/systest/hc5/http/greeting.wsdl
@@ -0,0 +1,166 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements. See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership. The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License. You may obtain a copy of the License at
+ 
+  http://www.apache.org/licenses/LICENSE-2.0
+ 
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied. See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-->
+<wsdl:definitions xmlns="http://schemas.xmlsoap.org/wsdl/"; 
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"; 
xmlns:tns="http://apache.org/hello_world"; 
xmlns:x1="http://apache.org/hello_world/types"; 
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"; 
xmlns:xsd="http://www.w3.org/2001/XMLSchema"; name="HelloWorld" 
targetNamespace="http://apache.org/hello_world";>
+    <wsdl:types>
+        <schema xmlns="http://www.w3.org/2001/XMLSchema"; 
xmlns:tns="http://apache.org/hello_world/types"; 
targetNamespace="http://apache.org/hello_world/types"; 
elementFormDefault="qualified">
+            <simpleType name="MyStringType">
+                <restriction base="string">
+                    <maxLength value="30"/>
+                </restriction>
+            </simpleType>
+            <element name="sayHi">
+                <complexType/>
+            </element>
+            <element name="sayHiResponse">
+                <complexType>
+                    <sequence>
+                        <element name="responseType" type="string"/>
+                    </sequence>
+                </complexType>
+            </element>
+            <element name="greetMe">
+                <complexType>
+                    <sequence>
+                        <element name="requestType" type="tns:MyStringType"/>
+                    </sequence>
+                </complexType>
+            </element>
+            <element name="greetMeResponse">
+                <complexType>
+                    <sequence>
+                        <element name="responseType" type="string"/>
+                    </sequence>
+                </complexType>
+            </element>
+            <element name="pingMe">
+                <complexType/>
+            </element>
+            <element name="pingMeResponse">
+                <complexType/>
+            </element>
+            <element name="faultDetail">
+                <complexType>
+                    <sequence>
+                        <element name="minor" type="short"/>
+                        <element name="major" type="short"/>
+                    </sequence>
+                </complexType>
+            </element>
+        </schema>
+    </wsdl:types>
+    <wsdl:message name="sayHiRequest">
+        <wsdl:part element="x1:sayHi" name="in"/>
+    </wsdl:message>
+    <wsdl:message name="sayHiResponse">
+        <wsdl:part element="x1:sayHiResponse" name="out"/>
+    </wsdl:message>
+    <wsdl:message name="greetMeRequest">
+        <wsdl:part element="x1:greetMe" name="in"/>
+    </wsdl:message>
+    <wsdl:message name="greetMeResponse">
+        <wsdl:part element="x1:greetMeResponse" name="out"/>
+    </wsdl:message>
+    <wsdl:message name="pingMeRequest">
+        <wsdl:part name="in" element="x1:pingMe"/>
+    </wsdl:message>
+    <wsdl:message name="pingMeResponse">
+        <wsdl:part name="out" element="x1:pingMeResponse"/>
+    </wsdl:message>
+    <wsdl:message name="pingMeFault">
+        <wsdl:part name="faultDetail" element="x1:faultDetail"/>
+    </wsdl:message>
+    <wsdl:portType name="Greeter">
+        <wsdl:operation name="sayHi">
+            <wsdl:input message="tns:sayHiRequest" name="sayHiRequest"/>
+            <wsdl:output message="tns:sayHiResponse" name="sayHiResponse"/>
+        </wsdl:operation>
+        <wsdl:operation name="greetMe">
+            <wsdl:input message="tns:greetMeRequest" name="greetMeRequest"/>
+            <wsdl:output message="tns:greetMeResponse" name="greetMeResponse"/>
+        </wsdl:operation>
+        <wsdl:operation name="pingMe">
+            <wsdl:input name="pingMeRequest" message="tns:pingMeRequest"/>
+            <wsdl:output name="pingMeResponse" message="tns:pingMeResponse"/>
+            <wsdl:fault name="pingMeFault" message="tns:pingMeFault"/>
+        </wsdl:operation>
+    </wsdl:portType>
+    <wsdl:binding name="Greeter_SOAPBinding" type="tns:Greeter">
+        <soap:binding style="document" 
transport="http://schemas.xmlsoap.org/soap/http"/>
+        <wsdl:operation name="sayHi">
+            <soap:operation soapAction="" style="document"/>
+            <wsdl:input name="sayHiRequest">
+                <soap:body use="literal"/>
+            </wsdl:input>
+            <wsdl:output name="sayHiResponse">
+                <soap:body use="literal"/>
+            </wsdl:output>
+        </wsdl:operation>
+        <wsdl:operation name="greetMe">
+            <soap:operation soapAction="" style="document"/>
+            <wsdl:input name="greetMeRequest">
+                <soap:body use="literal"/>
+            </wsdl:input>
+            <wsdl:output name="greetMeResponse">
+                <soap:body use="literal"/>
+            </wsdl:output>
+        </wsdl:operation>
+        <wsdl:operation name="pingMe">
+            <soap:operation style="document"/>
+            <wsdl:input>
+                <soap:body use="literal"/>
+            </wsdl:input>
+            <wsdl:output>
+                <soap:body use="literal"/>
+            </wsdl:output>
+            <wsdl:fault name="pingMeFault">
+                <soap:fault name="pingMeFault" use="literal"/>
+            </wsdl:fault>
+        </wsdl:operation>
+    </wsdl:binding>
+    <wsdl:service name="SOAPService">
+        <wsdl:port binding="tns:Greeter_SOAPBinding" name="Mortimer">
+            <soap:address location="http://localhost:9000/Mortimer"/>
+        </wsdl:port>
+        <wsdl:port binding="tns:Greeter_SOAPBinding" name="Tarpin">
+            <soap:address location="https://localhost:9003/Tarpin"/>
+        </wsdl:port>
+        <wsdl:port binding="tns:Greeter_SOAPBinding" name="Rethwel">
+            <soap:address location="http://localhost:9004/Rethwel"/>
+        </wsdl:port>
+        <wsdl:port binding="tns:Greeter_SOAPBinding" name="Gordy">
+            <soap:address location="https://localhost:9001/Gordy"/>
+        </wsdl:port>
+        <wsdl:port binding="tns:Greeter_SOAPBinding" name="Bethal">
+            <soap:address location="https://localhost:9002/Bethal"/>
+        </wsdl:port>
+        <wsdl:port binding="tns:Greeter_SOAPBinding" name="Hurlon">
+            <soap:address location="http://localhost:9006/Hurlon"/>
+        </wsdl:port>
+        <wsdl:port binding="tns:Greeter_SOAPBinding" name="Poltim">
+            <soap:address location="https://localhost:9005/Poltim"/>
+        </wsdl:port>
+        <wsdl:port binding="tns:Greeter_SOAPBinding" name="Abost">
+            <soap:address location="https://localhost:9007/Abost"/>
+        </wsdl:port>
+        <wsdl:port binding="tns:Greeter_SOAPBinding" name="Morpit">
+            <soap:address location="https://localhost:9008/Morpit"/>
+        </wsdl:port>
+    </wsdl:service>
+</wsdl:definitions>


Reply via email to