When I use Gatling2.3, I use the following code to calculate sign:
import org.asynchhttpclient.{RequestBuilderBase, Request}
def calculateAndAddSignature(request: Request, requestBuilder: RequestBuilderBase[_]): Unit = {
val list = new ArrayList[String]()
var salt = ""
for (i <- 1 to request.getQueryParams.size()) {
if (request.getQueryParams.get(i-1).getName == "salt") {
salt = request.getQueryParams.get(i-1).getValue
}
val paramString = request.getQueryParams.get(i-1).getName +"="+ request.getQueryParams.get(i-1).getValue
list.add(paramString)
}
for (i <- 1 to request.getFormParams.size()) {
if (request.getFormParams.get(i-1).getName == "salt") {
salt = request.getFormParams.get(i-1).getValue
}
val paramString = request.getFormParams.get(i-1).getName +"="+ request.getFormParams.get(i-1).getValue
list.add(paramString)
}
Collections.sort(list)
val sb = new StringBuilder
for (j <- 1 to list.size()) {
sb.append(list.get(j-1))
}
sb.append("123456789") // one secrect number
val sig = md5Hex(sb.toString)
val tokenSig = sha256Hex(sig + salt)
requestBuilder.addQueryParam("sig",sig)
requestBuilder.addQueryParam("__NS_token_sig",tokenSig)
}
// And use it
// some queryParams
// ...
.formUpload("file", "test.mp4")
.signatureCalculator(calculateAndAddSignature(_, _))
.check(jsonPath("$.result").is("OK"))
And now I use the following code to calculate sign on Gatling3:
class KsSignatureCalculator extends SignatureCalculator {
override def sign(request: Request): Unit = {
val list = new util.ArrayList[String]()
var salt = ""
val query = request.getUri.getEncodedQueryParams
for (i <- 1 to query.size()) {
if (query.get(i-1).getName == "salt") {
token_client_salt = query.get(i-1).getValue
}
val paramString = query.get(i-1).getName + "=" + query.get(i-1).getValue
list.add(paramString)
}
val body = request.getBody
var form: util.List[Param] = Collections.emptyList()
if (body.isInstanceOf[FormUrlEncodedRequestBody]) {
form = body.asInstanceOf[FormUrlEncodedRequestBody].getContent
} else if (body.isInstanceOf[MultipartFormDataRequestBody]) {
// todo ??
// How to difference FormUrl... and MultipartForm...
}
for (i <- 1 to form.size()) {
if (form.get(i-1).getName == "salt") {
salt = form.get(i-1).getValue
}
val paramString = form.get(i-1).getName + "=" + form.get(i-1).getValue
list.add(paramString)
}
Collections.sort(list)
val sb = new StringBuilder
for (j <- 1 to list.size()) {
sb.append(list.get(j-1))
}
sb.append("123456789") // one secrect number
val sig = md5Hex(sb.toString)
if (request.getBody.isInstanceOf[FormUrlEncodedRequestBody]) {
request.getBody.asInstanceOf[FormUrlEncodedRequestBody].getContent.add(new Param("sig", sig))
}
if (salt != "") {
val tokenSig = sha256Hex(sig + token_client_salt)
request.getBody.asInstanceOf[FormUrlEncodedRequestBody].getContent.add(new Param("__NS_token_sig", tokenSig))
}
}
}
// And use it
// some formParams
...
.formUpload("file", "test.mp4")
.sign(new KsSignatureCalculator)
.check(jsonPath("$.result").is("OK")
How should I difference Form and Multipart Form, as the above code TODO.
Thanks a lot?