Skip to content

feat: add RFC 10008 QUERY method and Accept-Query header support#1077

Open
He-Pin wants to merge 5 commits into
mainfrom
feat/rfc-10008-query-method
Open

feat: add RFC 10008 QUERY method and Accept-Query header support#1077
He-Pin wants to merge 5 commits into
mainfrom
feat/rfc-10008-query-method

Conversation

@He-Pin

@He-Pin He-Pin commented Jun 19, 2026

Copy link
Copy Markdown
Member

Summary

  • Add QUERY HTTP method constant (safe, idempotent, expects request body per RFC 10008) to both Scala and Java API
  • Add Accept-Query modeled response header with enhanced parser supporting RFC 9651 Structured Fields syntax (quoted strings, q-value stripping)
  • Add query routing directive for both Scala DSL and Java DSL
  • Add HttpRequest.QUERY() factory method for Java API
  • Add documentation page and directional tests

Motivation

RFC 10008 defines the HTTP QUERY method as a safe and idempotent method that expects a request body, along with the Accept-Query response header. pekko-http should provide first-class support for this standard HTTP method, similar to what Netty did in PR #16978.

Modification

Core (http-core)

  • HttpMethod.scala: Add QUERY to HttpMethods (safe=true, idempotent=true, requestEntityAcceptance=Expected)
  • HttpMethods.java: Add QUERY constant to Java API
  • HttpRequest.java: Add QUERY(String uri) factory method
  • headers.scala: Add Accept-Query modeled response header (Seq[MediaRange])
  • AcceptQuery.java: New Java API abstract class
  • HeaderParser.scala: Register accept-query in dispatch
  • AcceptHeader.scala: Add accept-query parser with RFC 9651 Structured Fields support:
    • Handles both token (application/json) and quoted-string ("application/jsonpath") forms
    • Strips q-values (not meaningful for Accept-Query per RFC 10008)

Routing (http)

  • MethodDirectives.scala (scaladsl): Add query directive
  • MethodDirectives.scala (javadsl): Add query directive

Documentation (docs)

  • New query.md page for the query method directive
  • Scala and Java examples in doc tests

Tests

  • HttpMethodsSpec: QUERY method lookup
  • HttpHeaderSpec: Accept-Query parsing (token, quoted string, wildcard, q-value stripping, RFC example)
  • HeaderSpec: Accept-Query rendering
  • MethodDirectivesSpec: query directive routing
  • MethodDirectivesExamplesSpec / MethodDirectivesExamplesTest: doc examples

Result

Downstream consumers can implement RFC 10008 QUERY method support using built-in constants, headers, parsing, and routing directives.

Test plan

  • sbt "http-core / Test / testOnly org.apache.pekko.http.scaladsl.model.HttpMethodsSpec" → 6 passed
  • sbt "http-core / Test / testOnly org.apache.pekko.http.impl.model.parser.HttpHeaderSpec" → 75 passed
  • sbt "http-core / Test / testOnly org.apache.pekko.http.scaladsl.model.headers.HeaderSpec" → 18 passed
  • sbt "http-tests / Test / testOnly org.apache.pekko.http.scaladsl.server.directives.MethodDirectivesSpec" → 14 passed
  • sbt "docs / Test / testOnly docs.http.scaladsl.server.directives.MethodDirectivesExamplesSpec docs.http.javadsl.server.directives.MethodDirectivesExamplesTest" → 11 passed
  • sbt "http-core / mimaReportBinaryIssues" → success
  • sbt "http / mimaReportBinaryIssues" → success
  • git diff --check → clean
  • scalafmt + javafmt applied

References

Refs netty/netty#16978, https://www.rfc-editor.org/rfc/rfc10008

Tests

  • All directional tests pass (see test plan above)

Motivation:
RFC 10008 defines the HTTP QUERY method as a safe, idempotent method that
expects a request body, along with the Accept-Query response header for
signaling supported query media types. pekko-http should provide first-class
support for this standard HTTP method.

Modification:
- Add QUERY method constant to HttpMethods (Scala and Java API)
- Add Accept-Query modeled response header with MediaRange list
- Add Accept-Query parser supporting RFC 9651 Structured Fields syntax
  (quoted strings like "application/jsonpath") with q-value stripping
- Add query routing directive (Scala DSL and Java DSL)
- Add HttpRequest.QUERY factory method (Java API)
- Add AcceptQuery Java API abstract class
- Register accept-query in HeaderParser dispatch
- Add documentation page for query directive with Scala/Java examples
- Add directional tests: method lookup, header parsing (token, quoted
  string, wildcard, q-value stripping), directive routing

Result:
Downstream consumers can implement RFC 10008 QUERY method support using
built-in constants, headers, parsing, and routing directives.

Tests:
- sbt "http-core / Test / testOnly org.apache.pekko.http.scaladsl.model.HttpMethodsSpec" → 6 passed
- sbt "http-core / Test / testOnly org.apache.pekko.http.impl.model.parser.HttpHeaderSpec" → 75 passed
- sbt "http-core / Test / testOnly org.apache.pekko.http.scaladsl.model.headers.HeaderSpec" → 18 passed
- sbt "http-tests / Test / testOnly org.apache.pekko.http.scaladsl.server.directives.MethodDirectivesSpec" → 14 passed
- sbt "docs / Test / testOnly docs.http.scaladsl.server.directives.MethodDirectivesExamplesSpec docs.http.javadsl.server.directives.MethodDirectivesExamplesTest" → 11 passed
- sbt "http-core / mimaReportBinaryIssues" → success
- sbt "http / mimaReportBinaryIssues" → success

References:
Refs netty/netty#16978, https://www.rfc-editor.org/rfc/rfc10008
@He-Pin He-Pin added the enhancement New feature or request label Jun 19, 2026
@He-Pin He-Pin added this to the 2.0.0-M2 milestone Jun 19, 2026
Motivation:
Review feedback identified missing directional tests for QUERY method
semantics (safe, idempotent, expected entity) and an unused import.

Modification:
- Add property tests verifying QUERY is safe, idempotent, and expects
  a request entity per RFC 10008 (goes beyond Netty's test coverage)
- Remove unused HttpMethod import from MethodDirectivesSpec

Result:
Stronger test coverage ensuring RFC 10008 semantics are preserved.

Tests:
- sbt "http-core / Test / testOnly org.apache.pekko.http.scaladsl.model.HttpMethodsSpec" → 9 passed
- sbt "http-tests / Test / testOnly org.apache.pekko.http.scaladsl.server.directives.MethodDirectivesSpec" → 14 passed

References:
Refs https://www.rfc-editor.org/rfc/rfc10008
@He-Pin He-Pin requested a review from pjfanning June 19, 2026 05:11
Motivation:
Accept-Query is a Structured Field in RFC 10008, but the PR reused Accept media-range parsing and rendering in places that could emit invalid field values or treat parameters as Accept weights.

Modification:
Parse Accept-Query media ranges and parameters with Structured Field token/string rules. Render Accept-Query values with token-or-string selection, preserve valid SF parameters, reject invalid wildcard and decimal-parameter forms, and add focused parser/rendering tests. Add the query directive to the alphabetical docs index and fix Accept-Query RFC section links.

Result:
Accept-Query parsing and rendering now matches RFC 10008 Section 3 while keeping the parser path lightweight.

Tests:
- scalafmt --mode diff-ref=origin/main
- scalafmt --list --mode diff-ref=origin/main
- git diff --check
- sbt 'project http-core' 'Test / testOnly org.apache.pekko.http.impl.model.parser.HttpHeaderSpec'
- sbt 'project http-core' 'Test / testOnly org.apache.pekko.http.scaladsl.model.headers.HeaderSpec'
- sbt 'project http-core' 'Test / testOnly org.apache.pekko.http.scaladsl.model.HttpMethodsSpec'
- sbt 'http-tests / Test / testOnly org.apache.pekko.http.scaladsl.server.directives.MethodDirectivesSpec'
- sbt docs/paradox

References:
Refs #1077
@He-Pin He-Pin requested a review from jrudolph June 19, 2026 08:21
Motivation:
AcceptQuery.java is a new file with original code, not derived from
Akka. It should use the standard ASF license header, not the
"derived from Akka" header.

Modification:
Replace apacheFromAkkaSourceHeader with the standard apacheHeader as
defined in CopyrightHeader.scala.

Result:
AcceptQuery.java carries the correct license header for new
contributions.

References:
Refs #1077

@He-Pin He-Pin left a comment

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed: AcceptQuery.java now uses the standard ASF license header (apacheHeader) instead of the Akka-derived header (apacheFromAkkaSourceHeader), as this is a new file with original code.

@He-Pin He-Pin requested a review from pjfanning June 19, 2026 08:39
Motivation:
`private[this]` is being phased out in Scala 3 and provides no
measurable benefit for vals in objects/traits.

Modification:
Replace `private[this]` with `private` in AcceptHeader.scala (3 vals)
and headers.scala (1 val).

Result:
Cleaner code compatible with Scala 3 conventions. scalafmt applied.

Tests:
Not run - visibility-only change

References:
Refs #1077
@pjfanning pjfanning requested a review from raboof June 21, 2026 16:00
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants