Rename the existing http header in envoy - api-gateway

I want to rename the exiting header in envoy configuration but I cant find any related document expect Access header values by name from header modification options where has no response. Is there any solution for this requirement in envoy?

There isn't any built in filter to achieve this requirement, but it is possible with the lua http filter.
name: envoy.lua
typed_config:
"#type": type.googleapis.com/envoy.config.filter.http.lua.v2.Lua
inline_code: |
function envoy_on_request(request_handle)
local originalHeader = request_handle:headers():get("A")
if originalHeader then
-- Use 'replace' instead of 'add' to overwrite any existing value of the target header
request_handle:headers():replace("B", originalHeader)
request_handle:headers():remove("A")
end
end

Related

JMETER: Need to send all entries in a CSV file to HTTP request body in 'one' request

I'm trying to solve a test data issue in Jmeter. Can anyone of you have a look at below problem statement and advise here please ?
Requirement: Need to send all entries in a CSV file to HTTP request body in 'one' request to the end point.
Example CSV File:
"adsfas123wsf00000wqefqwe52145t10000",
"fdfrgvergq120947r0000dwsfqwaef237sadf",
"wfrqwef7865034r78tkahsefjh6985r7asfdaf",
"qefqwe52145t10000adsfas123wsf00000w",
"wsfqwaef237sadffdfrgvergq120947r0000d"
HTTP Request Body:
["${data}"}]
When the data is substituted, I should be able to get below output.
[
"adsfas123wsf00000wqefqwe52145t10000",
"fdfrgvergq120947r0000dwsfqwaef237sadf",
"wfrqwef7865034r78tkahsefjh6985r7asfdaf",
"qefqwe52145t10000adsfas123wsf00000w",
"wsfqwaef237sadffdfrgvergq120947r0000d"
]
Problem Statement: When I use CSV data set config. file, I'm unable to concatenate all entries into one single request body. My understanding is, CSV data set config. the file is not the right option here.
Did some search in StackOverflow and followed a method to achieve above using JSR223 PreProcessor' and the link is, How to send multiple json body using jmeter?.
Followed the above link and tried added below custom code provided.
def builder = new StringBuilder()
new File('/path/to/plans.csv').readLines().each { line ->
builder.append(new File(line).text).append(System.getProperty('line.separator'))
}
sampler.getArguments().removeAllArguments()
sampler.addNonEncodedArgument('', builder.toString(), '')
sampler.setPostBodyRaw(true)
Upon running, I get below error message,
Caused by: java.io.FileNotFoundException,
"adsfas123wsf00000wqefqwe52145t10000",
"fdfrgvergq120947r0000dwsfqwaef237sadf",
"wfrqwef7865034r78tkahsefjh6985r7asfdaf",
"qefqwe52145t10000adsfas123wsf00000w",
"wsfqwaef237sadffdfrgvergq120947r0000d" (The filename, directory name, or volume label syntax is incorrect)
If the file is not found, then how come the entries are read and displayed in the log viewer?
Also, how do I link the output of custom code to the request body? Or is it taken care of by the custom code itself?
You have an error in your code, change this line:
builder.append(new File(line).text).append(System.getProperty('line.separator'))
to this one:
builder.append(line).append(System.getProperty('line.separator'))
If you want to send the full contents of the file you don't even need to go for scripting, you can use __FileToString() function right in the "Body data" tab of the HTTP Request sampler:
${__FileToString(/path/to/plans.csv,,)}
And last but not the least if you need to generate JSON from the plain text it might be a better idea to go for JsonBuilder class, see Apache Groovy - Why and How You Should Use It and Apache Groovy - Parsing and producing JSON
Two steps:
Add a User Parameter Pre-processor before the HTTP request:
Name: DATA
User_1: ${__FileToString(/path/to/plans.csv,,)}
Add the following to request body:
${DATA}

How do I filter csv email attachments via RouteonAttributes by attachment name?

I want to filter csv email attachments I extract from gmail via ConsumeIMAP by their file name. I am having trouble with what syntax to use when I am configuring RouteonAttributes processor.
I was able to extract the csv file from gmail by configuring RouteonAttributes to
fetchcsv | ${filename:contains('.csv')}
but when I try to specify the filename
"${filename:contains('Threat_-_SQL_Injection_-_Rule*')}"
it always routes to unmatched. The file name is Threat_-_SQL_Injection_-_Rule-2019-06-29. The date following "Rule-" will be constantly changing as well depending on the date it was sent. I would also need to write a route to property name for the file "Threat_-_Vulnerability_Scanner_-_Rule-2019-06-28". Any help with the configuration would be appreciated.
You can use startsWith instead of contains as -
${filename:startsWith('Threat_-_SQL_Injection_-_Rule')}
This will match for any file that starts with "Threat_-_SQL_Injection_-_Rule" string. This means, date part on your file can vary.You can refer to Apache Nifi Expression Language guide for more details
A simpler solution would be to use
"${filename:contains('Threat_-_SQL_Injection_-_Rule*')}"
like you did earlier but drop the "*"
"${filename:contains('Threat_-_SQL_Injection_-_Rule')}"

How to make header manager as dynamic in Jmeter

In my case my header manager value needs to be changed according to the user logged in how to achieve this.
If you have a list of users and corresponding header values in a CSV file - you can use CSV Data Set Config to read the values from file into JMeter Variables and use the variables in the HTTP Header Manager. Header names and values don't have to be dynamic, you can put a variable or a function reference there.
Also be aware of Scoping Rules when designing your Test Plan

Jmeter: Parameterize the headers in "HTTP header manager" using "CSV data set config"

Jmeter: I tried to Parameterize the headers(pass about 5 dynamic headers) in "HTTP header manager" using "CSV data set config". But i could not, can anybody help me??
Just use the CSV data setup variables in the HTTP header manager.
Can you be more specific on where you're stuck?
YouTube tutorial on using CSV data with JMeter:
http://www.youtube.com/watch?v=aEJNc3TW-g8
Blog that explains exactly what to do:
http://community.blazemeter.com/knowledgebase/articles/65138-using-csv-data-set-config
If you need to add 5 dynamic headers one by one, i.e. one header per request just change the value on each consecutive request - it's pretty easy doable, just place your CSV Data Set Config as a child of required request, the same for HTTP Header Manager.
If you need to add all 5 headers before any testing starts - you'll need to consider do it in a separate thread group or use combination of Loop Controller with Once Only Controller
If none above is applicable to your test scenario try updating it and provide as much information as you can.

How can access the headers of an incoming request in tritium?

I would like to be able to add some logic to my tritium project based on the incoming request header. Is it possible to access the header information and then perform match() with() logic?
My plan is to take an existing URL (that can be accessed via a normal GET request) and give it a second mode of functionality so that it can be turned into an AJAX API. When the JavaScript makes the API request, I could set a custom header flag so that the platform knows to interpret the request differently.
You should be able to access headers in the incoming HTTP request using the global variable syntax. For example, to access the site's hostname:
$host
# => yourwebsite.com
I believe that most of the standard headers are accessible as global variables in Tritium. However, I'm not sure if all headers are accessible as global vars.
Inside your project folder, on your development machine, there should be a tmp folder that contains the HTTP request/response bundles. Each bundle should be time stamped with the request's date and time. I think if you peek inside one of these folders, you should see a bunch of files:
incoming_request
incoming_response
outgoing_request
outgoing_response
And possibly a fifth file. I can't remember if this is still the case in the current version of the platform, but there's a chance you'll find a fifth file containing the global variables that the Tritium server creates to store HTTP request header values. So you can peek inside that file (if it exists) and find out what variable name your HTTP headers are using.
Hope that helps!
I'm late on this one, but I figured I would lend a hand to anyone else who needs help on this one.
you need to create two files in your scripts directory, one called
request_main.ts
and
response_main.ts
You can then use things such as the parse_headers function, which iterates through the request/ response headers, depending on the file which you put the code in.
parse_headers() { # iterate over all the incoming/outgoing headers
log(name()) # log the name of the current cookie in the iteration
log(value()) # log the value of the current cookie in the iteration
}
parse_headers(/Set-Cookie/) { # iterate over the Set-Cookie headers only.
log(this())
}
This will log all of your header names, to make modifications, you can then use "setter" functions, which you can read about here:
http://developer.moovweb.com/docs/local/configuration/headers
Good luck.

Resources