Multipart-formdata со значением, начинающимся с «>», приводит к ошибке «Отправка 2xx« раннего »ответа до конца ...» - PullRequest
0 голосов
/ 09 марта 2020

Я установил простую конечную точку, поддерживающую запрос multipart-formdata.

package com.test

import akka.actor.ActorSystem
import akka.http.scaladsl.Http
import akka.http.scaladsl.model.Multipart
import akka.http.scaladsl.model.Multipart.BodyPart
import akka.http.scaladsl.server.Directives._
import akka.stream.SystemMaterializer

import scala.concurrent.duration._
import scala.io.StdIn
import scala.util.{Failure, Success}

object Application {

  def main(args: Array[String]) {

    implicit val system = ActorSystem("my-system")
    implicit val materializer = SystemMaterializer(system)
    implicit val executionContext = system.dispatcher

    val route = path("post") {
      entity(as[Multipart.FormData]) { formData =>

        val requestData = formData.parts
          .mapAsync[(String, String)](1) {
          case data: BodyPart =>
            data.toStrict(3.seconds).map(strict => data.name.toLowerCase -> strict.entity.data.utf8String)
        }.runFold(Map.empty[String, String])((map, tuple) => map + tuple)
        onComplete(requestData) {
          case Success(d) =>
            println(s"Data : $d")
            complete("Ok")
          case Failure(err) => complete(s"Error : $err")

        }
      }
    }

    val bindingFuture = Http().bindAndHandle(route, "localhost", 8080)

    println(s"Server online at http://localhost:8080/\nPress RETURN to stop...")
    StdIn.readLine() // let it run until user presses return
    bindingFuture
      .flatMap(_.unbind()) // trigger unbinding from the port
      .onComplete(_ => system.terminate()) // and shutdown when done
  }
}

В моем запросе есть 2 поля company и hello:

  • Когда я отправляю поле, значение которого начинается с <, я получаю эту ошибку Sending an 2xx 'early' response before end...

  • Для символов, отличных от того, что он работает, как ожидалось.

Выход

Data : Map(company -> MyWorld, hello -> world)
Data : Map(company -> MyWorld, hello -> w<orld)
Data : Map(company -> MyWorld, hello -> w>orld)
Data : Map(company -> MyWorld, hello -> ^world)
Data : Map(company -> MyWorld, hello -> >world)
[WARN] [03/06/2020 23:27:51.931] [my-system-akka.actor.default-dispatcher-60] [akka.actor.ActorSystemImpl(my-system)] Sending an 2xx 'early' response before end of request for http://localhost:8080/post received... Note that the connection will be closed after this response. Also, many clients will not read early responses! Consider only issuing this response after the request data has been completely read!   

Последняя строка выше появляется с <world в запросе

Пример скручивания

curl -vvv \
    -F "company=MyWorld" \
    -F "hello=>world" \
    http://localhost:8080/post

Кто-нибудь знает почему? Некоторые требования РФ C или ошибка?

Спасибо

...