How to calculate sign using Gatling3?

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?