Re: Need to execute javascript using JMeter
Abhitosh Patil <[email protected]> Fri, 4 Apr 2025 00:45:09 +0530
| Newsgroups | gmane.comp.jakarta.jmeter.user |
|---|---|
| Message-ID | <CAC-b7DQk0csVRpwrmfv=xz0KGpWgZTPUMchFP-y88TKaxn5CrQ@mail.gmail.com> |
--0000000000002910760631e49790
Content-Type: multipart/alternative; boundary="0000000000002910750631e4978f"
--0000000000002910750631e4978f
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
Hi Chriss,
Hi executed below Groovy code with JSR223 sampler and got an error for that=
.
*Code:*
import javax.crypto.Mac
import javax.crypto.spec.SecretKeySpec
import java.util.Base64
// Retrieve environment variables (using System.getenv as an example)
def key =3D System.getenv("d552a1b3-3558-3c47-b34a-1ba87558b74b") ?:
"defaultKey"
def secret =3D System.getenv("vz7noe5z17i2usV58oFR5YMtU1BUFL0Ah9+eXuwV6IQ=
=3D")
?: "am1ldGVy"
def ts =3D System.currentTimeMillis()
def baseString =3D "${key}-2-${ts}"
// Decode the secret from Base64
def secretDecoded =3D Base64.decoder.decode(secret)
// Generate HMAC-SHA256 hash
Mac mac =3D Mac.getInstance("HmacSHA256")
mac.init(new SecretKeySpec(secretDecoded, "HmacSHA256"))
byte[] macSignature =3D mac.doFinal(baseString.getBytes("UTF-8"))
// Encode the signature to Base64 and sanitize it
def macSignatureBase64 =3D Base64.encoder.encodeToString(macSignature)
.replace("=3D", "")import javax.crypto.Mac
import javax.crypto.spec.SecretKeySpec
import java.util.Base64
// Retrieve environment variables (using System.getenv as an example)
def key =3D System.getenv("appKey") ?: "defaultKey"
def secret =3D System.getenv("appSecret") ?: "am1ldGVy"
def ts =3D System.currentTimeMillis()
def baseString =3D "${key}-2-${ts}"
// Decode the secret from Base64
def secretDecoded =3D Base64.decoder.decode(secret)
// Generate HMAC-SHA256 hash
Mac mac =3D Mac.getInstance("HmacSHA256")
mac.init(new SecretKeySpec(secretDecoded, "HmacSHA256"))
byte[] macSignature =3D mac.doFinal(baseString.getBytes("UTF-8"))
// Encode the signature to Base64 and sanitize it
def macSignatureBase64 =3D Base64.encoder.encodeToString(macSignature)
.replace("=3D", "")
.replace("+", "-")
.replace("/", "_")
// Simulated environment variable storage (Postman equivalent)
def environment =3D [:] // A map to mimic Postman environment variables
environment["signature"] =3D macSignatureBase64
environment["timestamp"] =3D ts
// put the result in jmeter vars
vars.put("signature",macSignatureBase64)
vars.put("timestamp","" + ts)
// Debug output
println "Signature: ${macSignatureBase64}"
println "Timestamp: ${ts}"
*Getting this error:*
[image: image.png]
On Thu, Apr 3, 2025 at 11:30=E2=80=AFPM Christof Schmalenbach <
[email protected]> wrote:
> I see that my last mail was not well formatted; here another trial...
>
> import javax.crypto.Mac
> import javax.crypto.spec.SecretKeySpec
> import java.util.Base64
>
> // Retrieve environment variables (using System.getenv as an example)
> def key =3D System.getenv("appKey") ?: "defaultKey"
> def secret =3D System.getenv("appSecret") ?: "am1ldGVy"
>
> def ts =3D System.currentTimeMillis()
> def baseString =3D "${key}-2-${ts}"
>
> // Decode the secret from Base64
> def secretDecoded =3D Base64.decoder.decode(secret)
>
> // Generate HMAC-SHA256 hash
> Mac mac =3D Mac.getInstance("HmacSHA256")
> mac.init(new SecretKeySpec(secretDecoded, "HmacSHA256"))
> byte[] macSignature =3D mac.doFinal(baseString.getBytes("UTF-8"))
>
> // Encode the signature to Base64 and sanitize it
> def macSignatureBase64 =3D Base64.encoder.encodeToString(macSignature)
> .replace("=3D", "")import javax.crypto.Mac
> import javax.crypto.spec.SecretKeySpec
> import java.util.Base64
>
> // Retrieve environment variables (using System.getenv as an example)
> def key =3D System.getenv("appKey") ?: "defaultKey"
> def secret =3D System.getenv("appSecret") ?: "am1ldGVy"
>
> def ts =3D System.currentTimeMillis()
> def baseString =3D "${key}-2-${ts}"
>
> // Decode the secret from Base64
> def secretDecoded =3D Base64.decoder.decode(secret)
>
> // Generate HMAC-SHA256 hash
> Mac mac =3D Mac.getInstance("HmacSHA256")
> mac.init(new SecretKeySpec(secretDecoded, "HmacSHA256"))
> byte[] macSignature =3D mac.doFinal(baseString.getBytes("UTF-8"))
>
> // Encode the signature to Base64 and sanitize it
> def macSignatureBase64 =3D Base64.encoder.encodeToString(macSignature)
> .replace("=3D", "")
> .replace("+", "-")
> .replace("/", "_")
>
> // Simulated environment variable storage (Postman equivalent)
> def environment =3D [:] // A map to mimic Postman environment variables
> environment["signature"] =3D macSignatureBase64
> environment["timestamp"] =3D ts
>
> // put the result in jmeter vars
> vars.put("signature",macSignatureBase64)
> vars.put("timestamp","" + ts)
>
> // Debug output
> println "Signature: ${macSignatureBase64}"
> println "Timestamp: ${ts}"
>
> .replace("+", "-")
> .replace("/", "_")
>
> // Simulated environment variable storage (Postman equivalent)
> def environment =3D [:] // A map to mimic Postman environment variables
> environment["signature"] =3D macSignatureBase64
> environment["timestamp"] =3D ts
>
> // put the result in jmeter vars
> vars.put("signature",macSignatureBase64)
> vars.put("timestamp","" + ts)
>
> // Debug output
> println "Signature: ${macSignatureBase64}"
> println "Timestamp: ${ts}"
>
>
> On 4/3/25 19:49, Christof Schmalenbach wrote:
> > Hi Abhitosh,
> > I'm not sure, whether I understand your js code completely.
> > But I got at least an idea. This is the result of my code migration.
> > I test the code in a jmeter script within a jsr223 sampler and it seems
> > to work.
> > (OpenJDK version 19.X; may be that in java version 8.X not all packages
> > used are supported???)
> >
> > regards
> > Christof
> >
> > import javax.crypto.Mac import javax.crypto.spec.SecretKeySpec import
> > java.util.Base64 // Retrieve environment variables (using System.getenv
> > as an example) def key =3D System.getenv("appKey") ?: "defaultKey" def
> > secret =3D System.getenv("appSecret") ?: "am1ldGVy" def ts =3D
> > System.currentTimeMillis() def baseString =3D "${key}-2-${ts}" // Decod=
e
> > the secret from Base64 def secretDecoded =3D Base64.decoder.decode(secr=
et)
> > // Generate HMAC-SHA256 hash Mac mac =3D Mac.getInstance("HmacSHA256")
> > mac.init(new SecretKeySpec(secretDecoded, "HmacSHA256")) byte[]
> > macSignature =3D mac.doFinal(baseString.getBytes("UTF-8")) // Encode th=
e
> > signature to Base64 and sanitize it def macSignatureBase64 =3D
> > Base64.encoder.encodeToString(macSignature) .replace("=3D", "")
> > .replace("+", "-") .replace("/", "_") // Simulated environment variable
> > storage (Postman equivalent) def environment =3D [:] // A map to mimic
> > Postman environment variables environment["signature"] =3D
> > macSignatureBase64 environment["timestamp"] =3D ts // Debug output prin=
tln
> > "Signature: ${macSignatureBase64}" println "Timestamp: ${ts}"
> >
> >
> >
> > On 4/3/25 16:32, Abhitosh Patil wrote:
> >> Javascript:
> >>
> >> var key =3D pm.environment.get('appKey);
> >>
> >> var secret =3D pm.environment.get('appSecret);
> >>
> >> var ts =3D (new Date()).getTime());
> >> var baseString =3D key + "-" + "2" + "-" + ts;
> >>
> >> var words =3D CryptoJS. enc.Base64.parse(secret);
> >>
> >> vaz macSignature =3D CryptoJS. HmacSHA256 (CryptoJS. enc. Utf8.parse
> >> (baseString), words);
> >>
> >> var macSignatureBase64 =3D macSignature.toString (CryptoJS. enc.Base64=
);
> >>
> >> macSignatureBase64 =3D macSignatureBase64.replace(/=3D/g, "");
> >>
> >> mac SignatureBase64 =3D macSignatureBase64.replace(/\+/g, "-");
> >>
> >> macSignatureBase64 =3D macSignatureBase64.replace(/\//g, "_");
> >>
> >> postman.setEnvironmentVariable("signature", macSignatureBase64);
> >>
> >> postman, setEnvironmentVariable("timestamp", ts);
> >>
> >> On Thu, 3 Apr, 2025, 5:12 pm Christof,<[email protected]>
> >> wrote:
> >>
> >>> Hi Abhitosh,
> >>> is the javascript script small in size?
> >>> If so you could remove or replace with dummies all hardcoded security
> >>> related parts and attach the script in this channel.
> >>> May be , that someone will take the challenge and migrate it to
> >>> groovy .
> >>> It it is 100 lines or more I will not have the time to do that.
> >>> Otherwise
> >>> I will give it a chance.
> >>>
> >>> Christof
> >>>
> >>>
> >>>
> >>> Am 3. April 2025 09:02:36 UTC schrieb Abhitosh Patil <
> >>> [email protected]>:
> >>>> Unfortunately ChatGPT or other AI tools are not allowed in our
> >>> organisation
> >>>> network.
> >>>>
> >>>> On Wed, 2 Apr, 2025, 9:04 pm Abhitosh Patil,<[email protected]>
> >>> wrote:
> >>>>> Thank you Chris.
> >>>>> I'll check this possibility.
> >>>>>
> >>>>> On Wed, 2 Apr, 2025, 9:03 pm
> >>>>> Christof,<[email protected]>
> >>>>> wrote:
> >>>>>
> >>>>>> Hi Abhitosh,
> >>>>>> groovy is one of the supported languages in jsr223 sampler. If you=
r
> >>>>>> javascript has not thousand codelines, I'm very optimistic, that
> >>>>>> with
> >>> the
> >>>>>> help of chatGPT you should be able to migrate your code
> >>>>>> from js -> groovy.
> >>>>>> regards
> >>>>>> Christof
> >>>>>>
> >>>>>>
> >>>>>> Am 2. April 2025 14:49:15 UTC schrieb Abhitosh Patil <
> >>>>>> [email protected]>:
> >>>>>>> Initially I was using Java 17 but later switched to java 8
> >>>>>>> Currently getting error like "javax.script.scriptExecution:
> >>>>>>> reference
> >>>>>>> error: pm is not defined.
> >>>>>>>
> >>>>>>> Rhino or Graalvm are not available on our company download portal=
.
> >>>>>>>
> >>>>>>> I don't know anything about Groovy.
> >>>>>>>
> >>>>>>> On Wed, 2 Apr, 2025, 8:10 pm Dmitri T,<[email protected]> wrote:
> >>>>>>>
> >>>>>>>> 1.
> >>>>>>>> You answered your own question: JavaScript code cannot be run in
> >>>>>> JMeter.
> >>>>>>>>
> >>>>>>>> 1.
> >>>>>>>> Also, if you're on Java 15+ you won't be able able to choose
> >>>>>> JavaScript
> >>>>>>>> in JSR223 test elements because it has been removed from JDK<
> >>>>>>>> https://openjdk.org/jeps/372>
> >>>>>>>> 2.
> >>>>>>>> There could be inconsistencies between Postman JavaScript API an=
d
> >>>>>> JMeter
> >>>>>>>> so you won't have access to pm. namespace in JMeter
> >>>>>>>>
> >>>>>>>>
> >>>>>>>> So you either need to restore JavaScript engine by adding Mozill=
a
> >>>>>> Rhino<
> >>>>>>>> https://github.com/mozilla/rhino> or switching to GraalVM<
> >>>>>>>> https://www.graalvm.org/> or re-write your code in Groovy. The
> >>> latter
> >>>>>>>> option is better from performance perspective as Groovy scripts
> >>>>>>>> can
> >>> be
> >>>>>>>> compiled and cached and it matters especially for "heavy" tasks
> >>>>>>>> like
> >>>>>>>> cryptography. More information: Apache Groovy: What Is Groovy Us=
ed
> >>>>>> For?<
> >>>>>>>> https://www.blazemeter.com/blog/apache-groovy>
> >>>>>>>>
> >>>>>>>>
> >>>>>>>>
> >>>>>>>> ________________________________
> >>>>>>>> From: Abhitosh Patil<[email protected]>
> >>>>>>>> Sent: Wednesday, April 2, 2025 5:14 PM
> >>>>>>>> To: JMeter Users List<[email protected]>
> >>>>>>>> Subject: Need to execute javascript using JMeter
> >>>>>>>>
> >>>>>>>> We have a requirement to generate unique authentication
> >>>>>>>> signature to
> >>>>>> pass
> >>>>>>>> as a header in API request. We have a pre-request javascript for
> >>> same
> >>>>>> in
> >>>>>>>> postman tool.
> >>>>>>>>
> >>>>>>>> Same javascript we tried in JMeter using jsr223 and beanshell
> >>>>>> elements. But
> >>>>>>>> it's not working. Any solution for this?
> >>>>>>>>
> >
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [email protected]
> For additional commands, e-mail: [email protected]
>
>
--0000000000002910750631e4978f
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr">Hi Chriss,<div>Hi executed below Groovy code with JSR223 s=
ampler and got an error for that.</div><div><br></div><div><b>Code:</b></di=
v><div><span style=3D"background-color:rgb(0,0,255)">import javax.crypto.Ma=
c<br>import javax.crypto.spec.SecretKeySpec<br>import java.util.Base64<br><=
br>// Retrieve environment variables (using System.getenv as an example)<br=
>def key =3D System.getenv("d552a1b3-3558-3c47-b34a-1ba87558b74b"=
) ?: "defaultKey"<br>def secret =3D System.getenv("vz7noe5z1=
7i2usV58oFR5YMtU1BUFL0Ah9+eXuwV6IQ=3D") ?: "am1ldGVy"<br>def=
ts =3D System.currentTimeMillis()<br>def baseString =3D "${key}-2-${t=
s}"<br><br>// Decode the secret from Base64<br>def secretDecoded =3D B=
ase64.decoder.decode(secret)<br><br>// Generate HMAC-SHA256 hash<br>Mac mac=
=3D Mac.getInstance("HmacSHA256")<br>mac.init(new SecretKeySpec(=
secretDecoded, "HmacSHA256"))<br>byte[] macSignature =3D mac.doFi=
nal(baseString.getBytes("UTF-8"))<br><br>// Encode the signature =
to Base64 and sanitize it<br>def macSignatureBase64 =3D Base64.encoder.enco=
deToString(macSignature)<br>=C2=A0 =C2=A0 =C2=A0.replace("=3D", &=
quot;")import javax.crypto.Mac<br>import javax.crypto.spec.SecretKeySp=
ec<br>import java.util.Base64<br><br>// Retrieve environment variables (usi=
ng System.getenv as an example)<br>def key =3D System.getenv("appKey&q=
uot;) ?: "defaultKey"<br>def secret =3D System.getenv("appSe=
cret") ?: "am1ldGVy"<br><br>def ts =3D System.currentTimeMil=
lis()<br>def baseString =3D "${key}-2-${ts}"<br><br>// Decode the=
secret from Base64<br>def secretDecoded =3D Base64.decoder.decode(secret)<=
br><br>// Generate HMAC-SHA256 hash<br>Mac mac =3D Mac.getInstance("Hm=
acSHA256")<br>mac.init(new SecretKeySpec(secretDecoded, "HmacSHA2=
56"))<br>byte[] macSignature =3D mac.doFinal(baseString.getBytes("=
;UTF-8"))<br><br>// Encode the signature to Base64 and sanitize it<br>=
def macSignatureBase64 =3D Base64.encoder.encodeToString(macSignature)<br>=
=C2=A0 =C2=A0 =C2=A0.replace("=3D", "")<br>=C2=A0 =C2=
=A0 =C2=A0.replace("+", "-")<br>=C2=A0 =C2=A0 =C2=A0.re=
place("/", "_")<br><br>// Simulated environment variabl=
e storage (Postman equivalent)<br>def environment =3D [:] // A map to mimic=
Postman environment variables<br>environment["signature"] =3D ma=
cSignatureBase64<br>environment["timestamp"] =3D ts<br><br>// put=
the result in jmeter vars<br>vars.put("signature",macSignatureBa=
se64)<br>vars.put("timestamp","" + ts)<br><br>// Debug =
output<br>println "Signature: ${macSignatureBase64}"<br>println &=
quot;Timestamp: ${ts}"</span></div><div><span style=3D"background-colo=
r:rgb(0,0,255)"><br></span></div><div><b>Getting this error:</b></div><div>=
<img src=3D"cid:ii_m91qiamb0" alt=3D"image.png" width=3D"472" height=3D"64"=
><br></div></div><br><div class=3D"gmail_quote gmail_quote_container"><div =
dir=3D"ltr" class=3D"gmail_attr">On Thu, Apr 3, 2025 at 11:30=E2=80=AFPM Ch=
ristof Schmalenbach <<a href=3D"mailto:[email protected]">c=
[email protected]</a>> wrote:<br></div><blockquote class=3D"=
gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(20=
4,204,204);padding-left:1ex">I see that my last mail was not well formatted=
; here another trial...<br>
<br>
import javax.crypto.Mac<br>
import javax.crypto.spec.SecretKeySpec<br>
import java.util.Base64<br>
<br>
// Retrieve environment variables (using System.getenv as an example)<br>
def key =3D System.getenv("appKey") ?: "defaultKey"<br>
def secret =3D System.getenv("appSecret") ?: "am1ldGVy"=
<br>
<br>
def ts =3D System.currentTimeMillis()<br>
def baseString =3D "${key}-2-${ts}"<br>
<br>
// Decode the secret from Base64<br>
def secretDecoded =3D Base64.decoder.decode(secret)<br>
<br>
// Generate HMAC-SHA256 hash<br>
Mac mac =3D Mac.getInstance("HmacSHA256")<br>
mac.init(new SecretKeySpec(secretDecoded, "HmacSHA256"))<br>
byte[] macSignature =3D mac.doFinal(baseString.getBytes("UTF-8"))=
<br>
<br>
// Encode the signature to Base64 and sanitize it<br>
def macSignatureBase64 =3D Base64.encoder.encodeToString(macSignature)<br>
=C2=A0=C2=A0=C2=A0=C2=A0 .replace("=3D", "")import java=
x.crypto.Mac<br>
import javax.crypto.spec.SecretKeySpec<br>
import java.util.Base64<br>
<br>
// Retrieve environment variables (using System.getenv as an example)<br>
def key =3D System.getenv("appKey") ?: "defaultKey"<br>
def secret =3D System.getenv("appSecret") ?: "am1ldGVy"=
<br>
<br>
def ts =3D System.currentTimeMillis()<br>
def baseString =3D "${key}-2-${ts}"<br>
<br>
// Decode the secret from Base64<br>
def secretDecoded =3D Base64.decoder.decode(secret)<br>
<br>
// Generate HMAC-SHA256 hash<br>
Mac mac =3D Mac.getInstance("HmacSHA256")<br>
mac.init(new SecretKeySpec(secretDecoded, "HmacSHA256"))<br>
byte[] macSignature =3D mac.doFinal(baseString.getBytes("UTF-8"))=
<br>
<br>
// Encode the signature to Base64 and sanitize it<br>
def macSignatureBase64 =3D Base64.encoder.encodeToString(macSignature)<br>
=C2=A0=C2=A0=C2=A0=C2=A0 .replace("=3D", "")<br>
=C2=A0=C2=A0=C2=A0=C2=A0 .replace("+", "-")<br>
=C2=A0=C2=A0=C2=A0=C2=A0 .replace("/", "_")<br>
<br>
// Simulated environment variable storage (Postman equivalent)<br>
def environment =3D [:] // A map to mimic Postman environment variables<br>
environment["signature"] =3D macSignatureBase64<br>
environment["timestamp"] =3D ts<br>
<br>
// put the result in jmeter vars<br>
vars.put("signature",macSignatureBase64)<br>
vars.put("timestamp","" + ts)<br>
<br>
// Debug output<br>
println "Signature: ${macSignatureBase64}"<br>
println "Timestamp: ${ts}"<br>
<br>
=C2=A0=C2=A0=C2=A0=C2=A0 .replace("+", "-")<br>
=C2=A0=C2=A0=C2=A0=C2=A0 .replace("/", "_")<br>
<br>
// Simulated environment variable storage (Postman equivalent)<br>
def environment =3D [:] // A map to mimic Postman environment variables<br>
environment["signature"] =3D macSignatureBase64<br>
environment["timestamp"] =3D ts<br>
<br>
// put the result in jmeter vars<br>
vars.put("signature",macSignatureBase64)<br>
vars.put("timestamp","" + ts)<br>
<br>
// Debug output<br>
println "Signature: ${macSignatureBase64}"<br>
println "Timestamp: ${ts}"<br>
<br>
<br>
On 4/3/25 19:49, Christof Schmalenbach wrote:<br>
> Hi Abhitosh,<br>
> I'm not sure, whether I understand your js code completely.<br>
> But I got at least an idea. This is the result of my code migration.<b=
r>
> I test the code in a jmeter script within a jsr223 sampler and it seem=
s<br>
> to work.<br>
> (OpenJDK version 19.X; may be that in java version 8.X not all package=
s<br>
> used are supported???)<br>
><br>
> regards<br>
> Christof<br>
><br>
> import javax.crypto.Mac import javax.crypto.spec.SecretKeySpec import<=
br>
> java.util.Base64 // Retrieve environment variables (using System.geten=
v<br>
> as an example) def key =3D System.getenv("appKey") ?: "=
defaultKey" def<br>
> secret =3D System.getenv("appSecret") ?: "am1ldGVy"=
; def ts =3D<br>
> System.currentTimeMillis() def baseString =3D "${key}-2-${ts}&quo=
t; // Decode<br>
> the secret from Base64 def secretDecoded =3D Base64.decoder.decode(sec=
ret)<br>
> // Generate HMAC-SHA256 hash Mac mac =3D Mac.getInstance("HmacSHA=
256")<br>
> mac.init(new SecretKeySpec(secretDecoded, "HmacSHA256")) byt=
e[]<br>
> macSignature =3D mac.doFinal(baseString.getBytes("UTF-8")) /=
/ Encode the<br>
> signature to Base64 and sanitize it def macSignatureBase64 =3D<br>
> Base64.encoder.encodeToString(macSignature) .replace("=3D", =
"")<br>
> .replace("+", "-") .replace("/", "_=
") // Simulated environment variable<br>
> storage (Postman equivalent) def environment =3D [:] // A map to mimic=
<br>
> Postman environment variables environment["signature"] =3D<b=
r>
> macSignatureBase64 environment["timestamp"] =3D ts // Debug =
output println<br>
> "Signature: ${macSignatureBase64}" println "Timestamp: =
${ts}"<br>
><br>
><br>
><br>
> On 4/3/25 16:32, Abhitosh Patil wrote:<br>
>> Javascript:<br>
>><br>
>> var key =3D pm.environment.get('appKey);<br>
>><br>
>> var secret =3D pm.environment.get('appSecret);<br>
>><br>
>> var ts =3D (new Date()).getTime());<br>
>> var baseString =3D key + "-" + "2" + "-&q=
uot; + ts;<br>
>><br>
>> var words =3D CryptoJS. enc.Base64.parse(secret);<br>
>><br>
>> vaz macSignature =3D CryptoJS. HmacSHA256 (CryptoJS. enc. Utf8.par=
se<br>
>> (baseString), words);<br>
>><br>
>> var macSignatureBase64 =3D macSignature.toString (CryptoJS. enc.Ba=
se64);<br>
>><br>
>> macSignatureBase64 =3D macSignatureBase64.replace(/=3D/g, "&q=
uot;);<br>
>><br>
>> mac SignatureBase64 =3D macSignatureBase64.replace(/\+/g, "-&=
quot;);<br>
>><br>
>> macSignatureBase64 =3D macSignatureBase64.replace(/\//g, "_&q=
uot;);<br>
>><br>
>> postman.setEnvironmentVariable("signature", macSignature=
Base64);<br>
>><br>
>> postman, setEnvironmentVariable("timestamp", ts);<br>
>><br>
>> On Thu, 3 Apr, 2025, 5:12 pm Christof,<<a href=3D"mailto:c.schm=
[email protected]" target=3D"_blank">[email protected]<=
/a>><br>
>> wrote:<br>
>><br>
>>> Hi Abhitosh,<br>
>>> is the javascript script small in size?<br>
>>> If so you could remove or replace with dummies all hardcoded s=
ecurity<br>
>>> related parts and attach the script in this channel.<br>
>>> May be , that someone will take the challenge and migrate it t=
o<br>
>>> groovy .<br>
>>> It it is 100 lines or more I will not have the time to do that=
.<br>
>>> Otherwise<br>
>>> I will give it a chance.<br>
>>><br>
>>> Christof<br>
>>><br>
>>><br>
>>><br>
>>> Am 3. April 2025 09:02:36 UTC schrieb Abhitosh Patil <<br>
>>> <a href=3D"mailto:[email protected]" target=3D"_blank">abh=
[email protected]</a>>:<br>
>>>> Unfortunately ChatGPT or other AI tools are not allowed in=
our<br>
>>> organisation<br>
>>>> network.<br>
>>>><br>
>>>> On Wed, 2 Apr, 2025, 9:04 pm Abhitosh Patil,<<a href=3D=
"mailto:[email protected]" target=3D"_blank">[email protected]</a>&=
gt;<br>
>>> wrote:<br>
>>>>> Thank you Chris.<br>
>>>>> I'll check this possibility.<br>
>>>>><br>
>>>>> On Wed, 2 Apr, 2025, 9:03 pm<br>
>>>>> Christof,<<a href=3D"mailto:c.schmalenbach@perfomat=
ics.com" target=3D"_blank">[email protected]</a>><br>
>>>>> wrote:<br>
>>>>><br>
>>>>>> Hi Abhitosh,<br>
>>>>>> groovy is one of the supported languages in jsr223=
sampler. If your<br>
>>>>>> javascript has not thousand codelines, I'm ver=
y optimistic, that<br>
>>>>>> with<br>
>>> the<br>
>>>>>> help of chatGPT you should be able to migrate your=
code<br>
>>>>>> from js -> groovy.<br>
>>>>>> regards<br>
>>>>>> Christof<br>
>>>>>><br>
>>>>>><br>
>>>>>> Am 2. April 2025 14:49:15 UTC schrieb Abhitosh Pat=
il <<br>
>>>>>> <a href=3D"mailto:[email protected]" target=3D=
"_blank">[email protected]</a>>:<br>
>>>>>>> Initially I was using Java 17 but later switch=
ed to java 8<br>
>>>>>>> Currently getting error like "javax.scrip=
t.scriptExecution:<br>
>>>>>>> reference<br>
>>>>>>> error: pm is not defined.<br>
>>>>>>><br>
>>>>>>> Rhino or Graalvm are not available on our comp=
any download portal.<br>
>>>>>>><br>
>>>>>>> I don't know anything about Groovy.<br>
>>>>>>><br>
>>>>>>> On Wed, 2 Apr, 2025, 8:10 pm Dmitri T,<<a h=
ref=3D"mailto:[email protected]" target=3D"_blank">[email protected]</a>>=
=C2=A0 wrote:<br>
>>>>>>><br>
>>>>>>>> =C2=A0=C2=A0 1.<br>
>>>>>>>> You answered your own question: JavaScript=
code cannot be run in<br>
>>>>>> JMeter.<br>
>>>>>>>><br>
>>>>>>>> =C2=A0=C2=A0 1.<br>
>>>>>>>> Also, if you're=C2=A0 on Java 15+ you =
won't be able able to choose<br>
>>>>>> JavaScript<br>
>>>>>>>> in JSR223 test elements because it has bee=
n removed from JDK<<br>
>>>>>>>> <a href=3D"https://openjdk.org/jeps/372" r=
el=3D"noreferrer" target=3D"_blank">https://openjdk.org/jeps/372</a>><br=
>
>>>>>>>> =C2=A0=C2=A0 2.<br>
>>>>>>>> There could be inconsistencies between Pos=
tman JavaScript API and<br>
>>>>>> JMeter<br>
>>>>>>>> so you won't have access to pm. namesp=
ace in JMeter<br>
>>>>>>>><br>
>>>>>>>><br>
>>>>>>>> So you either need to restore JavaScript e=
ngine by adding Mozilla<br>
>>>>>> Rhino<<br>
>>>>>>>> <a href=3D"https://github.com/mozilla/rhin=
o" rel=3D"noreferrer" target=3D"_blank">https://github.com/mozilla/rhino</a=
>> or switching to GraalVM<<br>
>>>>>>>> <a href=3D"https://www.graalvm.org/" rel=
=3D"noreferrer" target=3D"_blank">https://www.graalvm.org/</a>>=C2=A0 or=
=C2=A0 re-write your code in Groovy. The<br>
>>> latter<br>
>>>>>>>> option is better from performance perspect=
ive as Groovy scripts<br>
>>>>>>>> can<br>
>>> be<br>
>>>>>>>> compiled and cached and it matters especia=
lly for "heavy" tasks<br>
>>>>>>>> like<br>
>>>>>>>> cryptography. More information: Apache Gro=
ovy: What Is Groovy Used<br>
>>>>>> For?<<br>
>>>>>>>> <a href=3D"https://www.blazemeter.com/blog=
/apache-groovy" rel=3D"noreferrer" target=3D"_blank">https://www.blazemeter=
.com/blog/apache-groovy</a>><br>
>>>>>>>><br>
>>>>>>>><br>
>>>>>>>><br>
>>>>>>>> ________________________________<br>
>>>>>>>> From: Abhitosh Patil<<a href=3D"mailto:=
[email protected]" target=3D"_blank">[email protected]</a>><br>
>>>>>>>> Sent: Wednesday, April 2, 2025 5:14 PM<br>
>>>>>>>> To: JMeter Users List<<a href=3D"mailto=
:[email protected]" target=3D"_blank">[email protected]</a>><b=
r>
>>>>>>>> Subject: Need to execute javascript using =
JMeter<br>
>>>>>>>><br>
>>>>>>>> We have a requirement to generate unique a=
uthentication<br>
>>>>>>>> signature to<br>
>>>>>> pass<br>
>>>>>>>> as a header in API request. We have a pre-=
request javascript for<br>
>>> same<br>
>>>>>> in<br>
>>>>>>>> postman tool.<br>
>>>>>>>><br>
>>>>>>>> Same javascript we tried in JMeter using j=
sr223 and beanshell<br>
>>>>>> elements. But<br>
>>>>>>>> it's not working. Any solution for thi=
s?<br>
>>>>>>>><br>
><br>
<br>
<br>
---------------------------------------------------------------------<br>
To unsubscribe, e-mail: <a href=3D"mailto:[email protected]=
g" target=3D"_blank">[email protected]</a><br>
For additional commands, e-mail: <a href=3D"mailto:[email protected].=
org" target=3D"_blank">[email protected]</a><br>
<br>
</blockquote></div>
--0000000000002910750631e4978f--
--0000000000002910760631e49790
Content-Type: image/png; name="image.png"
Content-Disposition: inline; filename="image.png"
Content-Transfer-Encoding: base64
Content-ID: <ii_m91qiamb0>
X-Attachment-Id: ii_m91qiamb0
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
--0000000000002910760631e49790--