diff --git a/.circleci/config.yml b/.circleci/config.yml index 9e21f6f90..939c39115 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -36,28 +36,6 @@ docker_in_docker_environment: &docker_in_docker_environment ########################################################################################### ### START: Different JDK images ########################################################################################### -openjdk_alpine_jdk_8u092_environment: &openjdk_alpine_jdk_8u092_environment - <<: *base_environment - docker: - # https://www.oracle.com/java/technologies/javase/8u92-relnotes.html - - image: openjdk:8u92-jdk-alpine@sha256:63eb1c79f609dbaa2c587ba3eb772e8e453229ce91fffc378725ca16435348e9 - -openjdk_alpine_jdk_8u111_environment: &openjdk_alpine_jdk_8u111_environment - <<: *base_environment - docker: - # https://www.oracle.com/java/technologies/javase/8u111-relnotes.html - - image: openjdk:8u111-jdk-alpine@sha256:d49bf8c44670834d3dade17f8b84d709e7db47f1887f671a0e098bafa9bae49f - -azul_zulu_openjdk_alpine_jdk_8u232_environment: &azul_zulu_openjdk_alpine_jdk_8u232_environment - <<: *base_environment - docker: - - image: azul/zulu-openjdk-alpine:8u232@sha256:b0c2420393353be6aaeb77e4498271f46edc5c3dbc39957482f3ef6828628f53 - -adoptopenjdk_openjdk_alpine_jdk_8u312_b07_environment: &adoptopenjdk_openjdk_alpine_jdk_8u312_b07_environment - <<: *base_environment - docker: - - image: adoptopenjdk/openjdk8:jdk8u312-b07-alpine-slim@sha256:da6bb7b3d1bc1a23653c60f88902be9ca15b4a62f537970d37b65dd374be3221 - adoptopenjdk_openjdk_alpine_jdk_11_0_13_8_openj9_environment: &adoptopenjdk_openjdk_alpine_jdk_11_0_13_8_openj9_environment <<: *base_environment docker: @@ -82,16 +60,10 @@ openjdk_alpine_jdk_17_environment: &openjdk_alpine_jdk_17_environment ########################################################################################### ### END: Different JDK images ########################################################################################### - -circleci_pre_built_openjdk_8_environment: &circleci_pre_built_openjdk_8_environment +circleci_pre_built_openjdk_11_environment: &circleci_pre_built_openjdk_11_environment <<: *base_environment docker: - - image: circleci/openjdk:8u292-jdk@sha256:51d82605e7f89fc74437dce7324a33e6a7c9d1941ec8cfd0980f6814d78ae494 - -gradle_7_2_0_jdk8_environment: &gradle_7_2_0_jdk8_environment - <<: *base_environment - docker: - - image: gradle:7.2.0-jdk8-openj9@sha256:d4128edf5ac579f93e3149a9f89be3af779de1d3d85a9f25f25cb3d4b432b69a + - image: circleci/openjdk:11.0.11-9-jdk-buster@sha256:fd85ea86890cd29be510bdb2ad5e09eb494750d16bd3eeac19dabae03ed36b45 gradle_7_2_0_jdk11_environment: &gradle_7_2_0_jdk11_environment @@ -199,7 +171,7 @@ default_steps: &default_steps - run: name: Run all test suits - command: gradle -PciRun << parameters.use_native_jdk_alpn_processor >> clean test integrationTest functionalTest + command: gradle -PciRun clean test integrationTest functionalTest when: always - when: @@ -244,7 +216,7 @@ code_coverage_steps: &code_coverage_steps - run: name: Run JaCoCo plugin code coverage when: on_success - command: ./gradlew -PciRun << parameters.use_native_jdk_alpn_processor >> clean jacocoTestReport + command: ./gradlew -PciRun clean jacocoTestReport - run: name: Upload code coverage data to Codecov @@ -298,8 +270,8 @@ smoke_test_steps: &smoke_test_steps websocat --version - run: - name: Build stubby4j uber JAR - command: ./gradlew -PciRun << parameters.use_native_jdk_alpn_processor >> clean build + name: Build stubby4j uber JAR with log4j on the classpath + command: ./gradlew -PciRun clean build - run: when: on_success @@ -378,10 +350,9 @@ smoke_test_steps: &smoke_test_steps java -version echo "" java -jar build/libs/stubby4j-*.jar \ - --location 127.0.0.1 \ - --tls 7445 \ - --mute \ - --data src/smoke-test/yaml/smoke-tests-stubs.yaml & + --location 127.0.0.1 \ + --tls 7445 \ + --data src/smoke-test/yaml/smoke-tests-stubs.yaml & STUBBY4J_HTTP_1_PID=$! @@ -402,76 +373,11 @@ smoke_test_steps: &smoke_test_steps ############################################################################################# jobs: - # https://www.oracle.com/java/technologies/javase/8u92-relnotes.html - smoke_openjdk_openjdk_8u092: - parameters: - tls_13: - type: string - default: "no" - use_native_jdk_alpn_processor: - type: string - default: "" - run_tls_with_alpn_http_2_tests: - type: string - default: "no" - <<: *openjdk_alpine_jdk_8u092_environment - <<: *smoke_test_steps - - - # https://www.oracle.com/java/technologies/javase/8u111-relnotes.html - smoke_openjdk_openjdk_8u111: - parameters: - tls_13: - type: string - default: "no" - use_native_jdk_alpn_processor: - type: string - default: "" - run_tls_with_alpn_http_2_tests: - type: string - default: "no" - <<: *openjdk_alpine_jdk_8u111_environment - <<: *smoke_test_steps - - - smoke_azul_zulu_openjdk_8u232: - parameters: - tls_13: - type: string - default: "no" # https://github.com/openjsse/openjsse/issues/13 - use_native_jdk_alpn_processor: - type: string - default: "" - run_tls_with_alpn_http_2_tests: - type: string - default: "no" - <<: *azul_zulu_openjdk_alpine_jdk_8u232_environment - <<: *smoke_test_steps - - - smoke_adoptopenjdk_openjdk_8u312_b07: - parameters: - tls_13: - type: string - default: "yes" - use_native_jdk_alpn_processor: - type: string - default: "" - run_tls_with_alpn_http_2_tests: - type: string - default: "yes" - <<: *adoptopenjdk_openjdk_alpine_jdk_8u312_b07_environment - <<: *smoke_test_steps - - smoke_adoptopenjdk_openjdk_11_openj9: parameters: tls_13: type: string default: "yes" - use_native_jdk_alpn_processor: - type: string - default: "-PuseNativeJdkAlpnProcessor" run_tls_with_alpn_http_2_tests: type: string default: "yes" @@ -484,9 +390,6 @@ jobs: tls_13: type: string default: "yes" - use_native_jdk_alpn_processor: - type: string - default: "-PuseNativeJdkAlpnProcessor" run_tls_with_alpn_http_2_tests: type: string default: "yes" @@ -499,9 +402,6 @@ jobs: tls_13: type: string default: "yes" - use_native_jdk_alpn_processor: - type: string - default: "-PuseNativeJdkAlpnProcessor" run_tls_with_alpn_http_2_tests: type: string default: "yes" @@ -514,9 +414,6 @@ jobs: tls_13: type: string default: "yes" - use_native_jdk_alpn_processor: - type: string - default: "-PuseNativeJdkAlpnProcessor" run_tls_with_alpn_http_2_tests: type: string default: "yes" @@ -524,51 +421,21 @@ jobs: <<: *smoke_test_steps - gradle_7_2_0_jdk8: - parameters: - use_native_jdk_alpn_processor: - type: string - default: "" - <<: *gradle_7_2_0_jdk8_environment + gradle_7_2_0_jdk11: + <<: *gradle_7_2_0_jdk11_environment <<: *default_steps - gradle_7_2_0_jdk8_code_coverage: - parameters: - use_native_jdk_alpn_processor: - type: string - default: "" - <<: *circleci_pre_built_openjdk_8_environment + gradle_7_2_0_jdk11_code_coverage: + <<: *circleci_pre_built_openjdk_11_environment <<: *code_coverage_steps - gradle_7_2_0_jdk11: - parameters: - use_native_jdk_alpn_processor: - type: string - default: "-PuseNativeJdkAlpnProcessor" - <<: *gradle_7_2_0_jdk11_environment - <<: *default_steps - - gradle_7_2_0_jdk16: - parameters: - use_native_jdk_alpn_processor: - type: string - default: "-PuseNativeJdkAlpnProcessor" <<: *gradle_7_2_0_jdk16_environment <<: *default_steps - docker_build_latest_jre8: - parameters: - jdk_version: - type: string - default: "8" - <<: *docker_in_docker_environment - <<: *build_push_image_steps - - docker_build_latest_jre11: parameters: jdk_version: @@ -594,29 +461,20 @@ jobs: version: 2.1 workflows: - master-jdk8-code-coverage: + master-jdk11-code-coverage: jobs: - - gradle_7_2_0_jdk8_code_coverage: + - gradle_7_2_0_jdk11_code_coverage: <<: *context_sonatype <<: *filter_only_master - master-jdk8-publish-snapshot: + master-jdk11-publish-snapshot: jobs: - - gradle_7_2_0_jdk8: + - gradle_7_2_0_jdk11: <<: *context_sonatype <<: *filter_only_master - branch-smoke-test: jobs: - - smoke_openjdk_openjdk_8u092: - <<: *filter_ignore_master - - smoke_openjdk_openjdk_8u111: - <<: *filter_ignore_master - - smoke_azul_zulu_openjdk_8u232: - <<: *filter_ignore_master - - smoke_adoptopenjdk_openjdk_8u312_b07: - <<: *filter_ignore_master - smoke_adoptopenjdk_openjdk_11_openj9: <<: *filter_ignore_master - smoke_azul_zulu_openjdk_15: @@ -628,14 +486,6 @@ workflows: master-smoke-test: jobs: - - smoke_openjdk_openjdk_8u092: - <<: *filter_only_master - - smoke_openjdk_openjdk_8u111: - <<: *filter_only_master - - smoke_azul_zulu_openjdk_8u232: - <<: *filter_only_master - - smoke_adoptopenjdk_openjdk_8u312_b07: - <<: *filter_only_master - smoke_adoptopenjdk_openjdk_11_openj9: <<: *filter_only_master - smoke_azul_zulu_openjdk_15: @@ -645,20 +495,15 @@ workflows: - smoke_openjdk_openjdk_17: <<: *filter_only_master - branch-jdk8: - jobs: - - gradle_7_2_0_jdk8: - <<: *filter_ignore_master - - gradle_7_2_0_jdk8_code_coverage: - <<: *filter_ignore_master - requires: - - gradle_7_2_0_jdk8 - branch-jdk11: jobs: - gradle_7_2_0_jdk11: <<: *filter_ignore_master + - gradle_7_2_0_jdk11_code_coverage: + <<: *filter_ignore_master + requires: + - gradle_7_2_0_jdk11 branch-jdk16: @@ -673,30 +518,12 @@ workflows: cron: "5 7,19 * * *" <<: *filter_only_master jobs: - - smoke_openjdk_openjdk_8u092 - - smoke_openjdk_openjdk_8u111 - - smoke_azul_zulu_openjdk_8u232 - - smoke_adoptopenjdk_openjdk_8u312_b07 - smoke_adoptopenjdk_openjdk_11_openj9 - smoke_azul_zulu_openjdk_15 - smoke_adoptopenjdk_openjdk_16_openj9 - smoke_openjdk_openjdk_17 - master-twelve-hour-jdk8: - triggers: - - schedule: - cron: "10 7,19 * * *" - <<: *filter_only_master - jobs: - - gradle_7_2_0_jdk8: - <<: *context_sonatype - - docker_build_latest_jre8: - <<: *context_docker_hub - requires: - - gradle_7_2_0_jdk8 - - master-twelve-hour-jdk11: triggers: - schedule: diff --git a/build.gradle b/build.gradle index 4309cf185..9a5a7227a 100644 --- a/build.gradle +++ b/build.gradle @@ -26,6 +26,11 @@ apply plugin: "org.unbroken-dome.test-sets" defaultTasks 'clean', 'test', 'integrationTest', 'functionalTest', 'build' description = 'Gradle configuration for stubby4j' +java { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 +} + compileJava { options.encoding = 'UTF-8' options.compilerArgs << '-parameters' << '-Xlint:deprecation' @@ -35,12 +40,6 @@ compileTestJava { options.encoding = 'UTF-8' } -javadoc { - if (JavaVersion.current().isJava8Compatible()) { - options.addStringOption('Xdoclint:none', '-quiet') - } -} - repositories { mavenLocal() mavenCentral() diff --git a/conf/gradle/dependencies.gradle b/conf/gradle/dependencies.gradle index 62d12e1fd..d0187464b 100644 --- a/conf/gradle/dependencies.gradle +++ b/conf/gradle/dependencies.gradle @@ -1,15 +1,10 @@ dependencies { - if (project.hasProperty("useNativeJdkAlpnProcessor")) { - println "> Building with native JDK ALPN processor in default dependencies" - api "org.eclipse.jetty:jetty-alpn-java-server:${jettyVersion}" - } else { - println "> Building with Jetty JDK ALPN OpenJDK 1.8 processor in default dependencies" - api "org.eclipse.jetty:jetty-alpn-openjdk8-server:${jettyVersion}" - } + println "> Building with native JDK ALPN processor in default dependencies" + api "org.eclipse.jetty:jetty-alpn-java-server:${jettyVersion}" - api "org.eclipse.jetty.websocket:websocket-api:${jettyVersion}" - api "org.eclipse.jetty.websocket:websocket-server:${jettyVersion}" - api "org.eclipse.jetty.websocket:websocket-client:${jettyVersion}" + api "org.eclipse.jetty.websocket:websocket-jetty-api:${jettyVersion}" + api "org.eclipse.jetty.websocket:websocket-jetty-server:${jettyVersion}" + api "org.eclipse.jetty.websocket:websocket-jetty-client:${jettyVersion}" // https://github.com/eclipse/jetty.project/issues/1894 // https://github.com/eclipse/jetty.project/issues/2950 @@ -26,29 +21,23 @@ dependencies { if (project.hasProperty("log4j")) { var becauseMsg = "CVE-2021-44228, CVE-2021-45046, CVE-2021-45105, CVE-2021-44832: Log4j vulnerable to remote code execution and other critical security vulnerabilities" println "> Building with log4j included in default dependencies" - api "org.apache.logging.log4j:log4j-slf4j-impl:${log4j2Version}" - - constraints { - api("org.apache.logging.log4j:log4j-api") { - version { - strictly("${log4j2Version}") - prefer("2.17.1") - } - because(becauseMsg) - } - - api("org.apache.logging.log4j:log4j-core") { - version { - strictly("${log4j2Version}") - prefer("2.17.1") - } - because(becauseMsg) + // https://issues.apache.org/jira/browse/LOG4J2-3139 + api ("org.slf4j:slf4j-api") { + version { + strictly '1.8.0-beta4' } } + api "org.apache.logging.log4j:log4j-slf4j18-impl:${log4j2Version}" + api "org.apache.logging.log4j:log4j-core:${log4j2Version}" + api "org.apache.logging.log4j:log4j-api:${log4j2Version}" } else { println "> Building with default dependencies" - api "org.slf4j:slf4j-api:1.7.30" + api ("org.slf4j:slf4j-api") { + version { + strictly '1.8.0-beta4' + } + } } testImplementation "junit:junit:4.13.1" @@ -58,12 +47,7 @@ dependencies { testImplementation "com.google.truth:truth:1.1.2" testImplementation "org.eclipse.jetty.http2:http2-client:${jettyVersion}" testImplementation "org.eclipse.jetty.http2:http2-http-client-transport:${jettyVersion}" - - if (project.hasProperty("useNativeJdkAlpnProcessor")) { - testImplementation "org.eclipse.jetty:jetty-alpn-java-client:${jettyVersion}" - } else { - testImplementation "org.eclipse.jetty:jetty-alpn-openjdk8-client:${jettyVersion}" - } + testImplementation "org.eclipse.jetty:jetty-alpn-java-client:${jettyVersion}" // https://github.com/googleapis/google-http-java-client/issues/167#issuecomment-571987053 testImplementation "com.google.http-client:google-http-client-apache-v2:1.38.1" diff --git a/docker/jdk11/Dockerfile b/docker/jdk11/Dockerfile index 2a7f24886..62a013df7 100644 --- a/docker/jdk11/Dockerfile +++ b/docker/jdk11/Dockerfile @@ -21,7 +21,7 @@ RUN git clone https://github.com/azagniotov/stubby4j.git && \ cd stubby4j && \ git fetch -f --tags && \ git checkout $REVISION && \ - gradle -Plog4j -PuseNativeJdkAlpnProcessor clean jar + gradle -Plog4j clean jar ######################################################################################## # Stage 2 : create the Docker final image diff --git a/docker/jdk16/Dockerfile b/docker/jdk16/Dockerfile index 1d17ac121..1751e6a2d 100644 --- a/docker/jdk16/Dockerfile +++ b/docker/jdk16/Dockerfile @@ -21,7 +21,7 @@ RUN git clone https://github.com/azagniotov/stubby4j.git && \ cd stubby4j && \ git fetch -f --tags && \ git checkout $REVISION && \ - gradle -Plog4j -PuseNativeJdkAlpnProcessor clean jar + gradle -Plog4j clean jar ######################################################################################## # Stage 2 : create the Docker final image diff --git a/docker/jdk8/Dockerfile b/docker/jdk8/Dockerfile deleted file mode 100644 index e465fdd22..000000000 --- a/docker/jdk8/Dockerfile +++ /dev/null @@ -1,88 +0,0 @@ -# A few useful Docker commands to build an image and run the stubby4j container. -# -# Build (run with '--no-cache' to ensure that Git repo new tags will be pulled down, as Docker caches RUNs): -# '$ docker build --build-arg REVISION=v7.2.0 --rm --no-cache -t stubby4j:latest .' or -# '$ docker build --rm --no-cache -t stubby4j:latest .' to build from master -# -# Run: -# https://hub.docker.com/r/azagniotov/stubby4j ("How to use this image") - -######################################################################################## -# Stage 1 : build the app -######################################################################################## -FROM gradle:7.2.0-jdk8-openj9@sha256:d4128edf5ac579f93e3149a9f89be3af779de1d3d85a9f25f25cb3d4b432b69a AS BUILD_JAR_STAGE - -ARG REVISION=master -ENV GRADLE_USER_HOME=/home/gradle -WORKDIR $GRADLE_USER_HOME - -# Build from the latest tag -RUN git clone https://github.com/azagniotov/stubby4j.git && \ - cd stubby4j && \ - git fetch -f --tags && \ - git checkout $REVISION && \ - gradle -Plog4j clean jar - -######################################################################################## -# Stage 2 : create the Docker final image -######################################################################################## -# https://hub.docker.com/r/azul/zulu-openjdk-alpine -FROM azul/zulu-openjdk-alpine:8u282-8.52.0.23-jre-headless@sha256:91fe8ae651d5c778312e946e89f934240c2a80f55b7ca894d76daef8f5281375 - -ARG USER_ID=1001 -ARG GROUP_ID=1001 - -MAINTAINER Alexander Zagniotov - -# Why --location=0.0.0.0 ??? Read: https://stackoverflow.com/a/59182290 -ENV LOCATION=0.0.0.0 \ - STUBS_PORT=8882 \ - STUBS_TLS_PORT=7443 \ - ADMIN_PORT=8889 \ - WITH_ARGS="" \ - YAML_CONFIG="main.yaml" \ - STUBBY4J_USER_HOME=/home/stubby4j - -# Users & permissions, docs: https://wiki.alpinelinux.org/wiki/Setting_up_a_new_user -RUN addgroup --system --gid $GROUP_ID stubby4j && \ - adduser \ - --system \ - --disabled-password \ - --gecos '' \ - --uid $USER_ID stubby4j \ - --shell /bin/bash \ - --home "$STUBBY4J_USER_HOME" && \ - chown --recursive stubby4j:stubby4j "$STUBBY4J_USER_HOME" - -WORKDIR "$STUBBY4J_USER_HOME" - -COPY --from=BUILD_JAR_STAGE /home/gradle/stubby4j/build/libs/stubby4j*SNAPSHOT.jar ./stubby4j.jar -COPY --from=BUILD_JAR_STAGE /home/gradle/stubby4j/docker/log4j2-for-docker.xml ./log4j2.xml -RUN chown $USER_ID:$GROUP_ID stubby4j.jar && \ - chown $USER_ID:$GROUP_ID log4j2.xml && \ - java -version && \ - ls -al - -# Set the UID and GID of 'stubby4j' for the ENTRYPOINT instructions, -# because root inside the container == root outside the container, -# since there’s a single kernel and a single, shared pool of UIDs and GIDs. -USER $USER_ID:$GROUP_ID - -# Mark the 'data' directory as volume -VOLUME "$STUBBY4J_USER_HOME/data" - -# Expose the three stubby4j ports and run the JAR -EXPOSE $ADMIN_PORT $STUBS_PORT $STUBS_TLS_PORT - -# https://www.docker.com/blog/apache-log4j-2-cve-2021-44228/ -ENTRYPOINT java \ - -DoverrideDisabledAlgorithms=true \ - -Dlog4j2.configurationFile=log4j2.xml \ - -jar stubby4j.jar \ - --location ${LOCATION} \ - --admin ${ADMIN_PORT} \ - --stubs ${STUBS_PORT} \ - --tls ${STUBS_TLS_PORT} \ - --data data/${YAML_CONFIG} \ - --mute \ - ${WITH_ARGS} diff --git a/docker/log4j2-for-docker.xml b/docker/log4j2-for-docker.xml index 529a4753b..9c5ef9f55 100644 --- a/docker/log4j2-for-docker.xml +++ b/docker/log4j2-for-docker.xml @@ -36,6 +36,10 @@ + + + + diff --git a/docs/DOCKERHUB.md b/docs/DOCKERHUB.md index 8e6777115..c61cfd31d 100644 --- a/docs/DOCKERHUB.md +++ b/docs/DOCKERHUB.md @@ -35,17 +35,19 @@ The following `stubby4j` Docker images are available ([Alpine-Native Zulu OpenJD See [https://github.com/azagniotov/stubby4j/blob/master/CHANGELOG.md](https://github.com/azagniotov/stubby4j/blob/master/CHANGELOG.md) for more information -#### stubby4j versions on Alpine-Native Zulu OpenJDK JRE 8 -* [`7.5.1-jre8`](https://github.com/azagniotov/stubby4j/blob/v7.5.1/docker/jdk8/Dockerfile) -* [`latest-jre8`](https://github.com/azagniotov/stubby4j/blob/master/docker/jdk8/Dockerfile) +#### stubby4j versions on Alpine-Native Zulu OpenJDK JRE 16 +* [`latest-jre16`](https://github.com/azagniotov/stubby4j/blob/master/docker/jdk16/Dockerfile) +* [`11.0.0-jre16`](https://github.com/azagniotov/stubby4j/blob/v11.0.0/docker/jdk16/Dockerfile) +* [`7.5.1-jre16`](https://github.com/azagniotov/stubby4j/blob/v7.5.1/docker/jdk16/Dockerfile) #### stubby4j versions on Alpine-Native Zulu OpenJDK JRE 11 -* [`7.5.1-jre11`](https://github.com/azagniotov/stubby4j/blob/v7.5.1/docker/jdk11/Dockerfile) * [`latest-jre11`](https://github.com/azagniotov/stubby4j/blob/master/docker/jdk11/Dockerfile) +* [`11.0.0-jre11`](https://github.com/azagniotov/stubby4j/blob/v11.0.0/docker/jdk11/Dockerfile) +* [`7.5.1-jre11`](https://github.com/azagniotov/stubby4j/blob/v7.5.1/docker/jdk11/Dockerfile) + +#### stubby4j versions on Alpine-Native Zulu OpenJDK JRE 8 +* [`7.5.1-jre8`](https://github.com/azagniotov/stubby4j/blob/v7.5.1/docker/jdk8/Dockerfile) -#### stubby4j versions on Alpine-Native Zulu OpenJDK JRE 16 -* [`7.5.1-jre16`](https://github.com/azagniotov/stubby4j/blob/v7.5.1/docker/jdk16/Dockerfile) -* [`latest-jre16`](https://github.com/azagniotov/stubby4j/blob/master/docker/jdk16/Dockerfile) # What is `stubby4j`? @@ -109,7 +111,7 @@ $ docker run --rm \ --env YAML_CONFIG=stubs.yaml \ --volume /Users/zaggy/docker-playground/yaml:/home/stubby4j/data \ -p 8882:8882 -p 8889:8889 -p 7443:7443 \ - azagniotov/stubby4j:7.5.1-jre8 + azagniotov/stubby4j:11.0.0-jre11 ``` ### Full command @@ -125,7 +127,7 @@ docker run --rm \ --env WITH_ARGS="--enable_tls_with_alpn_and_http_2 --disable_stub_caching --debug --watch" \ --volume /Users/zaggy/docker-playground/yaml:/home/stubby4j/data \ -p 9991:9991 -p 8889:8889 -p 8443:8443 \ - azagniotov/stubby4j:7.5.1-jre8 + azagniotov/stubby4j:11.0.0-jre11 ``` ... where the command: @@ -138,7 +140,7 @@ docker run --rm \ * Passes `--debug` to `WITH_ARGS` env var to make `stubby4j` to dump raw incoming HTTP requests to the console. If the `--debug` is not set, then the dumping incoming HTTP requests is disabled by default. * Passes `--watch` to `WITH_ARGS` env var to make `stubby4j` to periodically scan for changes in last modification date of the YAML configs and referenced external files (if any). The watch scans every 100ms. If last modification date changed since the last scan period, the stub configuration is reloaded. If the `--watch` is not set, then the periodic scan is disabled by default. * `-p` publishes/exposes set container's ports `9991`, `8889` & `8443` for stubs, admin & stubs on SSL portals respectively to the host. -* `latest-jre8` is the tag specifying the `stubby4j` version. See the list above for relevant tags +* `11.0.0-jre11` is the tag specifying the `stubby4j` version. See the list above for relevant tags ## Running in Docker Compose @@ -150,7 +152,7 @@ You can add `stubby4j` image to your stack using Docker Compose: version: '3.8' services: stubby4j: - image: azagniotov/stubby4j:latest-jre8 # you can also use other tags: latest-jre11, latest-jre15 + image: azagniotov/stubby4j:11.0.0-jre11 # you can also use other tags: latest-jre11, latest-jre15 volumes: - ":/home/stubby4j/data" container_name: stubby4j @@ -171,7 +173,7 @@ See smoke test [https://github.com/azagniotov/stubby4j/docker/smoke-test/docker- ## Container application logs -Currently, only in the Docker images tagged as `latest-jreXX` and `7.3.3-jreXX` and higher (i.e.: `7.5.1-jreXX`), the `stubby4j` service emits file-based logs (i.e.: generated by `log4j2` library) as well as `STDOUT` output stream logs. In images tagged as <= `7.3.2-jreXX`, only `STDOUT` output stream logs are available. +Currently, only in the Docker images tagged as `latest-jreXX` and `7.3.3-jreXX` and higher (i.e.: `11.0.0-jreXX`), the `stubby4j` service emits file-based logs (i.e.: generated by `log4j2` library) as well as `STDOUT` output stream logs. In images tagged as <= `7.3.2-jreXX`, only `STDOUT` output stream logs are available. The file-based logs persisted in the container volume `/home/stubby4j/data` under `logs` directory, i.e.:`/home/stubby4j/data/logs` diff --git a/gradle.properties b/gradle.properties index eade068b4..5a638df3a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,10 +4,10 @@ org.gradle.vfs.watch=true log4j2Version=2.17.1 xmlUnitVersion=2.8.4 -jettyVersion=9.4.44.v20210927 +jettyVersion=11.0.7 snakeYamlVersion=1.29 mockitoVersion=3.12.4 stubbyProjectName=stubby4j stubbyProjectGroup=io.github.azagniotov -stubbyProjectVersion=7.5.2-SNAPSHOT +stubbyProjectVersion=11.0.1-SNAPSHOT diff --git a/src/functional-test/java/io/github/azagniotov/stubby4j/HttpClientUtils.java b/src/functional-test/java/io/github/azagniotov/stubby4j/HttpClientUtils.java index 927137f64..bc415c615 100644 --- a/src/functional-test/java/io/github/azagniotov/stubby4j/HttpClientUtils.java +++ b/src/functional-test/java/io/github/azagniotov/stubby4j/HttpClientUtils.java @@ -9,8 +9,10 @@ import org.apache.http.impl.conn.SystemDefaultRoutePlanner; import org.apache.http.ssl.SSLContexts; import org.eclipse.jetty.client.HttpClient; +import org.eclipse.jetty.client.http.HttpClientTransportOverHTTP; import org.eclipse.jetty.http2.client.HTTP2Client; import org.eclipse.jetty.http2.client.http.HttpClientTransportOverHTTP2; +import org.eclipse.jetty.io.ClientConnector; import org.eclipse.jetty.util.ssl.SslContextFactory; import javax.net.ssl.SSLContext; @@ -97,8 +99,8 @@ static SSLContext buildSSLContextWithRemoteCertificateLoaded(final String tlsVer .build(); } - static SslContextFactory jettyClientSslContextFactory(final String tlsProtocol) { - final SslContextFactory sslContextFactory = new SslContextFactory.Client(); + static SslContextFactory.Client jettyClientSslContextFactory(final String tlsProtocol) { + final SslContextFactory.Client sslContextFactory = new SslContextFactory.Client(); sslContextFactory.setEndpointIdentificationAlgorithm("HTTPS"); sslContextFactory.setProtocol(tlsProtocol); @@ -112,7 +114,12 @@ static HttpClient jettyHttpClientOnHttp11() { } static HttpClient jettyHttpClientOnHttp11WithClientSsl(final String tlsProtocol) { - return new HttpClient(jettyClientSslContextFactory(tlsProtocol)); + + final ClientConnector clientConnector = new ClientConnector(); + clientConnector.setSslContextFactory(jettyClientSslContextFactory(tlsProtocol)); + final HttpClientTransportOverHTTP httpClientTransportOverHTTP = new HttpClientTransportOverHTTP(clientConnector); + + return new HttpClient(httpClientTransportOverHTTP); } static HttpClient jettyHttpClientOnHttp20() { @@ -127,15 +134,15 @@ static HttpClient jettyHttpClientOnHttp20() { } static HttpClient jettyHttpClientOnHttp20WithClientSsl(final String tlsProtocol) { - final SslContextFactory sslContextFactory = jettyClientSslContextFactory(tlsProtocol); + final ClientConnector clientConnector = new ClientConnector(); + clientConnector.setSslContextFactory(jettyClientSslContextFactory(tlsProtocol)); - final HTTP2Client http2Client = new HTTP2Client(); - http2Client.addBean(sslContextFactory); + final HTTP2Client http2Client = new HTTP2Client(clientConnector); final HttpClientTransportOverHTTP2 transport = new HttpClientTransportOverHTTP2(http2Client); transport.setUseALPN(true); - final HttpClient httpClient = new HttpClient(transport, sslContextFactory); + final HttpClient httpClient = new HttpClient(transport); httpClient.setMaxConnectionsPerDestination(4); return httpClient; diff --git a/src/functional-test/java/io/github/azagniotov/stubby4j/StubsPortalHttp11WebSocketOverTlsTests.java b/src/functional-test/java/io/github/azagniotov/stubby4j/StubsPortalHttp11WebSocketOverTlsTests.java index 6add3f2e9..299637e4c 100644 --- a/src/functional-test/java/io/github/azagniotov/stubby4j/StubsPortalHttp11WebSocketOverTlsTests.java +++ b/src/functional-test/java/io/github/azagniotov/stubby4j/StubsPortalHttp11WebSocketOverTlsTests.java @@ -5,9 +5,11 @@ import io.github.azagniotov.stubby4j.client.StubbyClient; import io.github.azagniotov.stubby4j.client.StubbyResponse; import io.github.azagniotov.stubby4j.server.JettyFactory; +import io.github.azagniotov.stubby4j.utils.ByteUtils; import io.github.azagniotov.stubby4j.utils.FileUtils; import io.github.azagniotov.stubby4j.utils.StringUtils; import org.eclipse.jetty.http.HttpStatus; +import org.eclipse.jetty.websocket.api.Frame; import org.eclipse.jetty.websocket.api.Session; import org.eclipse.jetty.websocket.api.StatusCode; import org.eclipse.jetty.websocket.api.WebSocketBehavior; @@ -17,11 +19,9 @@ import org.eclipse.jetty.websocket.api.annotations.OnWebSocketFrame; import org.eclipse.jetty.websocket.api.annotations.OnWebSocketMessage; import org.eclipse.jetty.websocket.api.annotations.WebSocket; -import org.eclipse.jetty.websocket.api.extensions.Frame; import org.eclipse.jetty.websocket.client.ClientUpgradeRequest; import org.eclipse.jetty.websocket.client.WebSocketClient; -import org.eclipse.jetty.websocket.common.frames.PingFrame; -import org.eclipse.jetty.websocket.common.frames.PongFrame; +import org.eclipse.jetty.websocket.core.OpCode; import org.junit.After; import org.junit.AfterClass; import org.junit.Before; @@ -132,9 +132,7 @@ public void webSocketSessionShouldHaveValidState() throws Exception { final StubsClientWebSocket socket = new StubsClientWebSocket(1); final ClientUpgradeRequest clientUpgradeRequest = new ClientUpgradeRequest(); - clientUpgradeRequest.setRequestURI(REQUEST_URL_HELLO_1); - clientUpgradeRequest.setLocalEndpoint(socket); - clientUpgradeRequest.setSubProtocols("echo", "mamba"); + clientUpgradeRequest.setSubProtocols("echo"); final Future sessionFuture = client.connect(socket, REQUEST_URL_HELLO_1, clientUpgradeRequest); final Session session = sessionFuture.get(500, TimeUnit.MILLISECONDS); @@ -144,7 +142,7 @@ public void webSocketSessionShouldHaveValidState() throws Exception { assertThat(session.isSecure()).isTrue(); assertThat(session.getPolicy().getBehavior()).isEqualTo(WebSocketBehavior.CLIENT); - assertThat(session.getUpgradeResponse().getAcceptedSubProtocol()).isEqualTo("mamba,echo"); + assertThat(session.getUpgradeResponse().getAcceptedSubProtocol()).isEqualTo("echo"); } @Test @@ -153,9 +151,7 @@ public void serverOnOpen_SendsExpected_TextMessage() throws Exception { final StubsClientWebSocket socket = new StubsClientWebSocket(1); final ClientUpgradeRequest clientUpgradeRequest = new ClientUpgradeRequest(); - clientUpgradeRequest.setRequestURI(REQUEST_URL_HELLO_1); - clientUpgradeRequest.setLocalEndpoint(socket); - clientUpgradeRequest.setSubProtocols("echo", "mamba"); + clientUpgradeRequest.setSubProtocols("echo"); final Future sessionFuture = client.connect(socket, REQUEST_URL_HELLO_1, clientUpgradeRequest); sessionFuture.get(500, TimeUnit.MILLISECONDS); @@ -172,9 +168,7 @@ public void serverOnOpen_SendsExpected_BinaryMessage() throws Exception { final StubsClientWebSocket socket = new StubsClientWebSocket(1); final ClientUpgradeRequest clientUpgradeRequest = new ClientUpgradeRequest(); - clientUpgradeRequest.setRequestURI(REQUEST_URL_HELLO_7); - clientUpgradeRequest.setLocalEndpoint(socket); - clientUpgradeRequest.setSubProtocols("echo", "mamba"); + clientUpgradeRequest.setSubProtocols("echo"); final Future sessionFuture = client.connect(socket, REQUEST_URL_HELLO_7, clientUpgradeRequest); sessionFuture.get(500, TimeUnit.MILLISECONDS); @@ -194,9 +188,7 @@ public void serverOnOpen_SendsExpected_BinaryMessageFromFile() throws Exception final StubsClientWebSocket socket = new StubsClientWebSocket(1); final ClientUpgradeRequest clientUpgradeRequest = new ClientUpgradeRequest(); - clientUpgradeRequest.setRequestURI(REQUEST_URL_HELLO_3); - clientUpgradeRequest.setLocalEndpoint(socket); - clientUpgradeRequest.setSubProtocols("echo", "mamba"); + clientUpgradeRequest.setSubProtocols("echo"); final Future sessionFuture = client.connect(socket, REQUEST_URL_HELLO_3, clientUpgradeRequest); sessionFuture.get(500, TimeUnit.MILLISECONDS); @@ -218,9 +210,7 @@ public void serverOnOpen_RespondsWithExpected_ContinuousPing() throws Exception final StubsClientWebSocket socket = new StubsClientWebSocket(5); final ClientUpgradeRequest clientUpgradeRequest = new ClientUpgradeRequest(); - clientUpgradeRequest.setRequestURI(REQUEST_URL_HELLO_6); - clientUpgradeRequest.setLocalEndpoint(socket); - clientUpgradeRequest.setSubProtocols("echo", "mamba"); + clientUpgradeRequest.setSubProtocols("echo"); final Future sessionFuture = client.connect(socket, REQUEST_URL_HELLO_6, clientUpgradeRequest); sessionFuture.get(500, TimeUnit.MILLISECONDS); @@ -242,9 +232,7 @@ public void serverOnMessage_ReactsToClient_RealBinaryMessage_AndRespondsWithExpe final StubsClientWebSocket socket = new StubsClientWebSocket(1); final ClientUpgradeRequest clientUpgradeRequest = new ClientUpgradeRequest(); - clientUpgradeRequest.setRequestURI(REQUEST_URL_HELLO_4); - clientUpgradeRequest.setLocalEndpoint(socket); - clientUpgradeRequest.setSubProtocols("echo", "mamba"); + clientUpgradeRequest.setSubProtocols("echo"); final Future sessionFuture = client.connect(socket, REQUEST_URL_HELLO_4, clientUpgradeRequest); final Session session = sessionFuture.get(500, TimeUnit.MILLISECONDS); @@ -270,9 +258,7 @@ public void serverOnMessage_ReactsToClient_TextBinaryMessage_AndRespondsWithExpe final StubsClientWebSocket socket = new StubsClientWebSocket(1); final ClientUpgradeRequest clientUpgradeRequest = new ClientUpgradeRequest(); - clientUpgradeRequest.setRequestURI(REQUEST_URL_HELLO_4); - clientUpgradeRequest.setLocalEndpoint(socket); - clientUpgradeRequest.setSubProtocols("echo", "mamba"); + clientUpgradeRequest.setSubProtocols("echo"); final Future sessionFuture = client.connect(socket, REQUEST_URL_HELLO_4, clientUpgradeRequest); final Session session = sessionFuture.get(500, TimeUnit.MILLISECONDS); @@ -298,9 +284,7 @@ public void serverOnMessage_RespondsWithExpected_TextMessage_OnceOnly() throws E final StubsClientWebSocket socket = new StubsClientWebSocket(2); final ClientUpgradeRequest clientUpgradeRequest = new ClientUpgradeRequest(); - clientUpgradeRequest.setRequestURI(REQUEST_URL_HELLO_1); - clientUpgradeRequest.setLocalEndpoint(socket); - clientUpgradeRequest.setSubProtocols("echo", "mamba"); + clientUpgradeRequest.setSubProtocols("echo"); final Future sessionFuture = client.connect(socket, REQUEST_URL_HELLO_1, clientUpgradeRequest); final Session session = sessionFuture.get(500, TimeUnit.MILLISECONDS); @@ -319,9 +303,7 @@ public void serverOnMessage_RespondsWithExpected_TextMessage_ContinuousPush() th final StubsClientWebSocket socket = new StubsClientWebSocket(5); final ClientUpgradeRequest clientUpgradeRequest = new ClientUpgradeRequest(); - clientUpgradeRequest.setRequestURI(REQUEST_URL_HELLO_1); - clientUpgradeRequest.setLocalEndpoint(socket); - clientUpgradeRequest.setSubProtocols("echo", "mamba"); + clientUpgradeRequest.setSubProtocols("echo"); final Future sessionFuture = client.connect(socket, REQUEST_URL_HELLO_1, clientUpgradeRequest); final Session session = sessionFuture.get(500, TimeUnit.MILLISECONDS); @@ -345,9 +327,7 @@ public void serverOnMessage_RespondsWithExpected_BinaryMessage_OnceOnly() throws final StubsClientWebSocket socket = new StubsClientWebSocket(2); final ClientUpgradeRequest clientUpgradeRequest = new ClientUpgradeRequest(); - clientUpgradeRequest.setRequestURI(REQUEST_URL_HELLO_2); - clientUpgradeRequest.setLocalEndpoint(socket); - clientUpgradeRequest.setSubProtocols("echo", "mamba"); + clientUpgradeRequest.setSubProtocols("echo"); final Future sessionFuture = client.connect(socket, REQUEST_URL_HELLO_2, clientUpgradeRequest); final Session session = sessionFuture.get(500, TimeUnit.MILLISECONDS); @@ -374,9 +354,7 @@ public void serverOnMessage_RespondsWithExpected_BinaryMessage_ContinuousPush() final StubsClientWebSocket socket = new StubsClientWebSocket(5); final ClientUpgradeRequest clientUpgradeRequest = new ClientUpgradeRequest(); - clientUpgradeRequest.setRequestURI(REQUEST_URL_HELLO_2); - clientUpgradeRequest.setLocalEndpoint(socket); - clientUpgradeRequest.setSubProtocols("echo", "mamba"); + clientUpgradeRequest.setSubProtocols("echo"); final Future sessionFuture = client.connect(socket, REQUEST_URL_HELLO_2, clientUpgradeRequest); final Session session = sessionFuture.get(500, TimeUnit.MILLISECONDS); @@ -403,9 +381,7 @@ public void serverOnMessage_RespondsWithExpected_BinaryMessage_ContinuousPush() public void serverOnMessage_RespondsWithExpected_TextMessage_OnceOnly_And_Disconnects() throws Exception { final StubsClientWebSocket socket = new StubsClientWebSocket(3); final ClientUpgradeRequest clientUpgradeRequest = new ClientUpgradeRequest(); - clientUpgradeRequest.setRequestURI(REQUEST_URL_HELLO_1); - clientUpgradeRequest.setLocalEndpoint(socket); - clientUpgradeRequest.setSubProtocols("echo", "mamba"); + clientUpgradeRequest.setSubProtocols("echo"); final Future sessionFuture = client.connect(socket, REQUEST_URL_HELLO_1, clientUpgradeRequest); final Session session = sessionFuture.get(500, TimeUnit.MILLISECONDS); @@ -430,9 +406,7 @@ public void serverOnMessage_RespondsWithExpected_BinaryMessage_FragmentedFrames( final StubsClientWebSocket socket = new StubsClientWebSocket(1); final ClientUpgradeRequest clientUpgradeRequest = new ClientUpgradeRequest(); - clientUpgradeRequest.setRequestURI(REQUEST_URL_HELLO_5); - clientUpgradeRequest.setLocalEndpoint(socket); - clientUpgradeRequest.setSubProtocols("echo", "mamba"); + clientUpgradeRequest.setSubProtocols("echo"); final Future sessionFuture = client.connect(socket, REQUEST_URL_HELLO_5, clientUpgradeRequest); final Session session = sessionFuture.get(500, TimeUnit.MILLISECONDS); @@ -453,9 +427,7 @@ public void serverOnMessage_RespondsWithExpected_BinaryMessage_FragmentedFrames( public void serverShouldThrow_WhenConnectingClient_RequestedWrongUrl() throws Exception { final StubsClientWebSocket socket = new StubsClientWebSocket(1); final ClientUpgradeRequest clientUpgradeRequest = new ClientUpgradeRequest(); - clientUpgradeRequest.setRequestURI(NON_STUBBED_REQUEST_URL); - clientUpgradeRequest.setLocalEndpoint(socket); - clientUpgradeRequest.setSubProtocols("echo", "mamba"); + clientUpgradeRequest.setSubProtocols("echo"); final Future sessionFuture = client.connect(socket, NON_STUBBED_REQUEST_URL, clientUpgradeRequest); @@ -473,8 +445,6 @@ public void serverShouldThrow_WhenConnectingClient_RequestedWrongUrl() throws Ex public void serverWithSubProtocolsShouldThrow_WhenConnectingClient_RequestedWrongSubProtocol() throws Exception { final StubsClientWebSocket socket = new StubsClientWebSocket(1); final ClientUpgradeRequest clientUpgradeRequest = new ClientUpgradeRequest(); - clientUpgradeRequest.setRequestURI(REQUEST_URL_HELLO_1); - clientUpgradeRequest.setLocalEndpoint(socket); clientUpgradeRequest.setSubProtocols("non-existent-among-stubbed-ones"); final Future sessionFuture = client.connect(socket, REQUEST_URL_HELLO_1, clientUpgradeRequest); @@ -493,11 +463,9 @@ public void serverWithSubProtocolsShouldThrow_WhenConnectingClient_RequestedWron public void serverWithSubProtocolsShouldThrow_WhenConnectingClient_RequestedNoSubProtocol() throws Exception { final StubsClientWebSocket socket = new StubsClientWebSocket(1); final ClientUpgradeRequest clientUpgradeRequest = new ClientUpgradeRequest(); - clientUpgradeRequest.setRequestURI(REQUEST_URL_HELLO_1); - clientUpgradeRequest.setLocalEndpoint(socket); // Not calling the following - // clientUpgradeRequest.setSubProtocols("echo", "mamba"); + // clientUpgradeRequest.setSubProtocols("echo"); final Future sessionFuture = client.connect(socket, REQUEST_URL_HELLO_1, clientUpgradeRequest); @@ -520,9 +488,7 @@ public void webSocketProtocol_jettySanityCheck_jettyRespondsWithExpected_PongMes final StubsClientWebSocket socket = new StubsClientWebSocket(1); final ClientUpgradeRequest clientUpgradeRequest = new ClientUpgradeRequest(); - clientUpgradeRequest.setRequestURI(REQUEST_URL_HELLO_5); - clientUpgradeRequest.setLocalEndpoint(socket); - clientUpgradeRequest.setSubProtocols("echo", "mamba"); + clientUpgradeRequest.setSubProtocols("echo"); final Future sessionFuture = client.connect(socket, REQUEST_URL_HELLO_5, clientUpgradeRequest); final Session session = sessionFuture.get(500, TimeUnit.MILLISECONDS); @@ -550,9 +516,7 @@ public void webSocketProtocol_jettySanityCheck_jettyRespondsWithExpected_PongWit final StubsClientWebSocket socket = new StubsClientWebSocket(1); final ClientUpgradeRequest clientUpgradeRequest = new ClientUpgradeRequest(); - clientUpgradeRequest.setRequestURI(REQUEST_URL_HELLO_5); - clientUpgradeRequest.setLocalEndpoint(socket); - clientUpgradeRequest.setSubProtocols("echo", "mamba"); + clientUpgradeRequest.setSubProtocols("echo"); final Future sessionFuture = client.connect(socket, REQUEST_URL_HELLO_5, clientUpgradeRequest); final Session session = sessionFuture.get(500, TimeUnit.MILLISECONDS); @@ -581,9 +545,7 @@ public void webSocketProtocol_jettySanityCheck_jettyShouldDisconnect_WhenClientC final StubsClientWebSocket socket = new StubsClientWebSocket(1); final ClientUpgradeRequest clientUpgradeRequest = new ClientUpgradeRequest(); - clientUpgradeRequest.setRequestURI(REQUEST_URL_HELLO_5); - clientUpgradeRequest.setLocalEndpoint(socket); - clientUpgradeRequest.setSubProtocols("echo", "mamba"); + clientUpgradeRequest.setSubProtocols("echo"); final Future sessionFuture = client.connect(socket, REQUEST_URL_HELLO_5, clientUpgradeRequest); final Session session = sessionFuture.get(500, TimeUnit.MILLISECONDS); @@ -625,24 +587,9 @@ public void onWebSocketConnect(final Session session) { @OnWebSocketFrame public void onOnWebSocketFrame(final Frame frame) throws IOException { - if (frame instanceof PingFrame) { - final PingFrame pingFrame = (PingFrame) frame; - final ByteBuffer pingPayload = pingFrame.getPayload(); - receivedOnMessageBytes.add(pingPayload.array()); - countDownLatch.countDown(); - } - - if (frame instanceof PongFrame) { - final PongFrame pongFrame = (PongFrame) frame; - final ByteBuffer pongPayload = pongFrame.getPayload(); - - if (!pongPayload.hasArray()) { - byte[] to = new byte[pongPayload.remaining()]; - pongPayload.slice().get(to); - receivedOnMessageBytes.add(to); - } else { - receivedOnMessageBytes.add(pongPayload.array()); - } + if (frame.getOpCode() == OpCode.PING || frame.getOpCode() == OpCode.PONG) { + final byte[] bytes = ByteUtils.extractByteArrayFromByteBuffer(frame.getPayload()); + receivedOnMessageBytes.add(bytes); countDownLatch.countDown(); } } diff --git a/src/functional-test/java/io/github/azagniotov/stubby4j/StubsPortalHttp11WebSocketTests.java b/src/functional-test/java/io/github/azagniotov/stubby4j/StubsPortalHttp11WebSocketTests.java index 5f2b94c84..f38ea6203 100644 --- a/src/functional-test/java/io/github/azagniotov/stubby4j/StubsPortalHttp11WebSocketTests.java +++ b/src/functional-test/java/io/github/azagniotov/stubby4j/StubsPortalHttp11WebSocketTests.java @@ -4,9 +4,11 @@ import io.github.azagniotov.stubby4j.client.StubbyClient; import io.github.azagniotov.stubby4j.client.StubbyResponse; import io.github.azagniotov.stubby4j.server.JettyFactory; +import io.github.azagniotov.stubby4j.utils.ByteUtils; import io.github.azagniotov.stubby4j.utils.FileUtils; import io.github.azagniotov.stubby4j.utils.StringUtils; import org.eclipse.jetty.http.HttpStatus; +import org.eclipse.jetty.websocket.api.Frame; import org.eclipse.jetty.websocket.api.Session; import org.eclipse.jetty.websocket.api.WebSocketBehavior; import org.eclipse.jetty.websocket.api.annotations.OnWebSocketClose; @@ -15,11 +17,9 @@ import org.eclipse.jetty.websocket.api.annotations.OnWebSocketFrame; import org.eclipse.jetty.websocket.api.annotations.OnWebSocketMessage; import org.eclipse.jetty.websocket.api.annotations.WebSocket; -import org.eclipse.jetty.websocket.api.extensions.Frame; import org.eclipse.jetty.websocket.client.ClientUpgradeRequest; import org.eclipse.jetty.websocket.client.WebSocketClient; -import org.eclipse.jetty.websocket.common.frames.PingFrame; -import org.eclipse.jetty.websocket.common.frames.PongFrame; +import org.eclipse.jetty.websocket.core.OpCode; import org.junit.After; import org.junit.AfterClass; import org.junit.Before; @@ -129,9 +129,7 @@ public void webSocketSessionShouldHaveValidState() throws Exception { final StubsClientWebSocket socket = new StubsClientWebSocket(1); final ClientUpgradeRequest clientUpgradeRequest = new ClientUpgradeRequest(); - clientUpgradeRequest.setRequestURI(REQUEST_URL_HELLO_1); - clientUpgradeRequest.setLocalEndpoint(socket); - clientUpgradeRequest.setSubProtocols("echo", "mamba"); + clientUpgradeRequest.setSubProtocols("echo"); final Future sessionFuture = client.connect(socket, REQUEST_URL_HELLO_1, clientUpgradeRequest); final Session session = sessionFuture.get(500, TimeUnit.MILLISECONDS); @@ -141,7 +139,7 @@ public void webSocketSessionShouldHaveValidState() throws Exception { assertThat(session.isSecure()).isFalse(); assertThat(session.getPolicy().getBehavior()).isEqualTo(WebSocketBehavior.CLIENT); - assertThat(session.getUpgradeResponse().getAcceptedSubProtocol()).isEqualTo("mamba,echo"); + assertThat(session.getUpgradeResponse().getAcceptedSubProtocol()).isEqualTo("echo"); } @Test @@ -150,9 +148,7 @@ public void serverOnOpen_SendsExpected_TextMessage() throws Exception { final StubsClientWebSocket socket = new StubsClientWebSocket(1); final ClientUpgradeRequest clientUpgradeRequest = new ClientUpgradeRequest(); - clientUpgradeRequest.setRequestURI(REQUEST_URL_HELLO_1); - clientUpgradeRequest.setLocalEndpoint(socket); - clientUpgradeRequest.setSubProtocols("echo", "mamba"); + clientUpgradeRequest.setSubProtocols("echo"); final Future sessionFuture = client.connect(socket, REQUEST_URL_HELLO_1, clientUpgradeRequest); sessionFuture.get(500, TimeUnit.MILLISECONDS); @@ -169,9 +165,7 @@ public void serverOnOpen_SendsExpected_BinaryMessage() throws Exception { final StubsClientWebSocket socket = new StubsClientWebSocket(1); final ClientUpgradeRequest clientUpgradeRequest = new ClientUpgradeRequest(); - clientUpgradeRequest.setRequestURI(REQUEST_URL_HELLO_7); - clientUpgradeRequest.setLocalEndpoint(socket); - clientUpgradeRequest.setSubProtocols("echo", "mamba"); + clientUpgradeRequest.setSubProtocols("echo"); final Future sessionFuture = client.connect(socket, REQUEST_URL_HELLO_7, clientUpgradeRequest); sessionFuture.get(500, TimeUnit.MILLISECONDS); @@ -191,9 +185,7 @@ public void serverOnOpen_SendsExpected_BinaryMessageFromFile() throws Exception final StubsClientWebSocket socket = new StubsClientWebSocket(1); final ClientUpgradeRequest clientUpgradeRequest = new ClientUpgradeRequest(); - clientUpgradeRequest.setRequestURI(REQUEST_URL_HELLO_3); - clientUpgradeRequest.setLocalEndpoint(socket); - clientUpgradeRequest.setSubProtocols("echo", "mamba"); + clientUpgradeRequest.setSubProtocols("echo"); final Future sessionFuture = client.connect(socket, REQUEST_URL_HELLO_3, clientUpgradeRequest); sessionFuture.get(500, TimeUnit.MILLISECONDS); @@ -215,9 +207,7 @@ public void serverOnOpen_RespondsWithExpected_ContinuousPing() throws Exception final StubsClientWebSocket socket = new StubsClientWebSocket(5); final ClientUpgradeRequest clientUpgradeRequest = new ClientUpgradeRequest(); - clientUpgradeRequest.setRequestURI(REQUEST_URL_HELLO_6); - clientUpgradeRequest.setLocalEndpoint(socket); - clientUpgradeRequest.setSubProtocols("echo", "mamba"); + clientUpgradeRequest.setSubProtocols("echo"); final Future sessionFuture = client.connect(socket, REQUEST_URL_HELLO_6, clientUpgradeRequest); sessionFuture.get(500, TimeUnit.MILLISECONDS); @@ -239,9 +229,7 @@ public void serverOnMessage_ReactsToClient_RealBinaryMessage_AndRespondsWithExpe final StubsClientWebSocket socket = new StubsClientWebSocket(1); final ClientUpgradeRequest clientUpgradeRequest = new ClientUpgradeRequest(); - clientUpgradeRequest.setRequestURI(REQUEST_URL_HELLO_4); - clientUpgradeRequest.setLocalEndpoint(socket); - clientUpgradeRequest.setSubProtocols("echo", "mamba"); + clientUpgradeRequest.setSubProtocols("echo"); final Future sessionFuture = client.connect(socket, REQUEST_URL_HELLO_4, clientUpgradeRequest); final Session session = sessionFuture.get(500, TimeUnit.MILLISECONDS); @@ -267,9 +255,7 @@ public void serverOnMessage_ReactsToClient_TextBinaryMessage_AndRespondsWithExpe final StubsClientWebSocket socket = new StubsClientWebSocket(1); final ClientUpgradeRequest clientUpgradeRequest = new ClientUpgradeRequest(); - clientUpgradeRequest.setRequestURI(REQUEST_URL_HELLO_4); - clientUpgradeRequest.setLocalEndpoint(socket); - clientUpgradeRequest.setSubProtocols("echo", "mamba"); + clientUpgradeRequest.setSubProtocols("echo"); final Future sessionFuture = client.connect(socket, REQUEST_URL_HELLO_4, clientUpgradeRequest); final Session session = sessionFuture.get(500, TimeUnit.MILLISECONDS); @@ -295,9 +281,7 @@ public void serverOnMessage_RespondsWithExpected_TextMessage_OnceOnly() throws E final StubsClientWebSocket socket = new StubsClientWebSocket(2); final ClientUpgradeRequest clientUpgradeRequest = new ClientUpgradeRequest(); - clientUpgradeRequest.setRequestURI(REQUEST_URL_HELLO_1); - clientUpgradeRequest.setLocalEndpoint(socket); - clientUpgradeRequest.setSubProtocols("echo", "mamba"); + clientUpgradeRequest.setSubProtocols("echo"); final Future sessionFuture = client.connect(socket, REQUEST_URL_HELLO_1, clientUpgradeRequest); final Session session = sessionFuture.get(500, TimeUnit.MILLISECONDS); @@ -316,9 +300,7 @@ public void serverOnMessage_RespondsWithExpected_TextMessage_ContinuousPush() th final StubsClientWebSocket socket = new StubsClientWebSocket(5); final ClientUpgradeRequest clientUpgradeRequest = new ClientUpgradeRequest(); - clientUpgradeRequest.setRequestURI(REQUEST_URL_HELLO_1); - clientUpgradeRequest.setLocalEndpoint(socket); - clientUpgradeRequest.setSubProtocols("echo", "mamba"); + clientUpgradeRequest.setSubProtocols("echo"); final Future sessionFuture = client.connect(socket, REQUEST_URL_HELLO_1, clientUpgradeRequest); final Session session = sessionFuture.get(500, TimeUnit.MILLISECONDS); @@ -342,9 +324,7 @@ public void serverOnMessage_RespondsWithExpected_BinaryMessage_OnceOnly() throws final StubsClientWebSocket socket = new StubsClientWebSocket(2); final ClientUpgradeRequest clientUpgradeRequest = new ClientUpgradeRequest(); - clientUpgradeRequest.setRequestURI(REQUEST_URL_HELLO_2); - clientUpgradeRequest.setLocalEndpoint(socket); - clientUpgradeRequest.setSubProtocols("echo", "mamba"); + clientUpgradeRequest.setSubProtocols("echo"); final Future sessionFuture = client.connect(socket, REQUEST_URL_HELLO_2, clientUpgradeRequest); final Session session = sessionFuture.get(500, TimeUnit.MILLISECONDS); @@ -371,9 +351,7 @@ public void serverOnMessage_RespondsWithExpected_BinaryMessage_ContinuousPush() final StubsClientWebSocket socket = new StubsClientWebSocket(5); final ClientUpgradeRequest clientUpgradeRequest = new ClientUpgradeRequest(); - clientUpgradeRequest.setRequestURI(REQUEST_URL_HELLO_2); - clientUpgradeRequest.setLocalEndpoint(socket); - clientUpgradeRequest.setSubProtocols("echo", "mamba"); + clientUpgradeRequest.setSubProtocols("echo"); final Future sessionFuture = client.connect(socket, REQUEST_URL_HELLO_2, clientUpgradeRequest); final Session session = sessionFuture.get(500, TimeUnit.MILLISECONDS); @@ -402,7 +380,7 @@ public void serverOnMessage_RespondsWithExpected_BinaryMessage_ContinuousPush() // final ClientUpgradeRequest clientUpgradeRequest = new ClientUpgradeRequest(); // clientUpgradeRequest.setRequestURI(REQUEST_URL_HELLO_1); // clientUpgradeRequest.setLocalEndpoint(socket); -// clientUpgradeRequest.setSubProtocols("echo", "mamba"); +// clientUpgradeRequest.setSubProtocols("echo"); // // final Future sessionFuture = client.connect(socket, REQUEST_URL_HELLO_1, clientUpgradeRequest); // final Session session = sessionFuture.get(500, TimeUnit.MILLISECONDS); @@ -427,9 +405,7 @@ public void serverOnMessage_RespondsWithExpected_BinaryMessage_FragmentedFrames( final StubsClientWebSocket socket = new StubsClientWebSocket(1); final ClientUpgradeRequest clientUpgradeRequest = new ClientUpgradeRequest(); - clientUpgradeRequest.setRequestURI(REQUEST_URL_HELLO_5); - clientUpgradeRequest.setLocalEndpoint(socket); - clientUpgradeRequest.setSubProtocols("echo", "mamba"); + clientUpgradeRequest.setSubProtocols("echo"); final Future sessionFuture = client.connect(socket, REQUEST_URL_HELLO_5, clientUpgradeRequest); final Session session = sessionFuture.get(500, TimeUnit.MILLISECONDS); @@ -450,9 +426,7 @@ public void serverOnMessage_RespondsWithExpected_BinaryMessage_FragmentedFrames( public void serverShouldThrow_WhenConnectingClient_RequestedWrongUrl() throws Exception { final StubsClientWebSocket socket = new StubsClientWebSocket(1); final ClientUpgradeRequest clientUpgradeRequest = new ClientUpgradeRequest(); - clientUpgradeRequest.setRequestURI(NON_STUBBED_REQUEST_URL); - clientUpgradeRequest.setLocalEndpoint(socket); - clientUpgradeRequest.setSubProtocols("echo", "mamba"); + clientUpgradeRequest.setSubProtocols("echo"); final Future sessionFuture = client.connect(socket, NON_STUBBED_REQUEST_URL, clientUpgradeRequest); @@ -470,8 +444,6 @@ public void serverShouldThrow_WhenConnectingClient_RequestedWrongUrl() throws Ex public void serverWithSubProtocolsShouldThrow_WhenConnectingClient_RequestedWrongSubProtocol() throws Exception { final StubsClientWebSocket socket = new StubsClientWebSocket(1); final ClientUpgradeRequest clientUpgradeRequest = new ClientUpgradeRequest(); - clientUpgradeRequest.setRequestURI(REQUEST_URL_HELLO_1); - clientUpgradeRequest.setLocalEndpoint(socket); clientUpgradeRequest.setSubProtocols("non-existent-among-stubbed-ones"); final Future sessionFuture = client.connect(socket, REQUEST_URL_HELLO_1, clientUpgradeRequest); @@ -490,11 +462,9 @@ public void serverWithSubProtocolsShouldThrow_WhenConnectingClient_RequestedWron public void serverWithSubProtocolsShouldThrow_WhenConnectingClient_RequestedNoSubProtocol() throws Exception { final StubsClientWebSocket socket = new StubsClientWebSocket(1); final ClientUpgradeRequest clientUpgradeRequest = new ClientUpgradeRequest(); - clientUpgradeRequest.setRequestURI(REQUEST_URL_HELLO_1); - clientUpgradeRequest.setLocalEndpoint(socket); // Not calling the following - // clientUpgradeRequest.setSubProtocols("echo", "mamba"); + // clientUpgradeRequest.setSubProtocols("echo"); final Future sessionFuture = client.connect(socket, REQUEST_URL_HELLO_1, clientUpgradeRequest); @@ -517,9 +487,7 @@ public void webSocketProtocol_jettySanityCheck_jettyRespondsWithExpected_PongMes final StubsClientWebSocket socket = new StubsClientWebSocket(1); final ClientUpgradeRequest clientUpgradeRequest = new ClientUpgradeRequest(); - clientUpgradeRequest.setRequestURI(REQUEST_URL_HELLO_5); - clientUpgradeRequest.setLocalEndpoint(socket); - clientUpgradeRequest.setSubProtocols("echo", "mamba"); + clientUpgradeRequest.setSubProtocols("echo"); final Future sessionFuture = client.connect(socket, REQUEST_URL_HELLO_5, clientUpgradeRequest); final Session session = sessionFuture.get(500, TimeUnit.MILLISECONDS); @@ -547,9 +515,7 @@ public void webSocketProtocol_jettySanityCheck_jettyRespondsWithExpected_PongWit final StubsClientWebSocket socket = new StubsClientWebSocket(1); final ClientUpgradeRequest clientUpgradeRequest = new ClientUpgradeRequest(); - clientUpgradeRequest.setRequestURI(REQUEST_URL_HELLO_5); - clientUpgradeRequest.setLocalEndpoint(socket); - clientUpgradeRequest.setSubProtocols("echo", "mamba"); + clientUpgradeRequest.setSubProtocols("echo"); final Future sessionFuture = client.connect(socket, REQUEST_URL_HELLO_5, clientUpgradeRequest); final Session session = sessionFuture.get(500, TimeUnit.MILLISECONDS); @@ -594,24 +560,9 @@ public void onWebSocketConnect(final Session session) { @OnWebSocketFrame public void onOnWebSocketFrame(final Frame frame) throws IOException { - if (frame instanceof PingFrame) { - final PingFrame pingFrame = (PingFrame) frame; - final ByteBuffer pingPayload = pingFrame.getPayload(); - receivedOnMessageBytes.add(pingPayload.array()); - countDownLatch.countDown(); - } - - if (frame instanceof PongFrame) { - final PongFrame pongFrame = (PongFrame) frame; - final ByteBuffer pongPayload = pongFrame.getPayload(); - - if (!pongPayload.hasArray()) { - byte[] to = new byte[pongPayload.remaining()]; - pongPayload.slice().get(to); - receivedOnMessageBytes.add(to); - } else { - receivedOnMessageBytes.add(pongPayload.array()); - } + if (frame.getOpCode() == OpCode.PING || frame.getOpCode() == OpCode.PONG) { + final byte[] bytes = ByteUtils.extractByteArrayFromByteBuffer(frame.getPayload()); + receivedOnMessageBytes.add(bytes); countDownLatch.countDown(); } } diff --git a/src/functional-test/java/io/github/azagniotov/stubby4j/StubsPortalHttp20ClearTextTests.java b/src/functional-test/java/io/github/azagniotov/stubby4j/StubsPortalHttp20ClearTextTests.java index cc49d7ea8..ba4e4199d 100644 --- a/src/functional-test/java/io/github/azagniotov/stubby4j/StubsPortalHttp20ClearTextTests.java +++ b/src/functional-test/java/io/github/azagniotov/stubby4j/StubsPortalHttp20ClearTextTests.java @@ -103,14 +103,19 @@ public void shouldReturnExpectedResponseWhenGetRequestMadeUsingLowLevelApiOver_H http2Client.start(); final String host = "localhost"; - final HttpURI httpURI = new HttpURI("http://" + host + ":" + STUBS_PORT + "/invoice?status=active&type=full"); + final HttpURI.Immutable httpURI = + HttpURI.build() + .uri("http://" + host + ":" + STUBS_PORT + "/invoice?status=active&type=full") + .asImmutable(); final FuturePromise sessionPromise = new FuturePromise<>(); http2Client.connect(new InetSocketAddress(host, STUBS_PORT), new ServerSessionListener.Adapter(), sessionPromise); final Session session = sessionPromise.get(5, TimeUnit.SECONDS); - final HttpFields requestFields = new HttpFields(); - requestFields.put("User-Agent", http2Client.getClass().getName() + "/" + Jetty.VERSION); + final HttpFields.Immutable requestFields = + HttpFields.build() + .add("User-Agent", http2Client.getClass().getName() + "/" + Jetty.VERSION) + .asImmutable(); final MetaData.Request metaData = new MetaData.Request(HttpMethod.GET.asString(), httpURI, HttpVersion.HTTP_2, requestFields); final HeadersFrame headersFrame = new HeadersFrame(metaData, null, true); diff --git a/src/functional-test/java/io/github/azagniotov/stubby4j/StubsPortalHttp20OverTlsWithAlpnProtocolTests.java b/src/functional-test/java/io/github/azagniotov/stubby4j/StubsPortalHttp20OverTlsWithAlpnProtocolTests.java index 5852b5382..ab84bda0e 100644 --- a/src/functional-test/java/io/github/azagniotov/stubby4j/StubsPortalHttp20OverTlsWithAlpnProtocolTests.java +++ b/src/functional-test/java/io/github/azagniotov/stubby4j/StubsPortalHttp20OverTlsWithAlpnProtocolTests.java @@ -123,14 +123,19 @@ public void shouldReturnExpectedResponseUsingLowLevelHttp2ClientApiOverTlsWithAl http2Client.start(); final String host = "localhost"; - final HttpURI httpURI = new HttpURI("https://" + host + ":" + STUBS_SSL_PORT + "/invoice?status=active&type=full"); + final HttpURI.Immutable httpURI = + HttpURI.build() + .uri("http://" + host + ":" + STUBS_SSL_PORT + "/invoice?status=active&type=full") + .asImmutable(); final FuturePromise sessionPromise = new FuturePromise<>(); http2Client.connect(sslContextFactory, new InetSocketAddress(host, STUBS_SSL_PORT), new ServerSessionListener.Adapter(), sessionPromise); final Session session = sessionPromise.get(5, TimeUnit.SECONDS); - final HttpFields requestFields = new HttpFields(); - requestFields.put("User-Agent", http2Client.getClass().getName() + "/" + Jetty.VERSION); + final HttpFields.Immutable requestFields = + HttpFields.build() + .add("User-Agent", http2Client.getClass().getName() + "/" + Jetty.VERSION) + .asImmutable(); final MetaData.Request metaData = new MetaData.Request(HttpMethod.GET.asString(), httpURI, HttpVersion.HTTP_2, requestFields); final HeadersFrame headersFrame = new HeadersFrame(metaData, null, true); diff --git a/src/integration-test/java/io/github/azagniotov/stubby4j/stubs/StubRepositoryTest.java b/src/integration-test/java/io/github/azagniotov/stubby4j/stubs/StubRepositoryTest.java index 4bcb12440..250237bac 100644 --- a/src/integration-test/java/io/github/azagniotov/stubby4j/stubs/StubRepositoryTest.java +++ b/src/integration-test/java/io/github/azagniotov/stubby4j/stubs/StubRepositoryTest.java @@ -17,7 +17,7 @@ import org.mockito.Spy; import org.mockito.junit.MockitoJUnitRunner; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import java.io.File; import java.io.IOException; import java.io.InputStream; diff --git a/src/integration-test/java/io/github/azagniotov/stubby4j/utils/ConsoleUtilsTest.java b/src/integration-test/java/io/github/azagniotov/stubby4j/utils/ConsoleUtilsTest.java index 030c057dc..4f029e19d 100644 --- a/src/integration-test/java/io/github/azagniotov/stubby4j/utils/ConsoleUtilsTest.java +++ b/src/integration-test/java/io/github/azagniotov/stubby4j/utils/ConsoleUtilsTest.java @@ -10,8 +10,8 @@ import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.io.ByteArrayOutputStream; import java.io.PrintStream; diff --git a/src/main/java/io/github/azagniotov/stubby4j/cli/EmptyLogger.java b/src/main/java/io/github/azagniotov/stubby4j/cli/EmptyLogger.java deleted file mode 100644 index b73f94024..000000000 --- a/src/main/java/io/github/azagniotov/stubby4j/cli/EmptyLogger.java +++ /dev/null @@ -1,76 +0,0 @@ -package io.github.azagniotov.stubby4j.cli; - -import io.github.azagniotov.stubby4j.annotations.GeneratedCodeClassCoverageExclusion; -import org.eclipse.jetty.util.log.Logger; - -/** - * Class used to suppress default console output of Jetty - * - * @author Eric Mrak - */ -@GeneratedCodeClassCoverageExclusion -public final class EmptyLogger implements Logger { - @Override - public String getName() { - return null; - } - - @Override - public void warn(final String s, final Object... objects) { - } - - @Override - public void warn(final Throwable throwable) { - } - - @Override - public void warn(final String s, final Throwable throwable) { - } - - @Override - public void info(final String s, final Object... objects) { - } - - @Override - public void info(final Throwable throwable) { - } - - @Override - public void info(final String s, final Throwable throwable) { - } - - @Override - public boolean isDebugEnabled() { - return false; - } - - @Override - public void setDebugEnabled(final boolean b) { - } - - @Override - public void debug(final String s, final Object... objects) { - } - - @Override - public void debug(final String msg, final long value) { - - } - - @Override - public void debug(final Throwable throwable) { - } - - @Override - public void debug(final String s, final Throwable throwable) { - } - - @Override - public Logger getLogger(final String s) { - return this; - } - - @Override - public void ignore(final Throwable throwable) { - } -} diff --git a/src/main/java/io/github/azagniotov/stubby4j/handlers/AbstractHandlerExtension.java b/src/main/java/io/github/azagniotov/stubby4j/handlers/AbstractHandlerExtension.java index 7cd7982c0..c237276aa 100644 --- a/src/main/java/io/github/azagniotov/stubby4j/handlers/AbstractHandlerExtension.java +++ b/src/main/java/io/github/azagniotov/stubby4j/handlers/AbstractHandlerExtension.java @@ -3,8 +3,8 @@ import io.github.azagniotov.stubby4j.utils.ConsoleUtils; import org.eclipse.jetty.server.Request; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; public interface AbstractHandlerExtension { diff --git a/src/main/java/io/github/azagniotov/stubby4j/handlers/AdminPortalHandler.java b/src/main/java/io/github/azagniotov/stubby4j/handlers/AdminPortalHandler.java index 27321ebaf..7d965377b 100644 --- a/src/main/java/io/github/azagniotov/stubby4j/handlers/AdminPortalHandler.java +++ b/src/main/java/io/github/azagniotov/stubby4j/handlers/AdminPortalHandler.java @@ -9,9 +9,9 @@ import org.eclipse.jetty.server.Request; import org.eclipse.jetty.server.handler.AbstractHandler; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; public class AdminPortalHandler extends AbstractHandler implements AbstractHandlerExtension { diff --git a/src/main/java/io/github/azagniotov/stubby4j/handlers/AjaxEndpointStatsHandler.java b/src/main/java/io/github/azagniotov/stubby4j/handlers/AjaxEndpointStatsHandler.java index b48fdf959..df04f660f 100644 --- a/src/main/java/io/github/azagniotov/stubby4j/handlers/AjaxEndpointStatsHandler.java +++ b/src/main/java/io/github/azagniotov/stubby4j/handlers/AjaxEndpointStatsHandler.java @@ -8,9 +8,9 @@ import org.eclipse.jetty.server.Request; import org.eclipse.jetty.server.handler.AbstractHandler; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import static io.github.azagniotov.stubby4j.utils.HandlerUtils.getHtmlResourceByName; diff --git a/src/main/java/io/github/azagniotov/stubby4j/handlers/AjaxResourceContentHandler.java b/src/main/java/io/github/azagniotov/stubby4j/handlers/AjaxResourceContentHandler.java index f7da8f8fc..8ed131e3c 100644 --- a/src/main/java/io/github/azagniotov/stubby4j/handlers/AjaxResourceContentHandler.java +++ b/src/main/java/io/github/azagniotov/stubby4j/handlers/AjaxResourceContentHandler.java @@ -13,9 +13,9 @@ import org.eclipse.jetty.server.Request; import org.eclipse.jetty.server.handler.AbstractHandler; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.Optional; import java.util.regex.Pattern; diff --git a/src/main/java/io/github/azagniotov/stubby4j/handlers/FaviconHandler.java b/src/main/java/io/github/azagniotov/stubby4j/handlers/FaviconHandler.java index 983cc378c..213b80fc1 100644 --- a/src/main/java/io/github/azagniotov/stubby4j/handlers/FaviconHandler.java +++ b/src/main/java/io/github/azagniotov/stubby4j/handlers/FaviconHandler.java @@ -8,9 +8,9 @@ import org.eclipse.jetty.util.IO; import org.eclipse.jetty.util.resource.Resource; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.net.URL; diff --git a/src/main/java/io/github/azagniotov/stubby4j/handlers/JsonErrorHandler.java b/src/main/java/io/github/azagniotov/stubby4j/handlers/JsonErrorHandler.java index 2142e77d7..b0db3dc56 100644 --- a/src/main/java/io/github/azagniotov/stubby4j/handlers/JsonErrorHandler.java +++ b/src/main/java/io/github/azagniotov/stubby4j/handlers/JsonErrorHandler.java @@ -12,8 +12,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.Writer; diff --git a/src/main/java/io/github/azagniotov/stubby4j/handlers/StatusPageHandler.java b/src/main/java/io/github/azagniotov/stubby4j/handlers/StatusPageHandler.java index f97282ace..5b6922821 100644 --- a/src/main/java/io/github/azagniotov/stubby4j/handlers/StatusPageHandler.java +++ b/src/main/java/io/github/azagniotov/stubby4j/handlers/StatusPageHandler.java @@ -21,9 +21,9 @@ import org.eclipse.jetty.server.Request; import org.eclipse.jetty.server.handler.AbstractHandler; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.io.File; import java.io.IOException; import java.lang.management.ManagementFactory; diff --git a/src/main/java/io/github/azagniotov/stubby4j/handlers/StubDataRefreshActionHandler.java b/src/main/java/io/github/azagniotov/stubby4j/handlers/StubDataRefreshActionHandler.java index 635637343..8ac0ec5f2 100644 --- a/src/main/java/io/github/azagniotov/stubby4j/handlers/StubDataRefreshActionHandler.java +++ b/src/main/java/io/github/azagniotov/stubby4j/handlers/StubDataRefreshActionHandler.java @@ -14,9 +14,9 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; @SuppressWarnings("serial") diff --git a/src/main/java/io/github/azagniotov/stubby4j/handlers/StubsPortalHandler.java b/src/main/java/io/github/azagniotov/stubby4j/handlers/StubsPortalHandler.java index 7d603b1bf..b3aac8503 100644 --- a/src/main/java/io/github/azagniotov/stubby4j/handlers/StubsPortalHandler.java +++ b/src/main/java/io/github/azagniotov/stubby4j/handlers/StubsPortalHandler.java @@ -9,9 +9,9 @@ import org.eclipse.jetty.server.Request; import org.eclipse.jetty.server.handler.AbstractHandler; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import static io.github.azagniotov.stubby4j.handlers.strategy.stubs.StubsResponseHandlingStrategyFactory.getStrategy; diff --git a/src/main/java/io/github/azagniotov/stubby4j/handlers/strategy/admin/AdminResponseHandlingStrategy.java b/src/main/java/io/github/azagniotov/stubby4j/handlers/strategy/admin/AdminResponseHandlingStrategy.java index 58fb4e73e..b6eb3367a 100644 --- a/src/main/java/io/github/azagniotov/stubby4j/handlers/strategy/admin/AdminResponseHandlingStrategy.java +++ b/src/main/java/io/github/azagniotov/stubby4j/handlers/strategy/admin/AdminResponseHandlingStrategy.java @@ -8,8 +8,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.OutputStream; import java.util.Arrays; diff --git a/src/main/java/io/github/azagniotov/stubby4j/handlers/strategy/admin/AdminResponseHandlingStrategyFactory.java b/src/main/java/io/github/azagniotov/stubby4j/handlers/strategy/admin/AdminResponseHandlingStrategyFactory.java index af3ea3f46..0359b5a14 100644 --- a/src/main/java/io/github/azagniotov/stubby4j/handlers/strategy/admin/AdminResponseHandlingStrategyFactory.java +++ b/src/main/java/io/github/azagniotov/stubby4j/handlers/strategy/admin/AdminResponseHandlingStrategyFactory.java @@ -1,6 +1,6 @@ package io.github.azagniotov.stubby4j.handlers.strategy.admin; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; public final class AdminResponseHandlingStrategyFactory { diff --git a/src/main/java/io/github/azagniotov/stubby4j/handlers/strategy/admin/DeleteHandlingStrategy.java b/src/main/java/io/github/azagniotov/stubby4j/handlers/strategy/admin/DeleteHandlingStrategy.java index 26d113a29..a52ee8670 100644 --- a/src/main/java/io/github/azagniotov/stubby4j/handlers/strategy/admin/DeleteHandlingStrategy.java +++ b/src/main/java/io/github/azagniotov/stubby4j/handlers/strategy/admin/DeleteHandlingStrategy.java @@ -7,8 +7,8 @@ import io.github.azagniotov.stubby4j.utils.StringUtils; import org.eclipse.jetty.http.HttpStatus; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; public class DeleteHandlingStrategy implements AdminResponseHandlingStrategy { diff --git a/src/main/java/io/github/azagniotov/stubby4j/handlers/strategy/admin/GetHandlingStrategy.java b/src/main/java/io/github/azagniotov/stubby4j/handlers/strategy/admin/GetHandlingStrategy.java index d4244eecc..64003dd12 100644 --- a/src/main/java/io/github/azagniotov/stubby4j/handlers/strategy/admin/GetHandlingStrategy.java +++ b/src/main/java/io/github/azagniotov/stubby4j/handlers/strategy/admin/GetHandlingStrategy.java @@ -6,8 +6,8 @@ import io.github.azagniotov.stubby4j.utils.StringUtils; import org.eclipse.jetty.http.HttpStatus; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; public class GetHandlingStrategy implements AdminResponseHandlingStrategy { diff --git a/src/main/java/io/github/azagniotov/stubby4j/handlers/strategy/admin/NullHandlingStrategy.java b/src/main/java/io/github/azagniotov/stubby4j/handlers/strategy/admin/NullHandlingStrategy.java index 7c19b3b63..c95ddf4f3 100644 --- a/src/main/java/io/github/azagniotov/stubby4j/handlers/strategy/admin/NullHandlingStrategy.java +++ b/src/main/java/io/github/azagniotov/stubby4j/handlers/strategy/admin/NullHandlingStrategy.java @@ -3,8 +3,8 @@ import io.github.azagniotov.stubby4j.stubs.StubRepository; import org.eclipse.jetty.http.HttpStatus; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; public class NullHandlingStrategy implements AdminResponseHandlingStrategy { diff --git a/src/main/java/io/github/azagniotov/stubby4j/handlers/strategy/admin/PostHandlingStrategy.java b/src/main/java/io/github/azagniotov/stubby4j/handlers/strategy/admin/PostHandlingStrategy.java index 6ed848713..e272acaf0 100644 --- a/src/main/java/io/github/azagniotov/stubby4j/handlers/strategy/admin/PostHandlingStrategy.java +++ b/src/main/java/io/github/azagniotov/stubby4j/handlers/strategy/admin/PostHandlingStrategy.java @@ -7,8 +7,8 @@ import org.eclipse.jetty.http.HttpHeader; import org.eclipse.jetty.http.HttpStatus; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.Optional; diff --git a/src/main/java/io/github/azagniotov/stubby4j/handlers/strategy/admin/PutHandlingStrategy.java b/src/main/java/io/github/azagniotov/stubby4j/handlers/strategy/admin/PutHandlingStrategy.java index 918b0138e..dcb814995 100644 --- a/src/main/java/io/github/azagniotov/stubby4j/handlers/strategy/admin/PutHandlingStrategy.java +++ b/src/main/java/io/github/azagniotov/stubby4j/handlers/strategy/admin/PutHandlingStrategy.java @@ -8,8 +8,8 @@ import org.eclipse.jetty.http.HttpHeader; import org.eclipse.jetty.http.HttpStatus; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.util.Optional; public class PutHandlingStrategy implements AdminResponseHandlingStrategy { diff --git a/src/main/java/io/github/azagniotov/stubby4j/handlers/strategy/stubs/DefaultResponseHandlingStrategy.java b/src/main/java/io/github/azagniotov/stubby4j/handlers/strategy/stubs/DefaultResponseHandlingStrategy.java index 21eeb29cb..6dcbd1c9b 100644 --- a/src/main/java/io/github/azagniotov/stubby4j/handlers/strategy/stubs/DefaultResponseHandlingStrategy.java +++ b/src/main/java/io/github/azagniotov/stubby4j/handlers/strategy/stubs/DefaultResponseHandlingStrategy.java @@ -5,7 +5,7 @@ import io.github.azagniotov.stubby4j.utils.StringUtils; import org.eclipse.jetty.http.HttpStatus; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletResponse; import java.io.File; import java.io.IOException; import java.io.OutputStream; diff --git a/src/main/java/io/github/azagniotov/stubby4j/handlers/strategy/stubs/NotFoundResponseHandlingStrategy.java b/src/main/java/io/github/azagniotov/stubby4j/handlers/strategy/stubs/NotFoundResponseHandlingStrategy.java index d3a8f81e5..f421fbf27 100644 --- a/src/main/java/io/github/azagniotov/stubby4j/handlers/strategy/stubs/NotFoundResponseHandlingStrategy.java +++ b/src/main/java/io/github/azagniotov/stubby4j/handlers/strategy/stubs/NotFoundResponseHandlingStrategy.java @@ -5,7 +5,7 @@ import org.eclipse.jetty.http.HttpStatus; import org.json.JSONObject; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletResponse; public final class NotFoundResponseHandlingStrategy implements StubResponseHandlingStrategy { diff --git a/src/main/java/io/github/azagniotov/stubby4j/handlers/strategy/stubs/RedirectResponseHandlingStrategy.java b/src/main/java/io/github/azagniotov/stubby4j/handlers/strategy/stubs/RedirectResponseHandlingStrategy.java index ca0263a18..b7edb52c9 100644 --- a/src/main/java/io/github/azagniotov/stubby4j/handlers/strategy/stubs/RedirectResponseHandlingStrategy.java +++ b/src/main/java/io/github/azagniotov/stubby4j/handlers/strategy/stubs/RedirectResponseHandlingStrategy.java @@ -6,7 +6,7 @@ import io.github.azagniotov.stubby4j.utils.StringUtils; import org.eclipse.jetty.http.HttpHeader; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletResponse; import java.util.Map; import java.util.concurrent.TimeUnit; diff --git a/src/main/java/io/github/azagniotov/stubby4j/handlers/strategy/stubs/StubResponseHandlingStrategy.java b/src/main/java/io/github/azagniotov/stubby4j/handlers/strategy/stubs/StubResponseHandlingStrategy.java index 225ac7b06..cd2bf5249 100644 --- a/src/main/java/io/github/azagniotov/stubby4j/handlers/strategy/stubs/StubResponseHandlingStrategy.java +++ b/src/main/java/io/github/azagniotov/stubby4j/handlers/strategy/stubs/StubResponseHandlingStrategy.java @@ -2,7 +2,7 @@ import io.github.azagniotov.stubby4j.stubs.StubRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletResponse; public interface StubResponseHandlingStrategy { void handle(final HttpServletResponse response, final StubRequest assertionStubRequest) throws Exception; diff --git a/src/main/java/io/github/azagniotov/stubby4j/handlers/strategy/stubs/UnauthorizedResponseHandlingStrategy.java b/src/main/java/io/github/azagniotov/stubby4j/handlers/strategy/stubs/UnauthorizedResponseHandlingStrategy.java index 2da2337cf..64736a6cf 100644 --- a/src/main/java/io/github/azagniotov/stubby4j/handlers/strategy/stubs/UnauthorizedResponseHandlingStrategy.java +++ b/src/main/java/io/github/azagniotov/stubby4j/handlers/strategy/stubs/UnauthorizedResponseHandlingStrategy.java @@ -6,7 +6,7 @@ import io.github.azagniotov.stubby4j.utils.StringUtils; import org.eclipse.jetty.http.HttpStatus; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletResponse; public final class UnauthorizedResponseHandlingStrategy implements StubResponseHandlingStrategy { diff --git a/src/main/java/io/github/azagniotov/stubby4j/server/JettyFactory.java b/src/main/java/io/github/azagniotov/stubby4j/server/JettyFactory.java index ac5bd120c..14756f2cb 100644 --- a/src/main/java/io/github/azagniotov/stubby4j/server/JettyFactory.java +++ b/src/main/java/io/github/azagniotov/stubby4j/server/JettyFactory.java @@ -16,6 +16,7 @@ import io.github.azagniotov.stubby4j.stubs.StubRepository; import io.github.azagniotov.stubby4j.utils.ObjectUtils; import io.github.azagniotov.stubby4j.utils.StringUtils; +import jakarta.servlet.ServletException; import org.eclipse.jetty.alpn.server.ALPNServerConnectionFactory; import org.eclipse.jetty.http.HttpScheme; import org.eclipse.jetty.http.MimeTypes; @@ -38,12 +39,10 @@ import org.eclipse.jetty.servlet.ServletContextHandler; import org.eclipse.jetty.util.resource.Resource; import org.eclipse.jetty.util.ssl.SslContextFactory; -import org.eclipse.jetty.websocket.server.NativeWebSocketServletContainerInitializer; -import org.eclipse.jetty.websocket.server.WebSocketUpgradeFilter; +import org.eclipse.jetty.websocket.server.config.JettyWebSocketServletContainerInitializer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.servlet.ServletException; import java.io.IOException; import java.net.URL; import java.util.ArrayList; @@ -112,19 +111,15 @@ Server construct() throws IOException, ServletException { server.setHandler(contextHandlerCollection); // Configure specific websocket behavior - NativeWebSocketServletContainerInitializer.configure(servletContextHandler, (servletContext, nativeWebSocketConfiguration) -> + JettyWebSocketServletContainerInitializer.configure(servletContextHandler, (servletContext, jettyWebSocketServerContainer) -> { // Configure default max size - nativeWebSocketConfiguration.getPolicy().setMaxTextMessageBufferSize(65535); + jettyWebSocketServerContainer.setMaxTextMessageSize(65535); // Add websockets - nativeWebSocketConfiguration.addMapping("/*", new StubsWebSocketCreator(stubRepository)); + jettyWebSocketServerContainer.addMapping("/*", new StubsWebSocketCreator(stubRepository)); }); - - // Add generic filter that will accept WebSocket upgrade. - WebSocketUpgradeFilter.configure(servletContextHandler); - return server; } @@ -326,10 +321,10 @@ private ServerConnector buildStubsSslConnector(final Server server) throws IOExc httpConfiguration.setSecurePort(getStubsSslPort(commandLineArgs)); httpConfiguration.addCustomizer(new SecureRequestCustomizer()); - final SslContextFactory sslContextFactory = constructSslContextFactory(keystorePassword, keystorePath); + final SslContextFactory.Server serverSslContextFactory = constructSslContextFactory(keystorePassword, keystorePath); final ServerConnector sslConnector = enableAlpnAndHttp2 ? - buildSslConnectorWithHttp2Alpn(server, httpConfiguration, sslContextFactory) : - buildSslConnectorWithHttp11(server, httpConfiguration, sslContextFactory); + buildSslConnectorWithHttp2Alpn(server, httpConfiguration, serverSslContextFactory) : + buildSslConnectorWithHttp11(server, httpConfiguration, serverSslContextFactory); sslConnector.setPort(getStubsSslPort(commandLineArgs)); sslConnector.setHost(DEFAULT_HOST); @@ -340,7 +335,7 @@ private ServerConnector buildStubsSslConnector(final Server server) throws IOExc sslConnector.setHost(commandLineArgs.get(CommandLineInterpreter.OPTION_ADDRESS)); } - final HashSet supportedTlsProtocols = new HashSet<>(Arrays.asList(sslContextFactory.getIncludeProtocols())); + final HashSet supportedTlsProtocols = new HashSet<>(Arrays.asList(serverSslContextFactory.getIncludeProtocols())); statusBuilder.append("\n"); @@ -378,7 +373,7 @@ private ServerConnector buildStubsSslConnector(final Server server) throws IOExc return sslConnector; } - private SslContextFactory constructSslContextFactory(final String keystorePassword, final String keystorePath) throws IOException { + private SslContextFactory.Server constructSslContextFactory(final String keystorePassword, final String keystorePath) throws IOException { // https://www.eclipse.org/jetty/documentation/jetty-9/index.html#configuring-ssl @@ -386,7 +381,7 @@ private SslContextFactory constructSslContextFactory(final String keystorePasswo // https://github.com/eclipse/jetty.project/issues/2807 // https://github.com/eclipse/jetty.project/issues/3773 // https://github.com/eclipse/jetty.project/issues/5039 - final SslContextFactory sslContextFactory = new SslContextFactory.Server(); + final SslContextFactory.Server sslContextFactory = new SslContextFactory.Server(); sslContextFactory.setExcludeProtocols(); sslContextFactory.setIncludeProtocols(SslUtils.enabledProtocols()); @@ -431,8 +426,7 @@ private HttpConfiguration constructHttpConfiguration() { private ServerConnector buildStubsConnectorWithHttp11(final Server server, final HttpConfiguration httpConfiguration) { - return new ServerConnector(server, - new HttpConnectionFactory(httpConfiguration)); + return new ServerConnector(server, new HttpConnectionFactory(httpConfiguration)); } private ServerConnector buildStubsConnectorWithHttp20(final Server server, @@ -448,17 +442,17 @@ private ServerConnector buildStubsConnectorWithHttp20(final Server server, private ServerConnector buildSslConnectorWithHttp11(final Server server, final HttpConfiguration httpConfiguration, - final SslContextFactory sslContextFactory) { - final SslConnectionFactory sslConnectionFactory = new SslConnectionFactory(sslContextFactory, PROTOCOL_HTTP_1_1); + final SslContextFactory.Server serverSslContextFactory) { + final SslConnectionFactory sslConnectionFactory = new SslConnectionFactory(serverSslContextFactory, PROTOCOL_HTTP_1_1); return new ServerConnector(server, sslConnectionFactory, new HttpConnectionFactory(httpConfiguration)); } private ServerConnector buildSslConnectorWithHttp2Alpn(final Server server, final HttpConfiguration httpConfiguration, - final SslContextFactory sslContextFactory) { + final SslContextFactory.Server serverSslContextFactory) { // https://www.eclipse.org/jetty/documentation/jetty-9/index.html#alpn-chapter - sslContextFactory.setCipherComparator(HTTP2Cipher.COMPARATOR); + serverSslContextFactory.setCipherComparator(HTTP2Cipher.COMPARATOR); final ALPNServerConnectionFactory alpnServerConnectionFactory = new ALPNServerConnectionFactory(PROTOCOL_HTTP_2); final HTTP2ServerConnectionFactory http2ServerConnectionFactory = new HTTP2ServerConnectionFactory(httpConfiguration); @@ -467,7 +461,7 @@ private ServerConnector buildSslConnectorWithHttp2Alpn(final Server server, // https://github.com/curl/curl/blob/63c76681827b5ae9017f6c981003cd75e5f127de/lib/http2.h#L32 http2ServerConnectionFactory.setMaxConcurrentStreams(100); return new ServerConnector(server, - new SslConnectionFactory(sslContextFactory, alpnServerConnectionFactory.getProtocol()), + new SslConnectionFactory(serverSslContextFactory, alpnServerConnectionFactory.getProtocol()), alpnServerConnectionFactory, http2ServerConnectionFactory); } diff --git a/src/main/java/io/github/azagniotov/stubby4j/server/StubbyManagerFactory.java b/src/main/java/io/github/azagniotov/stubby4j/server/StubbyManagerFactory.java index bdb31d90e..4edaed47b 100644 --- a/src/main/java/io/github/azagniotov/stubby4j/server/StubbyManagerFactory.java +++ b/src/main/java/io/github/azagniotov/stubby4j/server/StubbyManagerFactory.java @@ -3,13 +3,11 @@ import io.github.azagniotov.stubby4j.caching.Cache; import io.github.azagniotov.stubby4j.cli.ANSITerminal; import io.github.azagniotov.stubby4j.cli.CommandLineInterpreter; -import io.github.azagniotov.stubby4j.cli.EmptyLogger; import io.github.azagniotov.stubby4j.http.StubbyHttpTransport; import io.github.azagniotov.stubby4j.stubs.StubHttpLifecycle; import io.github.azagniotov.stubby4j.stubs.StubRepository; import io.github.azagniotov.stubby4j.yaml.YamlParseResultSet; import org.eclipse.jetty.server.Server; -import org.eclipse.jetty.util.log.Log; import java.io.File; import java.util.Map; @@ -25,11 +23,6 @@ public synchronized StubbyManager construct(final File configFile, final Map commandLineArgs, final CompletableFuture stubLoadComputation) throws Exception { - final String enableJettyDebug = System.getProperty("enableJettyDebug"); - if (enableJettyDebug == null) { - Log.setLog(new EmptyLogger()); - } - //TODO BUG: When stubs are cached, upon finding the previously cached match by hashCode, // if stubbed response has template tokens for dynamic token replacement, the tokens are // not replaced with values from the incoming request because the cached stub is not going diff --git a/src/main/java/io/github/azagniotov/stubby4j/server/websocket/StubsServerWebSocket.java b/src/main/java/io/github/azagniotov/stubby4j/server/websocket/StubsServerWebSocket.java index c38c8c8ce..a5ec3551b 100644 --- a/src/main/java/io/github/azagniotov/stubby4j/server/websocket/StubsServerWebSocket.java +++ b/src/main/java/io/github/azagniotov/stubby4j/server/websocket/StubsServerWebSocket.java @@ -10,17 +10,16 @@ import org.eclipse.jetty.websocket.api.RemoteEndpoint; import org.eclipse.jetty.websocket.api.Session; import org.eclipse.jetty.websocket.api.StatusCode; +import org.eclipse.jetty.websocket.api.WriteCallback; import org.eclipse.jetty.websocket.api.annotations.OnWebSocketClose; import org.eclipse.jetty.websocket.api.annotations.OnWebSocketConnect; import org.eclipse.jetty.websocket.api.annotations.OnWebSocketError; import org.eclipse.jetty.websocket.api.annotations.OnWebSocketMessage; import org.eclipse.jetty.websocket.api.annotations.WebSocket; -import org.eclipse.jetty.websocket.servlet.ServletUpgradeRequest; +import org.eclipse.jetty.websocket.server.JettyServerUpgradeRequest; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.IOException; -import java.io.UncheckedIOException; import java.nio.ByteBuffer; import java.util.Arrays; import java.util.List; @@ -69,7 +68,7 @@ public void onWebSocketConnect(final Session session) { @OnWebSocketMessage public void onWebSocketBinary(final byte[] incoming, final int offset, final int length) { - final ServletUpgradeRequest upgradeRequest = (ServletUpgradeRequest) this.session.getUpgradeRequest(); + final JettyServerUpgradeRequest upgradeRequest = (JettyServerUpgradeRequest) this.session.getUpgradeRequest(); ConsoleUtils.logIncomingWebSocketTextRequest(upgradeRequest, "binary payload"); boolean found = false; @@ -86,13 +85,13 @@ public void onWebSocketBinary(final byte[] incoming, final int offset, final int } if (!found) { - this.remote.sendStringByFuture(String.format("404 Not Found: client sent [%s]", incoming)); + this.remote.sendString(String.format("404 Not Found: client sent [%s]", incoming), WriteCallback.NOOP); } } @OnWebSocketMessage public void onWebSocketText(final String message) { - final ServletUpgradeRequest upgradeRequest = (ServletUpgradeRequest) this.session.getUpgradeRequest(); + final JettyServerUpgradeRequest upgradeRequest = (JettyServerUpgradeRequest) this.session.getUpgradeRequest(); ConsoleUtils.logIncomingWebSocketTextRequest(upgradeRequest, message); boolean found = false; @@ -109,7 +108,7 @@ public void onWebSocketText(final String message) { } if (!found) { - this.remote.sendStringByFuture(String.format("404 Not Found: client request %s", message)); + this.remote.sendString(String.format("404 Not Found: client request %s", message), WriteCallback.NOOP); } } @@ -145,10 +144,10 @@ private void dispatchServerResponse(final StubWebSocketServerResponse serverResp scheduledExecutorService.schedule(() -> { if (serverResponse.getMessageType() == TEXT) { // Send response in a UTF-8 text form as a whole - this.remote.sendStringByFuture(serverResponse.getBodyAsString()); + this.remote.sendString(serverResponse.getBodyAsString(), WriteCallback.NOOP); } else { // Send response in a binary form as a whole blob - this.remote.sendBytesByFuture(ByteBuffer.wrap(serverResponse.getBodyAsBytes())); + this.remote.sendBytes(ByteBuffer.wrap(serverResponse.getBodyAsBytes()), WriteCallback.NOOP); } }, delay, TimeUnit.MILLISECONDS); @@ -165,11 +164,9 @@ private void dispatchServerResponse(final StubWebSocketServerResponse serverResp // Send response in a binary form as sequential fragmented frames one after another in // a blocking manner. This must be a blocking call, i.e.: we cannot send each chunk // in an async manner using a Future, as this can produce un-deterministic behavior. - this.remote.sendPartialBytes(byteBufferChunk, isLast); + this.remote.sendPartialBytes(byteBufferChunk, isLast, WriteCallback.NOOP); Thread.sleep(delay); } - } catch (IOException e) { - throw new UncheckedIOException(e); } catch (InterruptedException e) { throw new RuntimeException(e); } @@ -181,9 +178,9 @@ private void dispatchServerResponse(final StubWebSocketServerResponse serverResp // Send response to the client in periodic pushes one after another. The content will be sent as a whole scheduledExecutorService.scheduleAtFixedRate(() -> { if (serverResponse.getMessageType() == TEXT) { - this.remote.sendStringByFuture(serverResponse.getBodyAsString()); + this.remote.sendString(serverResponse.getBodyAsString(), WriteCallback.NOOP); } else { - this.remote.sendBytesByFuture(ByteBuffer.wrap(serverResponse.getBodyAsBytes())); + this.remote.sendBytes(ByteBuffer.wrap(serverResponse.getBodyAsBytes()), WriteCallback.NOOP); } }, delay, delay, TimeUnit.MILLISECONDS); } @@ -193,11 +190,7 @@ private void dispatchServerResponse(final StubWebSocketServerResponse serverResp // client upon on-open or on-message config in periodic manner. // WebSocket Ping spec: https://datatracker.ietf.org/doc/html/rfc6455#section-5.5.2 scheduledExecutorService.scheduleAtFixedRate(() -> { - try { - this.remote.sendPing(EMPTY_BYTE_BUFFER); - } catch (IOException e) { - throw new UncheckedIOException(e); - } + this.remote.sendPing(EMPTY_BYTE_BUFFER, WriteCallback.NOOP); }, delay, delay, TimeUnit.MILLISECONDS); } diff --git a/src/main/java/io/github/azagniotov/stubby4j/server/websocket/StubsWebSocketCreator.java b/src/main/java/io/github/azagniotov/stubby4j/server/websocket/StubsWebSocketCreator.java index 11964cc64..37fb1c501 100644 --- a/src/main/java/io/github/azagniotov/stubby4j/server/websocket/StubsWebSocketCreator.java +++ b/src/main/java/io/github/azagniotov/stubby4j/server/websocket/StubsWebSocketCreator.java @@ -4,9 +4,9 @@ import io.github.azagniotov.stubby4j.stubs.websocket.StubWebSocketConfig; import io.github.azagniotov.stubby4j.utils.ConsoleUtils; import org.eclipse.jetty.http.HttpStatus; -import org.eclipse.jetty.websocket.servlet.ServletUpgradeRequest; -import org.eclipse.jetty.websocket.servlet.ServletUpgradeResponse; -import org.eclipse.jetty.websocket.servlet.WebSocketCreator; +import org.eclipse.jetty.websocket.server.JettyServerUpgradeRequest; +import org.eclipse.jetty.websocket.server.JettyServerUpgradeResponse; +import org.eclipse.jetty.websocket.server.JettyWebSocketCreator; import java.io.IOException; import java.io.UncheckedIOException; @@ -14,7 +14,7 @@ import java.util.Set; import java.util.concurrent.Executors; -public class StubsWebSocketCreator implements WebSocketCreator { +public class StubsWebSocketCreator implements JettyWebSocketCreator { private final StubRepository stubRepository; @@ -23,8 +23,8 @@ public StubsWebSocketCreator(final StubRepository stubRepository) { } @Override - public Object createWebSocket(final ServletUpgradeRequest servletUpgradeRequest, - final ServletUpgradeResponse servletUpgradeResponse) { + public Object createWebSocket(final JettyServerUpgradeRequest servletUpgradeRequest, + final JettyServerUpgradeResponse servletUpgradeResponse) { final StubWebSocketConfig stubWebSocketConfig = this.stubRepository.matchWebSocketConfigByUrl(servletUpgradeRequest.getRequestPath()); @@ -36,14 +36,16 @@ public Object createWebSocket(final ServletUpgradeRequest servletUpgradeRequest, return new StubsServerWebSocket(stubWebSocketConfig, Executors.newScheduledThreadPool(10)); } - private void checkAndHandleNotFound(final StubWebSocketConfig stubWebSocketConfig, ServletUpgradeRequest servletUpgradeRequest, ServletUpgradeResponse servletUpgradeResponse) { + private void checkAndHandleNotFound(final StubWebSocketConfig stubWebSocketConfig, + final JettyServerUpgradeRequest jettyServerUpgradeRequest, + final JettyServerUpgradeResponse jettyServerUpgradeResponse) { // The client made request to a non-existent URL if (stubWebSocketConfig == null) { try { - servletUpgradeResponse.setStatusCode(HttpStatus.NOT_FOUND_404); - servletUpgradeResponse.sendError(HttpStatus.NOT_FOUND_404, HttpStatus.Code.NOT_FOUND.getMessage()); + jettyServerUpgradeResponse.setStatusCode(HttpStatus.NOT_FOUND_404); + jettyServerUpgradeResponse.sendError(HttpStatus.NOT_FOUND_404, HttpStatus.Code.NOT_FOUND.getMessage()); - ConsoleUtils.logOutgoingWebSocketResponse(servletUpgradeResponse); + ConsoleUtils.logOutgoingWebSocketResponse(jettyServerUpgradeResponse); } catch (IOException e) { throw new UncheckedIOException(e); } @@ -51,27 +53,27 @@ private void checkAndHandleNotFound(final StubWebSocketConfig stubWebSocketConfi } private void checkAndSetAcceptedProtocols(final StubWebSocketConfig stubWebSocketConfig, - final ServletUpgradeRequest servletUpgradeRequest, - final ServletUpgradeResponse servletUpgradeResponse) { + final JettyServerUpgradeRequest jettyServerUpgradeRequest, + final JettyServerUpgradeResponse jettyServerUpgradeResponse) { // We have configured sub-protocols, so the client must conform to contract if (!stubWebSocketConfig.getSubProtocols().isEmpty()) { - final Set requestClientSubProtocolsCopy = new HashSet<>(servletUpgradeRequest.getSubProtocols()); + final Set requestClientSubProtocolsCopy = new HashSet<>(jettyServerUpgradeRequest.getSubProtocols()); requestClientSubProtocolsCopy.retainAll(stubWebSocketConfig.getSubProtocols()); if (requestClientSubProtocolsCopy.isEmpty()) { try { - servletUpgradeResponse.setStatusCode(HttpStatus.FORBIDDEN_403); - servletUpgradeResponse.sendError(HttpStatus.FORBIDDEN_403, HttpStatus.Code.FORBIDDEN.getMessage()); + jettyServerUpgradeResponse.setStatusCode(HttpStatus.FORBIDDEN_403); + jettyServerUpgradeResponse.sendError(HttpStatus.FORBIDDEN_403, HttpStatus.Code.FORBIDDEN.getMessage()); - ConsoleUtils.logOutgoingWebSocketResponse(servletUpgradeResponse); + ConsoleUtils.logOutgoingWebSocketResponse(jettyServerUpgradeResponse); } catch (IOException e) { throw new UncheckedIOException(e); } } else { - final String acceptedSubProtocol = String.join(",", requestClientSubProtocolsCopy); - servletUpgradeResponse.setAcceptedSubProtocol(acceptedSubProtocol); + // Set a protocol by picking the first one from the intersection result + jettyServerUpgradeResponse.setAcceptedSubProtocol(requestClientSubProtocolsCopy.iterator().next()); } } } diff --git a/src/main/java/io/github/azagniotov/stubby4j/stubs/StubRepository.java b/src/main/java/io/github/azagniotov/stubby4j/stubs/StubRepository.java index 34a52e3e2..a1bb7bfdb 100644 --- a/src/main/java/io/github/azagniotov/stubby4j/stubs/StubRepository.java +++ b/src/main/java/io/github/azagniotov/stubby4j/stubs/StubRepository.java @@ -15,7 +15,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import java.io.File; import java.io.IOException; import java.util.ArrayList; diff --git a/src/main/java/io/github/azagniotov/stubby4j/utils/ByteUtils.java b/src/main/java/io/github/azagniotov/stubby4j/utils/ByteUtils.java new file mode 100644 index 000000000..d73dd47f6 --- /dev/null +++ b/src/main/java/io/github/azagniotov/stubby4j/utils/ByteUtils.java @@ -0,0 +1,22 @@ +package io.github.azagniotov.stubby4j.utils; + +import java.nio.ByteBuffer; + +public final class ByteUtils { + + private ByteUtils() { + + } + + public static byte[] extractByteArrayFromByteBuffer(final ByteBuffer byteBuffer) { + // https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/nio/ByteBuffer.html#hasArray() + if (!byteBuffer.hasArray()) { + final byte[] to = new byte[byteBuffer.remaining()]; + byteBuffer.slice().get(to); + + return to; + } else { + return byteBuffer.array(); + } + } +} diff --git a/src/main/java/io/github/azagniotov/stubby4j/utils/ConsoleUtils.java b/src/main/java/io/github/azagniotov/stubby4j/utils/ConsoleUtils.java index 67e771e75..59c15c6b0 100644 --- a/src/main/java/io/github/azagniotov/stubby4j/utils/ConsoleUtils.java +++ b/src/main/java/io/github/azagniotov/stubby4j/utils/ConsoleUtils.java @@ -7,13 +7,13 @@ import io.github.azagniotov.stubby4j.stubs.proxy.StubProxyConfig; import io.github.azagniotov.stubby4j.stubs.websocket.StubWebSocketConfig; import org.eclipse.jetty.http.HttpStatus; -import org.eclipse.jetty.websocket.servlet.ServletUpgradeRequest; -import org.eclipse.jetty.websocket.servlet.ServletUpgradeResponse; +import org.eclipse.jetty.websocket.server.JettyServerUpgradeRequest; +import org.eclipse.jetty.websocket.server.JettyServerUpgradeResponse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.LinkedList; @@ -95,7 +95,7 @@ public static void logIncomingRequest(final HttpServletRequest request) { } } - public static void logIncomingWebSocketTextRequest(final ServletUpgradeRequest request, final String message) { + public static void logIncomingWebSocketTextRequest(final JettyServerUpgradeRequest request, final String message) { final String logMessage = String.format("[%s] => %s %s on [%s]: %s", getLocalDateTime(), @@ -121,7 +121,7 @@ public static void logAssertingRequest(final StubRequest assertingStubRequest) { } } - public static void logOutgoingWebSocketResponse(final ServletUpgradeResponse servletUpgradeResponse) { + public static void logOutgoingWebSocketResponse(final JettyServerUpgradeResponse servletUpgradeResponse) { lorFormattedResponse(servletUpgradeResponse.getStatusCode()); } diff --git a/src/main/java/io/github/azagniotov/stubby4j/utils/HandlerUtils.java b/src/main/java/io/github/azagniotov/stubby4j/utils/HandlerUtils.java index 189dceae1..874bbbcf0 100644 --- a/src/main/java/io/github/azagniotov/stubby4j/utils/HandlerUtils.java +++ b/src/main/java/io/github/azagniotov/stubby4j/utils/HandlerUtils.java @@ -6,8 +6,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.InputStream; import java.util.Locale; diff --git a/src/main/java/io/github/azagniotov/stubby4j/utils/HttpRequestUtils.java b/src/main/java/io/github/azagniotov/stubby4j/utils/HttpRequestUtils.java index 40d161016..1d14aba5e 100644 --- a/src/main/java/io/github/azagniotov/stubby4j/utils/HttpRequestUtils.java +++ b/src/main/java/io/github/azagniotov/stubby4j/utils/HttpRequestUtils.java @@ -7,7 +7,7 @@ import io.github.azagniotov.stubby4j.annotations.GeneratedCodeClassCoverageExclusion; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import java.util.ArrayList; import java.util.Enumeration; import java.util.List; diff --git a/src/smoke-test/shell/make_request_using_websocat.sh b/src/smoke-test/shell/make_request_using_websocat.sh index bc5984d8f..f79ecc8aa 100755 --- a/src/smoke-test/shell/make_request_using_websocat.sh +++ b/src/smoke-test/shell/make_request_using_websocat.sh @@ -22,7 +22,7 @@ smoke_test_response=$(websocat \ if [ "$smoke_test_response" != "0" ] then - echo "WebSocket request to $2:$3 failed, exiting with status 1 ... " + echo "WebSocket request to $2:$3 failed. Received response: '$smoke_test_response', thus exiting with status 1 ... " exit 1 else echo "$smoke_test_response" diff --git a/src/test/java/io/github/azagniotov/stubby4j/handlers/AbstractHandlerExtensionTest.java b/src/test/java/io/github/azagniotov/stubby4j/handlers/AbstractHandlerExtensionTest.java index 8695fa11f..d37d39f4c 100644 --- a/src/test/java/io/github/azagniotov/stubby4j/handlers/AbstractHandlerExtensionTest.java +++ b/src/test/java/io/github/azagniotov/stubby4j/handlers/AbstractHandlerExtensionTest.java @@ -8,8 +8,8 @@ import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import static com.google.common.truth.Truth.assertThat; import static org.mockito.Mockito.when; diff --git a/src/test/java/io/github/azagniotov/stubby4j/handlers/AjaxResourceContentHandlerTest.java b/src/test/java/io/github/azagniotov/stubby4j/handlers/AjaxResourceContentHandlerTest.java index 8d31d84d5..9bf83037e 100644 --- a/src/test/java/io/github/azagniotov/stubby4j/handlers/AjaxResourceContentHandlerTest.java +++ b/src/test/java/io/github/azagniotov/stubby4j/handlers/AjaxResourceContentHandlerTest.java @@ -19,8 +19,8 @@ import org.mockito.Mockito; import org.mockito.junit.MockitoJUnitRunner; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; import java.util.Optional; diff --git a/src/test/java/io/github/azagniotov/stubby4j/handlers/StubsPortalHandlerTest.java b/src/test/java/io/github/azagniotov/stubby4j/handlers/StubsPortalHandlerTest.java index 1aa7bec35..7e46390d2 100644 --- a/src/test/java/io/github/azagniotov/stubby4j/handlers/StubsPortalHandlerTest.java +++ b/src/test/java/io/github/azagniotov/stubby4j/handlers/StubsPortalHandlerTest.java @@ -15,12 +15,12 @@ import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; -import javax.servlet.ReadListener; -import javax.servlet.ServletInputStream; -import javax.servlet.ServletOutputStream; -import javax.servlet.WriteListener; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.ReadListener; +import jakarta.servlet.ServletInputStream; +import jakarta.servlet.ServletOutputStream; +import jakarta.servlet.WriteListener; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; diff --git a/src/test/java/io/github/azagniotov/stubby4j/handlers/strategy/DefaultResponseHandlingStrategyTest.java b/src/test/java/io/github/azagniotov/stubby4j/handlers/strategy/DefaultResponseHandlingStrategyTest.java index feab07651..f0b7793d5 100644 --- a/src/test/java/io/github/azagniotov/stubby4j/handlers/strategy/DefaultResponseHandlingStrategyTest.java +++ b/src/test/java/io/github/azagniotov/stubby4j/handlers/strategy/DefaultResponseHandlingStrategyTest.java @@ -14,9 +14,9 @@ import org.mockito.Spy; import org.mockito.junit.MockitoJUnitRunner; -import javax.servlet.ServletOutputStream; -import javax.servlet.WriteListener; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.ServletOutputStream; +import jakarta.servlet.WriteListener; +import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.HashMap; import java.util.TreeMap; diff --git a/src/test/java/io/github/azagniotov/stubby4j/handlers/strategy/RedirectResponseHandlingStrategyTest.java b/src/test/java/io/github/azagniotov/stubby4j/handlers/strategy/RedirectResponseHandlingStrategyTest.java index 994c5914d..5a2b8f8b7 100644 --- a/src/test/java/io/github/azagniotov/stubby4j/handlers/strategy/RedirectResponseHandlingStrategyTest.java +++ b/src/test/java/io/github/azagniotov/stubby4j/handlers/strategy/RedirectResponseHandlingStrategyTest.java @@ -14,7 +14,7 @@ import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletResponse; import java.io.PrintWriter; import java.util.HashMap; import java.util.TreeMap; diff --git a/src/test/java/io/github/azagniotov/stubby4j/server/websocket/StubsServerWebSocketTest.java b/src/test/java/io/github/azagniotov/stubby4j/server/websocket/StubsServerWebSocketTest.java index 9138fc904..1d4ba1816 100644 --- a/src/test/java/io/github/azagniotov/stubby4j/server/websocket/StubsServerWebSocketTest.java +++ b/src/test/java/io/github/azagniotov/stubby4j/server/websocket/StubsServerWebSocketTest.java @@ -10,7 +10,8 @@ import org.eclipse.jetty.websocket.api.RemoteEndpoint; import org.eclipse.jetty.websocket.api.Session; import org.eclipse.jetty.websocket.api.StatusCode; -import org.eclipse.jetty.websocket.servlet.ServletUpgradeRequest; +import org.eclipse.jetty.websocket.api.WriteCallback; +import org.eclipse.jetty.websocket.server.JettyServerUpgradeRequest; import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -53,7 +54,7 @@ public class StubsServerWebSocketTest { private RemoteEndpoint mockRemoteEndpoint; @Mock - private ServletUpgradeRequest mockServletUpgradeRequest; + private JettyServerUpgradeRequest mockServletUpgradeRequest; @Spy private ScheduledExecutorService spyScheduledExecutorService = Executors.newScheduledThreadPool(10); @@ -107,7 +108,7 @@ public void onWebSocketConnect_DispatchesExpectedServerTextResponseWhenPolicyOnc // ScheduledExecutorService, in order to trigger the behavior runnableCaptor.getValue().run(); - verify(mockRemoteEndpoint, times(1)).sendStringByFuture(stringCaptor.capture()); + verify(mockRemoteEndpoint, times(1)).sendString(stringCaptor.capture(), eq(WriteCallback.NOOP)); assertThat(stringCaptor.getValue()).isEqualTo(HELLO_FROM_SERVER); } @@ -137,7 +138,7 @@ public void onWebSocketConnect_DispatchesExpectedServerTextResponseWhenPolicyDis captured.run(); } - verify(mockRemoteEndpoint, times(1)).sendStringByFuture(stringCaptor.capture()); + verify(mockRemoteEndpoint, times(1)).sendString(stringCaptor.capture(), eq(WriteCallback.NOOP)); assertThat(stringCaptor.getValue()).isEqualTo(HELLO_FROM_SERVER); verify(mockSession, times(1)).close(eq(StatusCode.NORMAL), eq("bye")); @@ -169,7 +170,7 @@ public void onWebSocketConnect_DispatchesExpectedServerBinaryResponseWhenPolicyD captured.run(); } - verify(mockRemoteEndpoint, times(1)).sendBytesByFuture(byteBufferCaptor.capture()); + verify(mockRemoteEndpoint, times(1)).sendBytes(byteBufferCaptor.capture(), eq(WriteCallback.NOOP)); assertThat(byteBufferCaptor.getValue()).isEqualTo(BYTE_BUFFER_HELLO_FROM_SERVER); verify(mockSession, times(1)).close(eq(StatusCode.NORMAL), eq("bye")); @@ -199,7 +200,7 @@ public void onWebSocketConnect_DispatchesExpectedServerPeriodicPingResponseWhenP // ScheduledExecutorService, in order to trigger the behavior runnableCaptor.getValue().run(); - verify(mockRemoteEndpoint, times(1)).sendPing(byteBufferCaptor.capture()); + verify(mockRemoteEndpoint, times(1)).sendPing(byteBufferCaptor.capture(), eq(WriteCallback.NOOP)); assertThat(byteBufferCaptor.getValue()).isEqualTo(EMPTY_BYTE_BUFFER); } @@ -226,7 +227,7 @@ public void onWebSocketConnect_DispatchesExpectedServerPeriodicTextResponseWhenP // ScheduledExecutorService, in order to trigger the behavior runnableCaptor.getValue().run(); - verify(mockRemoteEndpoint, times(1)).sendStringByFuture(stringCaptor.capture()); + verify(mockRemoteEndpoint, times(1)).sendString(stringCaptor.capture(), eq(WriteCallback.NOOP)); assertThat(stringCaptor.getValue()).isEqualTo(HELLO_FROM_SERVER); } @@ -253,7 +254,7 @@ public void onWebSocketConnect_DispatchesExpectedServerPeriodicBinaryResponseWhe // ScheduledExecutorService, in order to trigger the behavior runnableCaptor.getValue().run(); - verify(mockRemoteEndpoint, times(1)).sendBytesByFuture(byteBufferCaptor.capture()); + verify(mockRemoteEndpoint, times(1)).sendBytes(byteBufferCaptor.capture(), eq(WriteCallback.NOOP)); assertThat(byteBufferCaptor.getValue()).isEqualTo(BYTE_BUFFER_HELLO_FROM_SERVER); } @@ -282,7 +283,7 @@ public void onWebSocketConnect_DispatchesExpectedServerBinaryResponseWhenPolicyF runnableCaptor.getValue().run(); // FYI: tanuki string bytes[] divided by StubsServerWebSocket.FRAGMENTATION_FRAMES produces 48 chunks - verify(mockRemoteEndpoint, times(48)).sendPartialBytes(byteBufferCaptor.capture(), anyBoolean()); + verify(mockRemoteEndpoint, times(48)).sendPartialBytes(byteBufferCaptor.capture(), anyBoolean(), eq(WriteCallback.NOOP)); final List allCapturedFragments = byteBufferCaptor.getAllValues(); assertThat(allCapturedFragments.size()).isEqualTo(48); @@ -322,7 +323,7 @@ public void onWebSocketText_DispatchesExpectedServerTextResponseWhenPolicyOnce() // ScheduledExecutorService, in order to trigger the behavior runnableCaptor.getValue().run(); - verify(mockRemoteEndpoint, times(1)).sendStringByFuture(stringCaptor.capture()); + verify(mockRemoteEndpoint, times(1)).sendString(stringCaptor.capture(), eq(WriteCallback.NOOP)); assertThat(stringCaptor.getValue()).isEqualTo(HELLO_FROM_SERVER); } diff --git a/src/test/java/io/github/azagniotov/stubby4j/stubs/StubRepositoryTest.java b/src/test/java/io/github/azagniotov/stubby4j/stubs/StubRepositoryTest.java index 31ae70d9a..79995b6ee 100644 --- a/src/test/java/io/github/azagniotov/stubby4j/stubs/StubRepositoryTest.java +++ b/src/test/java/io/github/azagniotov/stubby4j/stubs/StubRepositoryTest.java @@ -19,7 +19,7 @@ import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import java.io.File; import java.io.IOException; import java.util.Arrays; diff --git a/src/test/java/io/github/azagniotov/stubby4j/utils/ByteUtilsTest.java b/src/test/java/io/github/azagniotov/stubby4j/utils/ByteUtilsTest.java new file mode 100644 index 000000000..f9265533d --- /dev/null +++ b/src/test/java/io/github/azagniotov/stubby4j/utils/ByteUtilsTest.java @@ -0,0 +1,29 @@ +package io.github.azagniotov.stubby4j.utils; + + +import org.junit.Test; + +import java.nio.ByteBuffer; + +import static com.google.common.truth.Truth.assertThat; + +public class ByteUtilsTest { + private static final String TANUKI = "The Japanese raccoon dog is known as the tanuki."; + private static final byte[] ORIGINAL_STRING_BYTES = StringUtils.getBytesUtf8(TANUKI); + + @Test + public void extractArrayFromByteBuffer() throws Exception { + final ByteBuffer byteBuffer = ByteBuffer.wrap(ORIGINAL_STRING_BYTES); + final byte[] bytes = ByteUtils.extractByteArrayFromByteBuffer(byteBuffer); + + assertThat(StringUtils.newStringUtf8(bytes)).isEqualTo(TANUKI); + } + + @Test + public void extractArrayFromReadOnlyByteBuffer() throws Exception { + final ByteBuffer readOnlyBuffer = ByteBuffer.wrap(ORIGINAL_STRING_BYTES).asReadOnlyBuffer(); + final byte[] bytes = ByteUtils.extractByteArrayFromByteBuffer(readOnlyBuffer); + + assertThat(StringUtils.newStringUtf8(bytes)).isEqualTo(TANUKI); + } +} \ No newline at end of file