This is an automated email from the ASF dual-hosted git repository.
rcordier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git
The following commit(s) were added to refs/heads/master by this push:
new 7eff66d0a1 JAMES-3539 WebPushClient should accept more flexible 20x
codes from Push server
7eff66d0a1 is described below
commit 7eff66d0a1614d148ee4f3c3cab3c451bf8ade27
Author: Quan Tran <[email protected]>
AuthorDate: Thu May 15 14:15:29 2025 +0700
JAMES-3539 WebPushClient should accept more flexible 20x codes from Push
server
It seems that some push gateways, like MSGraph, are using return codes 200
and 202 as well.
---
.../jmap/pushsubscription/WebPushClient.scala | 2 +-
.../pushsubscription/WebPushClientContract.scala | 33 ++++++++++++++++++++++
2 files changed, 34 insertions(+), 1 deletion(-)
diff --git
a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/pushsubscription/WebPushClient.scala
b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/pushsubscription/WebPushClient.scala
index 5ad1300ad5..37b306aa4e 100644
---
a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/pushsubscription/WebPushClient.scala
+++
b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/pushsubscription/WebPushClient.scala
@@ -128,7 +128,7 @@ class DefaultWebPushClient @Inject()(configuration:
PushClientConfiguration) ext
private def afterHTTPResponseHandler(httpResponse: HttpClientResponse,
dataBuf: ByteBufMono): Mono[Void] =
Mono.just(httpResponse.status())
.flatMap {
- case HttpResponseStatus.CREATED => Mono.empty()
+ case HttpResponseStatus.OK | HttpResponseStatus.CREATED |
HttpResponseStatus.ACCEPTED => Mono.empty()
case HttpResponseStatus.BAD_REQUEST => preProcessingData(dataBuf)
.flatMap(string =>
Mono.error(WebPushInvalidRequestException(string)))
case statusCode: HttpResponseStatus => preProcessingData(dataBuf)
diff --git
a/server/protocols/jmap-rfc-8621/src/test/scala/org/apache/james/jmap/pushsubscription/WebPushClientContract.scala
b/server/protocols/jmap-rfc-8621/src/test/scala/org/apache/james/jmap/pushsubscription/WebPushClientContract.scala
index a41b292d5d..a43ef50681 100644
---
a/server/protocols/jmap-rfc-8621/src/test/scala/org/apache/james/jmap/pushsubscription/WebPushClientContract.scala
+++
b/server/protocols/jmap-rfc-8621/src/test/scala/org/apache/james/jmap/pushsubscription/WebPushClientContract.scala
@@ -21,6 +21,8 @@ package org.apache.james.jmap.pushsubscription
import java.net.URL
import java.nio.charset.StandardCharsets
+import java.time.Clock
+import java.util.UUID
import org.apache.james.jmap.api.model.PushSubscriptionServerURL
import
org.apache.james.jmap.pushsubscription.WebPushClientTestFixture.PUSH_REQUEST_SAMPLE
@@ -31,6 +33,7 @@ import org.junit.jupiter.params.provider.ValueSource
import org.mockserver.integration.ClientAndServer
import org.mockserver.model.HttpRequest.request
import org.mockserver.model.HttpResponse.response
+import org.mockserver.model.NottableString.string
import org.mockserver.verify.VerificationTimes
import reactor.core.scala.publisher.SMono
@@ -110,6 +113,36 @@ trait WebPushClientContract {
VerificationTimes.atLeast(1))
}
+ @ParameterizedTest
+ @ValueSource(ints = Array(200, 201, 202))
+ def pushClientShouldAcceptFlexible20xCodes(httpStatusCode: Int, pushServer:
ClientAndServer): Unit = {
+ pushServer
+ .when(request
+ .withPath("/pushh")
+ .withMethod("POST")
+ .withHeader(string("Content-type"), string("application/json
charset=utf-8"))
+ .withHeader(string("Urgency"))
+ .withHeader(string("Topic"))
+ .withHeader(string("TTL")))
+ .respond(response
+ .withStatusCode(httpStatusCode)
+ .withHeader("Location",
String.format("https://push.example.net/message/%s", UUID.randomUUID))
+ .withHeader("Date", Clock.systemUTC.toString)
+ .withBody(UUID.randomUUID.toString))
+
+ assertThatCode(() =>
SMono.fromPublisher(testee.push(PushSubscriptionServerURL.from(s"${pushServerBaseUrl.toString}/pushh").get,
PUSH_REQUEST_SAMPLE))
+ .block())
+ .doesNotThrowAnyException()
+
+ pushServer.verify(request()
+ .withPath("/pushh")
+ .withHeader("TTL", "15")
+ .withHeader("Topic", "topicabc")
+ .withHeader("Urgency", "High")
+ .withBody(new String(PUSH_REQUEST_SAMPLE.payload,
StandardCharsets.UTF_8)),
+ VerificationTimes.once)
+ }
+
@Test
def pushRequestShouldParserErrorResponseFromPushServerWhenFail(pushServer:
ClientAndServer): Unit = {
pushServer
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]