| [//]: # " Copyright (c) 2015, 2020 Oracle and/or its affiliates. All rights reserved. " | 
 | [//]: # " " | 
 | [//]: # " This program and the accompanying materials are made available under the " | 
 | [//]: # " terms of the Eclipse Distribution License v. 1.0, which is available at " | 
 | [//]: # " http://www.eclipse.org/org/documents/edl-v10.php. " | 
 | [//]: # " " | 
 | [//]: # " SPDX-License-Identifier: BSD-3-Clause " | 
 |  | 
 | Managed Client Example | 
 | ====================== | 
 |  | 
 | This example demonstrates a simple usage of Jersey Managed Client | 
 | feature. | 
 |  | 
 | Contents | 
 | -------- | 
 |  | 
 | The mapping of the URI path space is presented in the following table: | 
 |  | 
 | URI path            | Resource class     | HTTP methods | 
 | ------------------- | ------------------ | -------------- | 
 | **_/public/a_**     | PublicResource     | GET | 
 | **_/public/b_**     | PublicResource     | GET | 
 | **_/internal/a_**   | InternalResource   | GET | 
 | **_/internal/b_**   | InternalResource   | GET | 
 |  | 
 | In the example, the requests to a *public resource* deployed on | 
 | `/public/` path are forwarded to an *internal resource* (deployed on | 
 | `/internal/` path) using injected | 
 | [jakarta.ws.rs.client.WebTarget](https://jax-rs-spec.java.net/nonav/2.0/apidocs/jakarta.ws.rs/client/WebTarget.html) | 
 | instances produced using 2 separate managed clients each of the managed | 
 | clients using it's own custom configuration. | 
 |  | 
 | An access to internal resource methods is guarded by a container request | 
 | filter (`CustomHeaderFilter`) which rejects any request that does not | 
 | contain expected custom header set to an expected value. In the example, | 
 | the 2 managed clients (used by a public resource to access the methods | 
 | on the internal resource) are configured with custom configurations, | 
 | each containing a registration of a custom client request filter that is | 
 | instructed to append a required custom header and value to every | 
 | outgoing request. Only with managed client support working properly, the | 
 | public resource is able to successfully retrieve data from the internal | 
 | resource. | 
 |  | 
 | Running the Example | 
 | ------------------- | 
 |  | 
 | Run the example as follows: | 
 |  | 
 | >     mvn clean package jetty:run | 
 |  | 
 | This deploys current example on the local host. You can then access WADL | 
 | description of the deployed application at | 
 | <http://localhost:8080/managed-client-webapp/application.wadl>. | 
 |  | 
 | You can access public resource of this application using curl: | 
 |  | 
 | >     curl -v -H "Accept: text/plain" http://localhost:8080/managed-client-webapp/public/a | 
 |  | 
 | >     curl -v -H "Accept: text/plain" http://localhost:8080/managed-client-webapp/public/b | 
 |  | 
 | In this example you should see the returned response message body | 
 | contains "a" or "b" respectively upon successful invocation. | 
 |  | 
 | You may also verify that access to internal resource is not possible | 
 | without including a proper header in the request. First try to access | 
 | the internal resource without any custom header: | 
 |  | 
 | >     curl -v -H "Accept: text/plain" http://localhost:8080/managed-client-webapp/internal/a | 
 |  | 
 | >     curl -v -H "Accept: text/plain" http://localhost:8080/managed-client-webapp/internal/b | 
 |  | 
 | In both cases a `HTTP 403 Forbidden.` response is returned. Now lets try | 
 | to access the resource once again, but this time we'll include also the | 
 | expected custom headers: | 
 |  | 
 | >     curl -v -H "Accept: text/plain" -H "custom-header:a" http://localhost:8080/managed-client-webapp/internal/a | 
 |  | 
 | >     curl -v -H "Accept: text/plain" -H "custom-header:b" http://localhost:8080/managed-client-webapp/internal/b | 
 |  | 
 | Finally, you should see the invocation succeeded and the returned response message body contains "a" or "b" respectively. |