Show
Environment:
3scale 2.9 installed on OpenShift 4.6 using the 3scale operator v0.6.1.
3scale installed with a single tenant
To reproduce:
In 3scale admin portal for the tenant, add CORS policy to API Product. Promote to staging and production APIcast.
Navigate to Product:API -> ActiveDocs
Test GET Endpoint
Expected response:
{
"method" : "GET" ,
"path" : "/" ,
"args" : "user_key=afd59d201ea15ac4caf757bbe9dd6a45" ,
"body" : "",
"headers" : {
"HTTP_VERSION" : "HTTP/1.1" ,
"HTTP_HOST" : "echo-api.3scale.net" ,
"HTTP_ACCEPT" : "application/json" ,
"HTTP_ACCEPT_ENCODING" : "gzip, deflate, br" ,
"HTTP_ACCEPT_LANGUAGE" : "en,en-US;q=0.5" ,
"HTTP_DNT" : "1" ,
"HTTP_ORIGIN" : "https: //user1-3scale-admin.apps.cluster-7bd8.7bd8.sandbox464.opentlc.com" ,
"HTTP_REFERER" : "https: //user1-3scale-admin.apps.cluster-7bd8.7bd8.sandbox464.opentlc.com/" ,
"HTTP_USER_AGENT" : "Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:84.0) Gecko/20100101 Firefox/84.0" ,
"HTTP_X_3SCALE_PROXY_SECRET_TOKEN" : "Shared_secret_sent_from_proxy_to_API_backend_d89486900bbaaeef" ,
"HTTP_X_REAL_IP" : "10.128.2.9" ,
"HTTP_X_FORWARDED_FOR" : "178.119.47.150, 52.49.73.94, 10.0.101.168" ,
"HTTP_X_FORWARDED_HOST" : "echo-api.3scale.net" ,
"HTTP_X_FORWARDED_PORT" : "443" ,
"HTTP_X_FORWARDED_PROTO" : "https" ,
"HTTP_FORWARDED" : " for =10.0.101.168;host=echo-api.3scale.net;proto=https"
},
"uuid" : "66bac8ae-e8f0-403c-93c3-a56c1fbe7eb0"
}
See screenshots 3scale1-1.png and 3scale2.png
Deploy the 'quay.io/gpte3scale/echo-api:latest' image on the OpenShift. The only difference between this image and the hosted endpoint at https://echo-api.3scale.net/ is that this image returns "requestmethod": "GET" instead of "method": "GET" .
To deploy the image:
oc new -project echo
oc new -app --name=echo --docker-image=quay.io/gpte3scale/echo-api:latest -n echo
Change the private base URL of the API Backend to point to the the echo app on OpenShift. Set the URL to http://echo.echo.svc:9292 . Promote to staging and production APIcast.
Repeat the ActiveDocs test.
Response:
{
"requestmethod" : "GET" ,
"path" : "/" ,
"args" : "user_key=afd59d201ea15ac4caf757bbe9dd6a45" ,
"body" : "",
"headers" : {
"HTTP_VERSION" : "HTTP/1.1" ,
"HTTP_X_REAL_IP" : "10.128.2.9" ,
"HTTP_HOST" : "echo.echo.svc:9292" ,
"HTTP_X_3SCALE_PROXY_SECRET_TOKEN" : "Shared_secret_sent_from_proxy_to_API_backend_d89486900bbaaeef" ,
"HTTP_USER_AGENT" : "Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:84.0) Gecko/20100101 Firefox/84.0" ,
"HTTP_ACCEPT" : "application/json" ,
"HTTP_ACCEPT_LANGUAGE" : "en,en-US;q=0.5" ,
"HTTP_ACCEPT_ENCODING" : "gzip, deflate, br" ,
"HTTP_REFERER" : "https: //user1-3scale-admin.apps.cluster-7bd8.7bd8.sandbox464.opentlc.com/" ,
"HTTP_ORIGIN" : "https: //user1-3scale-admin.apps.cluster-7bd8.7bd8.sandbox464.opentlc.com" ,
"HTTP_DNT" : "1" ,
"HTTP_X_FORWARDED_HOST" : "api-user1-3scale-apicast-production.apps.cluster-7bd8.7bd8.sandbox464.opentlc.com" ,
"HTTP_X_FORWARDED_PORT" : "443" ,
"HTTP_X_FORWARDED_PROTO" : "https" ,
"HTTP_FORWARDED" : " for =178.119.47.150;host=api-user1-3scale-apicast-production.apps.cluster-7bd8.7bd8.sandbox464.opentlc.com;proto=https" ,
"HTTP_X_FORWARDED_FOR" : "178.119.47.150"
},
"uuid" : "de799155-cef2-4a2a-8a0b-711752050f36" ,
"servers" : [
{
"url" : "https: //api-user1-3scale-apicast-production.apps.cluster-7bd8.7bd8.sandbox464.opentlc.com:443"
}
]
}
Note the additional servers element added to the end of the response body.
See screenshots 3scale3.png and 3scale4.png
Note the following error in the browser console:
TypeError: can't convert undefined to object
injectAutocompleteToResponseBody OAS3Autocomplete.js:3
_callee$/< OAS3Autocomplete.js:87
promise callback*_callee$ OAS3Autocomplete.js:87
Babel 8
responseInterceptor service_active_docs.js:1
_callee$ index.js:884
Babel 15
makeHttp index.js:1202
execute index.js:4791
Le swagger-ui.js:1335
G swagger-ui.js:243
bindActionCreator Redux
s swagger-ui.js:5058
r swagger-ui.js:13702
B swagger-ui.js:13887
De swagger-ui.js:1361
G swagger-ui.js:243
bindActionCreator Redux
y swagger-ui.js:5441
r swagger-ui.js:13702
B swagger-ui.js:13887
t swagger-ui.js:16747
React 14
See screenshot 3scale5.png
Note the following code in OAS3Autocomplete.js:87 :
// response.body.method is not present when fetching the spec,
// is present when doing a request to one of the paths
const isSpecFetched = (response: SwaggerResponse): boolean => !!response.body.method
This seems to indicate that a field method is expected in response.body