This is an automated email from the ASF dual-hosted git repository.
fanningpj pushed a commit to branch 1.3.x
in repository https://gitbox.apache.org/repos/asf/pekko-http.git
The following commit(s) were added to refs/heads/1.3.x by this push:
new 59b77bcaa more performant boundary check (#799) (#828)
59b77bcaa is described below
commit 59b77bcaa6dac2fac41ec228ce914ba8bb8f8ce0
Author: PJ Fanning <[email protected]>
AuthorDate: Sat Oct 18 13:00:06 2025 +0100
more performant boundary check (#799) (#828)
* more performant boundary check
* try to fix tests
* Update BodyPartParser.scala
* Update BodyPartParser.scala
* Update BodyPartParser.scala
* Update BodyPartParser.scala
* add HttpConstants
Update BodyPartParser.scala
---
.../http/impl/engine/parsing/BodyPartParser.scala | 32 ++++++++++++++++++----
1 file changed, 26 insertions(+), 6 deletions(-)
diff --git
a/http-core/src/main/scala/org/apache/pekko/http/impl/engine/parsing/BodyPartParser.scala
b/http-core/src/main/scala/org/apache/pekko/http/impl/engine/parsing/BodyPartParser.scala
index 0be9fc946..04e0a16cb 100644
---
a/http-core/src/main/scala/org/apache/pekko/http/impl/engine/parsing/BodyPartParser.scala
+++
b/http-core/src/main/scala/org/apache/pekko/http/impl/engine/parsing/BodyPartParser.scala
@@ -25,7 +25,6 @@ import pekko.stream.{ Attributes, FlowShape, Inlet, Outlet }
import pekko.stream.scaladsl.Source
import pekko.stream.stage._
import pekko.util.ByteString
-import headers._
import org.parboiled2.CharPredicate
import scala.annotation.tailrec
@@ -360,11 +359,32 @@ private[http] object BodyPartParser {
override def defineOnce(byteString: ByteString): EndOfLineConfiguration = {
// Hypothesis: There is either CRLF or LF as EOL, no mix possible
- val crLfNeedle = ByteString(s"$boundary\r\n")
- val lfNeedle = ByteString(s"$boundary\n")
- if (byteString.containsSlice(crLfNeedle))
DefinedEndOfLineConfiguration("\r\n", boundary)
- else if (byteString.containsSlice(lfNeedle))
DefinedEndOfLineConfiguration("\n", boundary)
- else this
+ checkForBoundary(byteString) match {
+ case CR_BYTE => DefinedEndOfLineConfiguration("\r\n", boundary)
+ case LF_BYTE => DefinedEndOfLineConfiguration("\n", boundary)
+ case _ => this
+ }
+ }
+
+ // returns CR for CRLF, LF for LF, 0 otherwise
+ private def checkForBoundary(byteString: ByteString): Byte = {
+ val check = ByteString(boundary)
+ @tailrec def findBoundary(offset: Int): Byte = {
+ val index = byteString.indexOfSlice(check, offset)
+ if (index != -1) {
+ val newIndex = index + boundary.length
+ byteAt(byteString, newIndex) match {
+ case CR_BYTE =>
+ if (byteAt(byteString, newIndex + 1) == LF_BYTE) CR_BYTE else
findBoundary(index + 1)
+ case LF_BYTE => LF_BYTE
+ case _ => findBoundary(index + 1)
+ }
+ } else 0
+ }
+ try findBoundary(0)
+ catch {
+ case NotEnoughDataException => 0
+ }
}
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]