Skip to main content

connectivity-onpremise

Invoke this skill to enable on-premise connectivity via Cloud Connector. Detects HC_OP_HTTP_PROXY_* environment variables, manual proxy config, or ProxyType=OnPremise. Replaces Neo proxy handling with SAP Cloud SDK automatic connectivity.

Source facts

Repository
SAP-samples/btp-neo-java-app-migration
Last source activity
July 28, 2026 at 14:35
Detected SKILL.md language
English
Stars
6
Forks
0

Install options

The review-first prompt is selected by default. You can switch to a direct command or download a local copy.

Review the source files

Read SKILL.md and any companion files shown by SkillsMP before deciding whether to install.

Showing SKILL.md

SKILL.md
Source instructions · Read-only preview
name
connectivity-onpremise
description
Invoke this skill to enable on-premise connectivity via Cloud Connector. Detects HC_OP_HTTP_PROXY_* environment variables, manual proxy config, or ProxyType=OnPremise. Replaces Neo proxy handling with SAP Cloud SDK automatic connectivity.
disable-model-invocation
false
allowed-tools
Read, Edit, Write, Bash, Grep, Glob
# Connectivity (On-Premise) Enable connectivity to on-premise systems via Cloud Connector. ## Purpose Replace Neo's manual proxy configuration (`HC_OP_HTTP_PROXY_*` environment variables) with SAP Cloud SDK's automatic handling of on-premise connectivity through Cloud Connector. ## Detection This skill applies if any of these patterns are found: ### In Java source files ```java // Manual proxy configuration String proxyHost = System.getenv("HC_OP_HTTP_PROXY_HOST"); String proxyPort = System.getenv("HC_OP_HTTP_PROXY_PORT"); // OnPremise proxy type handling if ("OnPremise".equals(proxyType)) { // Configure proxy... } // Consumer account header urlConnection.setRequestProperty("SAP-Connectivity-ConsumerAccount", accountId); ``` ### In destination configuration ``` ProxyType=OnPremise ``` ## Prerequisites > **Working directory:** This skill must run inside the `-cf-migration` copy of your app, created by `jakarta-java25-migration` or `neo-to-cf-migration-orchestrator`. If your current directory does not end in `-cf-migration`, switch to it before proceeding. Before invoking this skill, ensure you have invoked: 1. **sdk-replacement** - `Use the sdk-replacement skill` - Sets up SAP Cloud SDK - REQUIRED before this skill 2. **destinations** - `Use the destinations skill` - Configures Destination service - REQUIRED before this skill Also required: - Cloud Connector installed and configured ## Transformation Steps ### Step 1: Remove AuthenticationHeaderProvider from web.xml If present, remove the AuthenticationHeaderProvider resource reference: ```xml <resource-ref> <res-ref-name>authenticationHeaderProvider</res-ref-name> <res-type>com.sap.core.connectivity.api.authentication.AuthenticationHeaderProvider</res-type> </resource-ref> ``` > **Note:** The SAP Cloud SDK handles authentication headers automatically for on-premise connections. ### Step 2: Remove Manual Proxy Handling The SAP Cloud SDK handles all proxy configuration automatically when `ProxyType=OnPremise` is detected in the destination. **Before (Neo) - REMOVE ALL THIS CODE:** ```java private Proxy getProxy(String proxyType) { Proxy proxy = Proxy.NO_PROXY; String proxyHost = null; String proxyPort = null; if (ON_PREMISE_PROXY.equals(proxyType)) { // Get proxy for on-premise destinations proxyHost = System.getenv("HC_OP_HTTP_PROXY_HOST"); proxyPort = System.getenv("HC_OP_HTTP_PROXY_PORT"); } else { proxyHost = System.getProperty("https.proxyHost"); proxyPort = System.getProperty("https.proxyPort"); } if (proxyPort != null && proxyHost != null) { int proxyPortNumber = Integer.parseInt(proxyPort); proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyHost, proxyPortNumber)); } return proxy; } private void injectHeader(HttpURLConnection urlConnection, String proxyType) { if (ON_PREMISE_PROXY.equals(proxyType)) { urlConnection.setRequestProperty("SAP-Connectivity-ConsumerAccount", tenantContext.getTenant().getAccount().getId()); } } ``` **After (Cloud Foundry) - Simple and automatic:** ```java import com.sap.cloud.sdk.cloudplatform.connectivity.DestinationAccessor; import com.sap.cloud.sdk.cloudplatform.connectivity.HttpDestination; import org.apache.http.client.HttpClient; import static com.sap.cloud.sdk.cloudplatform.connectivity.HttpClientAccessor.getHttpClient; public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String destinationName = request.getParameter("destname"); if (destinationName == null) { destinationName = "on-premise-destination"; } try { // SAP Cloud SDK handles all proxy configuration automatically! HttpDestination destination = DestinationAccessor.getDestination(destinationName).asHttp(); // Get HTTP client - SDK automatically: // - Configures proxy for on-premise destinations // - Adds required headers (SAP-Connectivity-ConsumerAccount, etc.) // - Handles Cloud Connector integration HttpClient httpClient = getHttpClient(destination); HttpGet httpGet = new HttpGet(destination.getUri()); HttpResponse destinationResponse = httpClient.execute(httpGet); int statusCode = destinationResponse.getStatusLine().getStatusCode(); if (statusCode != HttpServletResponse.SC_OK) { response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Destination returned: " + statusCode); return; } destinationResponse.getEntity().writeTo(response.getOutputStream()); } catch (Exception e) { throw new ServletException("Connectivity failed: " + e.getMessage(), e); } } ``` ### Step 2: Remove Resource References Remove from `web.xml`: ```xml <!-- REMOVE --> <resource-ref> <res-ref-name>connectivityConfiguration</res-ref-name> <res-type>com.sap.core.connectivity.api.configuration.ConnectivityConfiguration</res-type> </resource-ref> <!-- REMOVE if present --> <resource-ref> <res-ref-name>TenantContext</res-ref-name> <res-type>com.sap.cloud.account.TenantContext</res-type> </resource-ref> ``` ### Step 3: Update MTA Descriptor Add both destination and connectivity services to `mtad.yaml`: ```yaml modules: - name: ${app-name} type: java.tomcat path: target/<artifactId>.war parameters: buildpack: sap_java_buildpack_jakarta disk-quota: 1024M memory: 1024M properties: ENABLE_SECURITY_JAVA_API_V2: true SET_LOGGING_LEVEL: 'ROOT: INFO' requires: - name: ${app-name}-destination - name: ${app-name}-connectivity resources: - name: ${app-name}-destination type: org.cloudfoundry.managed-service parameters: service: destination service-plan: lite - name: ${app-name}-connectivity type: org.cloudfoundry.managed-service parameters: service: connectivity service-plan: lite ``` ### Step 4: Configure Cloud Connector In Cloud Connector Administration: 1. **Add Subaccount** - Region: Your CF region - Subaccount: Your subaccount ID - Display Name: Descriptive name 2. **Add Virtual Host Mapping** - Click "Cloud to On-Premise" - Add new mapping: - **Back-end Type:** Non-SAP System / HTTP - **Protocol:** HTTP or HTTPS - **Internal Host:** `your-onprem-server.local` - **Internal Port:** `8080` - **Virtual Host:** `onprem-virtual` - **Virtual Port:** `8080` 3. **Add Resources** - Path: `/` (or specific paths) - Access Policy: Allow ### Step 5: Create On-Premise Destination In BTP Cockpit, create destination: | Property | Value | |----------|-------| | Name | `on-premise-destination` | | Type | HTTP | | URL | `http://onprem-virtual:8080` | | Proxy Type | **OnPremise** | | Authentication | NoAuthentication (or as needed) | | Location ID | (Optional) Cloud Connector location ID | For destinations with Location ID: ```json { "Name": "on-premise-destination", "Type": "HTTP", "URL": "http://onprem-virtual:8080", "ProxyType": "OnPremise", "Authentication": "NoAuthentication", "CloudConnectorLocationId": "my-location-id" } ``` ### Step 6: Check Proxy Type Programmatically (if needed) ```java import com.sap.cloud.sdk.cloudplatform.connectivity.ProxyType; HttpDestination destination = DestinationAccessor.getDestination(name).asHttp(); // Check if on-premise if (destination.getProxyType() == ProxyType.ON_PREMISE) { // On-premise handling (SDK handles proxy automatically) logger.info("Using on-premise connectivity"); } ``` ## Configuration Files No new configuration files in the application. Cloud Connector and destinations are configured externally. ## CF Services | Service | Plan | Purpose | |---------|------|---------| | `destination` | lite | Destination configuration | | `connectivity` | lite | On-premise connectivity proxy | ## Verification ### 1. Compile Check ```bash mvn clean compile ``` ### 2. Verify Cloud Connector Connection In Cloud Connector Administration: - Check connection status (should show "Connected") - Verify virtual host mappings ### 3. Test On-Premise Connectivity ```bash # Deploy application cf deploy . -f # Test on-premise destination curl "https://${app-url}/connectivity?destname=on-premise-destination" ``` ### 4. Check Logs for Connectivity ```bash cf logs ${app-name} --recent | grep -i "connectivity\|proxy" ``` ## Common Issues ### Issue: Connection refused **Cause:** Cloud Connector not connected or misconfigured. **Solution:** 1. Check Cloud Connector status 2. Verify virtual host mapping 3. Check Location ID in destination matches Cloud Connector ### Issue: 403 Forbidden on on-premise resource **Cause:** Cloud Connector resource access policy. **Solution:** Add the path to allowed resources in Cloud Connector. ### Issue: Timeout connecting to on-premise **Cause:** Network issue or Cloud Connector firewall. **Solution:** 1. Verify on-premise server is reachable from Cloud Connector host 2. Check firewall rules 3. Increase timeout in destination if needed ### Issue: "No connectivity service bound" **Cause:** Connectivity service not bound to application. **Solution:** Verify `${app-name}-connectivity` is in requires section of mtad.yaml. ## Architecture Overview ``` ┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐ │ CF Application │────▶│ Connectivity │────▶│ Cloud Connector │ │ (Your App) │ │ Service Proxy │ │ (On-Premise) │ └─────────────────┘ └──────────────────┘ └────────┬────────┘ │ ▼ ┌─────────────────┐ │ On-Premise │ │ Backend System │ └─────────────────┘ ``` The SAP Cloud SDK automatically: 1. Detects that the destination has `ProxyType=OnPremise` 2. Routes the request through the connectivity service proxy 3. Adds required headers (`SAP-Connectivity-ConsumerAccount`) 4. Cloud Connector forwards to the actual on-premise system ## Next Steps After completing this skill, proceed to: - [../mail-destinations/SKILL.md](../mail-destinations/SKILL.md) - For on-premise mail server configuration
View on GitHub