diff --git a/proxies/live/apiproxy/policies/javascript.CacheRequestHost.xml b/proxies/live/apiproxy/policies/javascript.CacheRequestHost.xml
new file mode 100644
index 0000000..0dc41a5
--- /dev/null
+++ b/proxies/live/apiproxy/policies/javascript.CacheRequestHost.xml
@@ -0,0 +1,6 @@
+
+
+ javascript.CacheRequestHost
+
+ jsc://CacheRequestHost.js
+
diff --git a/proxies/live/apiproxy/policies/javascript.RewriteHostName.xml b/proxies/live/apiproxy/policies/javascript.RewriteHostName.xml
new file mode 100644
index 0000000..6db930d
--- /dev/null
+++ b/proxies/live/apiproxy/policies/javascript.RewriteHostName.xml
@@ -0,0 +1,6 @@
+
+
+ javascript.RewriteHostName
+
+ jsc://RewriteHostName.js
+
diff --git a/proxies/live/apiproxy/proxies/default.xml b/proxies/live/apiproxy/proxies/default.xml
index 1e1aa0e..d1ab2fa 100644
--- a/proxies/live/apiproxy/proxies/default.xml
+++ b/proxies/live/apiproxy/proxies/default.xml
@@ -41,7 +41,16 @@
-
+
+
+
+ AssignMessage.SetApimGuids
+
+
+ javascript.CacheRequestHost
+
+
+
diff --git a/proxies/live/apiproxy/resources/jsc/CacheRequestHost.js b/proxies/live/apiproxy/resources/jsc/CacheRequestHost.js
new file mode 100644
index 0000000..cc430d7
--- /dev/null
+++ b/proxies/live/apiproxy/resources/jsc/CacheRequestHost.js
@@ -0,0 +1,4 @@
+const env_regex = /^([a-zA-Z\-]+)(?=(\.api\.service\.nhs\.uk))/gm;
+var hostname_env = request.headers.host;
+hostname_env = hostname_env.match(env_regex, request.headers.host)[0];
+context.setVariable("request_hostname_env", hostname_env);
diff --git a/proxies/live/apiproxy/resources/jsc/RewriteHostName.js b/proxies/live/apiproxy/resources/jsc/RewriteHostName.js
new file mode 100644
index 0000000..edb0459
--- /dev/null
+++ b/proxies/live/apiproxy/resources/jsc/RewriteHostName.js
@@ -0,0 +1,19 @@
+var response = context.getVariable("response.content");
+var json = JSON.parse(response);
+
+if (json.place) {
+ // Loop over each item in the search result array, re-writing the hostname to that of the initial request
+ json.place.forEach(value => {
+ var request_hostname = context.getVariable("request_hostname_env");
+ // Annoyingly, Apigee's version of JS doesn't support regex look-behinds,
+ // so we grab the env string including https:// prefix
+ var hostname_regex = /(^https:\/\/([a-zA-Z\-]+\.)+)nhs\.uk/gm;
+ var rewritten_url = value.url.replace(hostname_regex, "https://" + request_hostname + ".api.service.nhs.uk");
+ value.url = rewritten_url;
+ value.url = value.url.replace("api-version=1", "api-version=2");
+ value.url = value.url.replace("service-search", "service-search-api");
+ });
+
+ // Update the response payload with the corrected urls
+ context.setVariable("message.content", JSON.stringify(json));
+}
diff --git a/proxies/live/apiproxy/targets/target.xml b/proxies/live/apiproxy/targets/target.xml
index a6b3463..7522541 100644
--- a/proxies/live/apiproxy/targets/target.xml
+++ b/proxies/live/apiproxy/targets/target.xml
@@ -15,6 +15,14 @@
+
+
+
+
+ javascript.RewriteHostName
+
+
+
diff --git a/proxies/sandbox/apiproxy/policies/javascript.CacheRequestHost.xml b/proxies/sandbox/apiproxy/policies/javascript.CacheRequestHost.xml
new file mode 100644
index 0000000..0dc41a5
--- /dev/null
+++ b/proxies/sandbox/apiproxy/policies/javascript.CacheRequestHost.xml
@@ -0,0 +1,6 @@
+
+
+ javascript.CacheRequestHost
+
+ jsc://CacheRequestHost.js
+
diff --git a/proxies/sandbox/apiproxy/policies/javascript.RewriteHostName.xml b/proxies/sandbox/apiproxy/policies/javascript.RewriteHostName.xml
new file mode 100644
index 0000000..6db930d
--- /dev/null
+++ b/proxies/sandbox/apiproxy/policies/javascript.RewriteHostName.xml
@@ -0,0 +1,6 @@
+
+
+ javascript.RewriteHostName
+
+ jsc://RewriteHostName.js
+
diff --git a/proxies/sandbox/apiproxy/proxies/default.xml b/proxies/sandbox/apiproxy/proxies/default.xml
index 0924853..d9dad36 100644
--- a/proxies/sandbox/apiproxy/proxies/default.xml
+++ b/proxies/sandbox/apiproxy/proxies/default.xml
@@ -39,7 +39,16 @@
-
+
+
+
+ AssignMessage.SetApimGuids
+
+
+ javascript.CacheRequestHost
+
+
+
diff --git a/proxies/sandbox/apiproxy/resources/jsc/CacheRequestHost.js b/proxies/sandbox/apiproxy/resources/jsc/CacheRequestHost.js
new file mode 100644
index 0000000..cc430d7
--- /dev/null
+++ b/proxies/sandbox/apiproxy/resources/jsc/CacheRequestHost.js
@@ -0,0 +1,4 @@
+const env_regex = /^([a-zA-Z\-]+)(?=(\.api\.service\.nhs\.uk))/gm;
+var hostname_env = request.headers.host;
+hostname_env = hostname_env.match(env_regex, request.headers.host)[0];
+context.setVariable("request_hostname_env", hostname_env);
diff --git a/proxies/sandbox/apiproxy/resources/jsc/RewriteHostName.js b/proxies/sandbox/apiproxy/resources/jsc/RewriteHostName.js
new file mode 100644
index 0000000..edb0459
--- /dev/null
+++ b/proxies/sandbox/apiproxy/resources/jsc/RewriteHostName.js
@@ -0,0 +1,19 @@
+var response = context.getVariable("response.content");
+var json = JSON.parse(response);
+
+if (json.place) {
+ // Loop over each item in the search result array, re-writing the hostname to that of the initial request
+ json.place.forEach(value => {
+ var request_hostname = context.getVariable("request_hostname_env");
+ // Annoyingly, Apigee's version of JS doesn't support regex look-behinds,
+ // so we grab the env string including https:// prefix
+ var hostname_regex = /(^https:\/\/([a-zA-Z\-]+\.)+)nhs\.uk/gm;
+ var rewritten_url = value.url.replace(hostname_regex, "https://" + request_hostname + ".api.service.nhs.uk");
+ value.url = rewritten_url;
+ value.url = value.url.replace("api-version=1", "api-version=2");
+ value.url = value.url.replace("service-search", "service-search-api");
+ });
+
+ // Update the response payload with the corrected urls
+ context.setVariable("message.content", JSON.stringify(json));
+}
diff --git a/proxies/sandbox/apiproxy/targets/sandbox.xml b/proxies/sandbox/apiproxy/targets/sandbox.xml
index 22be523..74caad5 100644
--- a/proxies/sandbox/apiproxy/targets/sandbox.xml
+++ b/proxies/sandbox/apiproxy/targets/sandbox.xml
@@ -14,6 +14,14 @@
+
+
+
+
+ javascript.RewriteHostName
+
+
+
AssignMessage.AddCors
diff --git a/specification/examples/search-place_v2.json b/specification/examples/search-place_v2.json
index 3d61153..aade346 100644
--- a/specification/examples/search-place_v2.json
+++ b/specification/examples/search-place_v2.json
@@ -4,13 +4,13 @@
"Latitude": 53.478941671902611,
"Longitude": -2.245277998298477,
"text": "Manchester, North West",
- "url": "https://api.nhs.uk/service-search/search-postcode-or-place?api-version=1&search=manchester&latitude=53.4789416719026&longitude=-2.24527799829848"
+ "url": "https://int.api.service.nhs.uk/service-search/search-postcode-or-place?api-version=1&search=manchester&latitude=53.4789416719026&longitude=-2.24527799829848"
},
{
"Latitude": 53.514265448236706,
"Longitude": -2.4199003923191209,
"text": "New Manchester, North West",
- "url": "https://api.nhs.uk/service-search/search-postcode-or-place?api-version=1&search=manchester&latitude=53.5142654482367&longitude=-2.41990039231912"
+ "url": "https://int.api.service.nhs.uk/service-search/search-postcode-or-place?api-version=1&search=manchester&latitude=53.5142654482367&longitude=-2.41990039231912"
}
]
-}
\ No newline at end of file
+}
diff --git a/tests/test_search_postcode.py b/tests/test_search_postcode.py
index a252c36..52c4886 100644
--- a/tests/test_search_postcode.py
+++ b/tests/test_search_postcode.py
@@ -151,7 +151,6 @@ def test_invalid_api_version(self, get_api_key):
assert_that(response.status_code).is_equal_to(expected_status_code)
assert_that(response.json()).is_equal_to(expected_body)
- @pytest.mark.skip
@pytest.mark.integration
def test_response_payload_urls_are_corrected(self, get_api_key):
"""
@@ -172,11 +171,11 @@ def test_response_payload_urls_are_corrected(self, get_api_key):
json={},
)
- results = response.json()["place"]
+ results = response.json()['place']
for item in results:
- url_response = requests.get(
- url=item["url"],
- params={"apikey": api_key},
+ url_response = requests.post(
+ url=item['url'],
headers=make_headers(api_key),
+ json={},
)
assert_that(url_response.status_code).is_equal_to(expected_status_code)