Sendgrid API からのコールバックを処理するカスタム multipartFormData データ パーサーを実装しようとしています。コールバックは、dataparts が異なるエンコーディングでエンコードされる可能性のあるマルチパート リクエストutf-8
ですISO-8859-1
。
Sendgrid は、各フィールドのエンコーディングを説明する単純な json オブジェクトである charsets フィールドを提供します。
{"to":"UTF-8","html":"ISO-8859-1","subject":"UTF-8","from":"UTF-8","text":"ISO-8859-1"}
現在、次のように dataParts から文字セットを抽出しています。
val charsets = extract(request.body.dataParts, "charsets", _.as[Charsets]).getOrElse(Charsets(Some(""), Some(""), Some(""), Some(""), Some("")))
def extract[T](env: Map[String, Seq[String]], key: String, conv: JsValue => T): Option[T] = {
env.get(key).flatMap(_.headOption).map(Json.parse).map(conv)
}
case class Charsets(to: Option[String], html: Option[String], subject: Option[String], from: Option[String], text: Option[String])
object Charsets {
implicit val charsetReads = Json.format[Charsets]
}
しかし、パーサーによってすべてのエンコーディングが間違って設定されている可能性があるため、それは機能しません。
オリジナルhandleDataPart
は使用するためにハードコードされていますutf-8
def handleDataPart: PartHandler[Part] = {
case headers @ Multipart.PartInfoMatcher(partName) if !Multipart.FileInfoMatcher.unapply(headers).isDefined =>
Traversable.takeUpTo[Array[Byte]](DEFAULT_MAX_TEXT_LENGTH)
.transform(Iteratee.consume[Array[Byte]]().map(bytes => DataPart(partName, new String(bytes, "utf-8"))))
.flatMap { data =>
Cont({
case Input.El(_) => Done(MaxDataPartSizeExceeded(partName), Input.Empty)
case in => Done(data, in)
})
}
}
したがって、私がやりたいことは、charsets オブジェクトの抽出を開始し、それを Dataparts の作成時に使用するか、各フィールドの文字列を作成する代わりに、Array[Byte] を作成してから、コントローラーで文字列の作成を処理することです。多分他の方法がありますか?これをどのように解決しますか?行き詰まりを感じており、ガイダンスが必要です。