This is an automated email from the ASF dual-hosted git repository.

fanningpj pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/pekko-http.git


The following commit(s) were added to refs/heads/main by this push:
     new a6b03ea40 shared character toLowerCase function (#809)
a6b03ea40 is described below

commit a6b03ea40a4b07403978dee782f847c1d84bd93b
Author: PJ Fanning <[email protected]>
AuthorDate: Mon Oct 6 22:35:10 2025 +0100

    shared character toLowerCase function (#809)
    
    Update CharUtils.scala
    
    Update CharUtils.scala
    
    use byteChar
    
    Remove unused import from HttpHeaderParser.scala
    
    revert change to use byteChar fn
    
    Update HttpHeaderParser.scala
---
 .../impl/engine/parsing/HttpHeaderParser.scala     | 27 +++++++------------
 .../http/impl/model/parser/CommonActions.scala     |  2 +-
 .../pekko/http/impl/model/parser/UriParser.scala   | 10 +++----
 .../apache/pekko/http/impl/util/CharUtils.scala    | 31 ++++++++++++++++++++++
 .../pekko/http/scaladsl/model/HttpMessage.scala    | 18 ++++++-------
 5 files changed, 55 insertions(+), 33 deletions(-)

diff --git 
a/http-core/src/main/scala/org/apache/pekko/http/impl/engine/parsing/HttpHeaderParser.scala
 
b/http-core/src/main/scala/org/apache/pekko/http/impl/engine/parsing/HttpHeaderParser.scala
index efcefe5e5..7b697a440 100644
--- 
a/http-core/src/main/scala/org/apache/pekko/http/impl/engine/parsing/HttpHeaderParser.scala
+++ 
b/http-core/src/main/scala/org/apache/pekko/http/impl/engine/parsing/HttpHeaderParser.scala
@@ -20,18 +20,18 @@ import java.lang.{ StringBuilder => JStringBuilder }
 import org.apache.pekko
 import pekko.annotation.InternalApi
 import pekko.event.LoggingAdapter
-import pekko.http.scaladsl.settings.ParserSettings
+import pekko.http.impl.model.parser.CharacterClasses._
+import pekko.http.impl.model.parser.HeaderParser
+import pekko.http.impl.util._
+import pekko.http.impl.util.CharUtils.toLowerCase
+import pekko.http.impl.util.HttpConstants._
+import pekko.http.scaladsl.model.{ ErrorInfo, HttpHeader, MediaTypes, 
StatusCode, StatusCodes }
+import pekko.http.scaladsl.model.headers.{ EmptyHeader, RawHeader }
 import pekko.http.scaladsl.settings.ParserSettings.{
   ErrorLoggingVerbosity,
   IllegalResponseHeaderNameProcessingMode,
   IllegalResponseHeaderValueProcessingMode
 }
-import pekko.http.impl.util._
-import pekko.http.impl.util.HttpConstants._
-import pekko.http.scaladsl.model.{ ErrorInfo, HttpHeader, MediaTypes, 
StatusCode, StatusCodes }
-import pekko.http.scaladsl.model.headers.{ EmptyHeader, RawHeader }
-import pekko.http.impl.model.parser.HeaderParser
-import pekko.http.impl.model.parser.CharacterClasses._
 import pekko.util.ByteString
 
 import scala.annotation.tailrec
@@ -643,13 +643,13 @@ private[http] object HttpHeaderParser {
               }
             } else {
               mode match {
-                case 
ParserSettings.IllegalResponseHeaderValueProcessingMode.Error =>
+                case IllegalResponseHeaderValueProcessingMode.Error =>
                   fail(s"Illegal character '${escape(c)}' in header value")
-                case 
ParserSettings.IllegalResponseHeaderValueProcessingMode.Warn =>
+                case IllegalResponseHeaderValueProcessingMode.Warn =>
                   // ignore the illegal character and log a warning message
                   log.warning(s"Illegal character '${escape(c)}' in header 
value")
                   sb
-                case 
ParserSettings.IllegalResponseHeaderValueProcessingMode.Ignore =>
+                case IllegalResponseHeaderValueProcessingMode.Ignore =>
                   // just ignore the illegal character
                   sb
               }
@@ -682,11 +682,4 @@ private[http] object HttpHeaderParser {
     def withValueCountIncreased = copy(valueCount = valueCount + 1)
     def spaceLeft = valueCount < parser.maxValueCount
   }
-
-  /**
-   * Efficiently lower-cases the given character.
-   * Note: only works for 7-bit ASCII letters (which is enough for header 
names)
-   */
-  private[HttpHeaderParser] def toLowerCase(c: Char): Char =
-    if (c >= 'A' && c <= 'Z') (c + 0x20 /* - 'A' + 'a' */ ).toChar else c
 }
diff --git 
a/http-core/src/main/scala/org/apache/pekko/http/impl/model/parser/CommonActions.scala
 
b/http-core/src/main/scala/org/apache/pekko/http/impl/model/parser/CommonActions.scala
index f3d2df709..51f032bbf 100644
--- 
a/http-core/src/main/scala/org/apache/pekko/http/impl/model/parser/CommonActions.scala
+++ 
b/http-core/src/main/scala/org/apache/pekko/http/impl/model/parser/CommonActions.scala
@@ -80,7 +80,7 @@ private[parser] trait CommonActions {
         val char2 = str2.charAt(at)
 
         (char1 | char2) < 0x80 &&
-        Character.toLowerCase(char1) == Character.toLowerCase(char2) &&
+        CharUtils.toLowerCase(char1) == CharUtils.toLowerCase(char2) &&
         stringEquals(at + 1, length)
       } else true
 
diff --git 
a/http-core/src/main/scala/org/apache/pekko/http/impl/model/parser/UriParser.scala
 
b/http-core/src/main/scala/org/apache/pekko/http/impl/model/parser/UriParser.scala
index c2413685e..7d9e1c4ba 100644
--- 
a/http-core/src/main/scala/org/apache/pekko/http/impl/model/parser/UriParser.scala
+++ 
b/http-core/src/main/scala/org/apache/pekko/http/impl/model/parser/UriParser.scala
@@ -16,13 +16,13 @@ package org.apache.pekko.http.impl.model.parser
 import java.nio.charset.Charset
 
 import org.apache.pekko
-import org.parboiled2._
-import pekko.http.impl.util.{ enhanceString_, StringRendering }
+import pekko.annotation.InternalApi
+import pekko.http.impl.util.{ enhanceString_, CharUtils => CU, StringRendering 
}
 import pekko.http.scaladsl.model.{ Uri, UriRendering }
 import pekko.http.scaladsl.model.headers.HttpOrigin
-import Parser.DeliveryScheme.Either
 import Uri._
-import pekko.annotation.InternalApi
+import org.parboiled2._
+import org.parboiled2.Parser.DeliveryScheme.Either
 
 /**
  * INTERNAL API
@@ -365,7 +365,7 @@ private[http] final class UriParser(
 
   ///////////// helpers /////////////
 
-  private def appendLowered(): Rule0 = rule { 
run(sb.append(CharUtils.toLowerCase(lastChar))) }
+  private def appendLowered(): Rule0 = rule { 
run(sb.append(CU.toLowerCase(lastChar))) }
 
   private def savePath() = rule { run(setPath(Path(sb.toString, 
uriParsingCharset))) }
 
diff --git 
a/http-core/src/main/scala/org/apache/pekko/http/impl/util/CharUtils.scala 
b/http-core/src/main/scala/org/apache/pekko/http/impl/util/CharUtils.scala
new file mode 100644
index 000000000..f15e4f23c
--- /dev/null
+++ b/http-core/src/main/scala/org/apache/pekko/http/impl/util/CharUtils.scala
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * license agreements; and to You under the Apache License, version 2.0:
+ *
+ *   https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * This file is part of the Apache Pekko project, which was derived from Akka.
+ */
+
+/*
+ * Copyright (C) 2009-2022 Lightbend Inc. <https://www.lightbend.com>
+ */
+
+package org.apache.pekko.http.impl.util
+
+import org.apache.pekko
+import pekko.annotation.InternalApi
+
+@InternalApi
+private[http] object CharUtils {
+
+  /**
+   * Internal Pekko HTTP Use only.
+   *
+   * Efficiently lower-cases the given character.
+   * Note: only works for 7-bit ASCII letters (which is enough for header 
names)
+   */
+  final def toLowerCase(c: Char): Char =
+    if (c >= 'A' && c <= 'Z') (c + 0x20 /* - 'A' + 'a' */ ).toChar else c
+
+}
diff --git 
a/http-core/src/main/scala/org/apache/pekko/http/scaladsl/model/HttpMessage.scala
 
b/http-core/src/main/scala/org/apache/pekko/http/scaladsl/model/HttpMessage.scala
index eb1034419..9e300ebe9 100644
--- 
a/http-core/src/main/scala/org/apache/pekko/http/scaladsl/model/HttpMessage.scala
+++ 
b/http-core/src/main/scala/org/apache/pekko/http/scaladsl/model/HttpMessage.scala
@@ -13,31 +13,29 @@
 
 package org.apache.pekko.http.scaladsl.model
 
-import org.apache.pekko
-import pekko.stream.scaladsl.Flow
-import pekko.stream.{ FlowShape, Graph, Materializer, SystemMaterializer }
 import java.io.File
 import java.nio.file.Path
 import java.lang.{ Iterable => JIterable }
 import java.util.Optional
 import java.util.concurrent.{ CompletionStage, Executor }
 
-import scala.concurrent.duration.FiniteDuration
-import scala.concurrent.{ ExecutionContext, Future }
+import scala.annotation.tailrec
 import scala.collection.immutable
+import scala.concurrent.{ ExecutionContext, Future }
+import scala.concurrent.duration._
+import scala.jdk.FutureConverters._
 import scala.reflect.{ classTag, ClassTag }
+
+import org.apache.pekko
 import pekko.Done
 import pekko.actor.ClassicActorSystemProvider
-import org.parboiled2.CharUtils
 import pekko.util.{ ByteString, HashCode, OptionVal }
 import pekko.http.impl.util._
 import pekko.http.javadsl.{ model => jm }
 import pekko.http.scaladsl.util.FastFuture._
 import pekko.http.scaladsl.model.headers._
-
-import scala.annotation.tailrec
-import scala.concurrent.duration._
-import scala.jdk.FutureConverters._
+import pekko.stream.scaladsl.Flow
+import pekko.stream.{ FlowShape, Graph, Materializer, SystemMaterializer }
 
 /**
  * Common base class of HttpRequest and HttpResponse.


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to