|  | [//]: # " 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. |