Last active
April 25, 2023 17:21
-
-
Save asoorm/4dd9f4361ad92d2f7201141fc09cbcb1 to your computer and use it in GitHub Desktop.
Tyk Gateway JSVM middleware to inspect the Content-Type Header, and if matches, transform it to something else.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"id": "5b6973533f03d3608d46cf8c", | |
"name": "httpbin", | |
"slug": "httpbin", | |
"api_id": "e69126ef8100421c4c81b9982b51eb80", | |
"org_id": "5b296ceb3f03d310fffc9b9d", | |
"use_keyless": true, | |
"use_oauth2": false, | |
"use_openid": false, | |
"openid_options": { | |
"providers": [], | |
"segregate_by_client": false | |
}, | |
"oauth_meta": { | |
"allowed_access_types": [], | |
"allowed_authorize_types": [], | |
"auth_login_redirect": "" | |
}, | |
"auth": { | |
"use_param": false, | |
"param_name": "", | |
"use_cookie": false, | |
"cookie_name": "", | |
"auth_header_name": "", | |
"use_certificate": false | |
}, | |
"use_basic_auth": false, | |
"use_mutual_tls_auth": false, | |
"client_certificates": [], | |
"upstream_certificates": {}, | |
"pinned_public_keys": {}, | |
"enable_jwt": false, | |
"use_standard_auth": false, | |
"enable_coprocess_auth": false, | |
"jwt_signing_method": "", | |
"jwt_source": "", | |
"jwt_identity_base_field": "", | |
"jwt_client_base_field": "", | |
"jwt_policy_field_name": "", | |
"jwt_disable_issued_at_validation": false, | |
"jwt_disable_expires_at_validation": false, | |
"jwt_disable_not_before_validation": false, | |
"notifications": { | |
"shared_secret": "", | |
"oauth_on_keychange_url": "" | |
}, | |
"enable_signature_checking": false, | |
"hmac_allowed_clock_skew": -1, | |
"base_identity_provided_by": "", | |
"definition": { | |
"location": "header", | |
"key": "x-api-version", | |
"strip_path": false | |
}, | |
"version_data": { | |
"not_versioned": true, | |
"default_version": "", | |
"versions": { | |
"Default": { | |
"name": "Default", | |
"expires": "", | |
"paths": { | |
"ignored": [], | |
"white_list": [], | |
"black_list": [] | |
}, | |
"use_extended_paths": true, | |
"extended_paths": {}, | |
"global_headers": {}, | |
"global_headers_remove": [], | |
"global_size_limit": 0, | |
"override_target": "" | |
} | |
} | |
}, | |
"uptime_tests": { | |
"check_list": [], | |
"config": { | |
"expire_utime_after": 0, | |
"service_discovery": { | |
"use_discovery_service": false, | |
"query_endpoint": "", | |
"use_nested_query": false, | |
"parent_data_path": "", | |
"data_path": "", | |
"port_data_path": "", | |
"target_path": "", | |
"use_target_list": false, | |
"cache_timeout": 60, | |
"endpoint_returns_list": false | |
}, | |
"recheck_wait": 0 | |
} | |
}, | |
"proxy": { | |
"preserve_host_header": false, | |
"listen_path": "/httpbin/", | |
"target_url": "http://httpbin.org/", | |
"strip_listen_path": true, | |
"enable_load_balancing": false, | |
"target_list": [], | |
"check_host_against_uptime_tests": false, | |
"service_discovery": { | |
"use_discovery_service": false, | |
"query_endpoint": "", | |
"use_nested_query": false, | |
"parent_data_path": "", | |
"data_path": "", | |
"port_data_path": "", | |
"target_path": "", | |
"use_target_list": false, | |
"cache_timeout": 0, | |
"endpoint_returns_list": false | |
}, | |
"transport": { | |
"ssl_ciphers": [], | |
"ssl_min_version": 0, | |
"proxy_url": "" | |
} | |
}, | |
"disable_rate_limit": false, | |
"disable_quota": false, | |
"custom_middleware": { | |
"pre": [ | |
{ | |
"name": "preTransformContentType", | |
"path": "middleware/preTransformContentType.js", | |
"require_session": false | |
} | |
], | |
"post": [], | |
"post_key_auth": [], | |
"auth_check": { | |
"name": "", | |
"path": "", | |
"require_session": false | |
}, | |
"response": [], | |
"driver": "", | |
"id_extractor": { | |
"extract_from": "", | |
"extract_with": "", | |
"extractor_config": {} | |
} | |
}, | |
"custom_middleware_bundle": "", | |
"cache_options": { | |
"cache_timeout": 60, | |
"enable_cache": true, | |
"cache_all_safe_requests": false, | |
"cache_response_codes": [], | |
"enable_upstream_cache_control": false, | |
"cache_control_ttl_header": "" | |
}, | |
"session_lifetime": 0, | |
"active": true, | |
"auth_provider": { | |
"name": "", | |
"storage_engine": "", | |
"meta": {} | |
}, | |
"session_provider": { | |
"name": "", | |
"storage_engine": "", | |
"meta": {} | |
}, | |
"event_handlers": { | |
"events": {} | |
}, | |
"enable_batch_request_support": false, | |
"enable_ip_whitelisting": false, | |
"allowed_ips": [], | |
"enable_ip_blacklisting": false, | |
"blacklisted_ips": [], | |
"dont_set_quota_on_create": false, | |
"expire_analytics_after": 0, | |
"response_processors": [], | |
"CORS": { | |
"enable": false, | |
"allowed_origins": [], | |
"allowed_methods": [], | |
"allowed_headers": [], | |
"exposed_headers": [], | |
"allow_credentials": false, | |
"max_age": 24, | |
"options_passthrough": false, | |
"debug": false | |
}, | |
"domain": "", | |
"do_not_track": false, | |
"tags": [], | |
"enable_context_vars": false, | |
"config_data": {}, | |
"tag_headers": [], | |
"global_rate_limit": { | |
"rate": 0, | |
"per": 0 | |
}, | |
"strip_auth_data": false | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var preTransformContentType = new TykJS.TykMiddleware.NewMiddleware({}); | |
preTransformContentType.NewProcessRequest(function(request, session) { | |
log("Running sample PRE PROCESSOR preTransformContentType middleware"); | |
if (request.Headers["Content-Type"] === undefined) { | |
log("no content-type set"); | |
return preTransformContentType.ReturnData(request, {}); | |
} | |
log("Content-Type: " + request.Headers["Content-Type"][0]); | |
switch (request.Headers["Content-Type"][0]) { | |
case "application/vnd.aaa.xxx+json": | |
request.SetHeaders["Content-Type"] = "application/vnd.bbb.xxx+json"; | |
break; | |
case "application/vnd.aaa.yyy+json": | |
request.SetHeaders["Content-Type"] = "application/vnd.bbb.yyy+json"; | |
break; | |
default: | |
log("no need to transform headers as no match"); | |
} | |
return preTransformContentType.ReturnData(request, {}); | |
}); | |
log("Sample PRE middleware initialised"); |
Example sending normal curl with no Content-Type header
$ curl http://gateway.ahmet:8080/httpbin/get
{
"args": {},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip",
"Connection": "close",
"Host": "httpbin.org",
"User-Agent": "curl/7.54.0"
},
"origin": "127.0.0.1, 5.70.19.189",
"url": "http://httpbin.org/get"
}
Example sending curl with non-matching Content-Type header
$ curl -H 'Content-Type: application/json' http://gateway.ahmet:8080/httpbin/get
{
"args": {},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip",
"Connection": "close",
"Content-Type": "application/json",
"Host": "httpbin.org",
"User-Agent": "curl/7.54.0"
},
"origin": "127.0.0.1, 5.70.19.189",
"url": "http://httpbin.org/get"
}
Example sending curl with Content-Type: application/vnd.aaa.xxx+json
$ curl -H 'Content-Type: application/vnd.aaa.xxx+json' http://gateway.ahmet:8080/httpbin/get
{
"args": {},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip",
"Connection": "close",
"Content-Type": "application/vnd.bbb.xxx+json",
"Host": "httpbin.org",
"User-Agent": "curl/7.54.0"
},
"origin": "127.0.0.1, 5.70.19.189",
"url": "http://httpbin.org/get"
}
Example sending curl with Content-Type: application/vnd.aaa.yyy+json
$ curl -H 'Content-Type: application/vnd.aaa.yyy+json' http://gateway.ahmet:8080/httpbin/get
{
"args": {},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip",
"Connection": "close",
"Content-Type": "application/vnd.bbb.yyy+json",
"Host": "httpbin.org",
"User-Agent": "curl/7.54.0"
},
"origin": "127.0.0.1, 5.70.19.189",
"url": "http://httpbin.org/get"
}
Works like a charm
To make this work with tyk gateway 4.3.3 (community edition) it is necessary to set the driver too. I.e:
...
"custom_middleware": {
"pre": [
{
"name": "preTransformContentType",
"path": "middleware/preTransformContentType.js",
}
],
"driver": "otto"
},
...
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
To get this working
enable_jsvm: true
in the tyk.confmiddleware/preTransformContentType.js
custom_middleware.pre
array in the raw API definition via dashboard.