From 46f42b89dda5bff12c8bf49491603cfe11192ff6 Mon Sep 17 00:00:00 2001 From: Leonid Stashevsky Date: Sat, 22 Dec 2018 09:10:21 +0300 Subject: [PATCH] Migrate to kotlin-multiplatform plugin --- .gitignore | 1 + binary-compatibility-validator/build.gradle | 32 ++-- .../jvm/src/kotlinVisibilities.kt | 1 + .../jvm/test/PublicApiTest.kt | 10 +- .../jvm/test/utils.kt | 2 +- .../reference-public-api/ktor-client-core.txt | 6 + .../reference-public-api/ktor-http-cio.txt | 27 +--- .../reference-public-api/ktor-http.txt | 78 +++++++++ .../reference-public-api/ktor-utils.txt | 20 +++ build.gradle | 119 +++++++------- gradle.properties | 11 +- gradle/atomicfu-common.gradle | 4 - gradle/atomicfu-js.gradle | 3 - gradle/atomicfu-jvm.gradle | 7 - gradle/atomicfu-native.gradle | 5 - gradle/bintray.gradle | 28 ---- gradle/common.gradle | 45 ++---- gradle/compatibility.gradle | 56 +++---- gradle/darwin.gradle | 38 +++++ gradle/dokka.gradle | 23 ++- gradle/engines.gradle | 7 - gradle/experimental.gradle | 12 +- gradle/ide.gradle | 17 ++ gradle/js.gradle | 150 ++++++++---------- gradle/jvm.gradle | 113 ++++++------- gradle/maven.gradle | 34 ---- gradle/native.gradle | 36 ----- gradle/nodejs.gradle | 43 +++++ gradle/platform.gradle | 36 ----- gradle/pom.gradle | 37 +++++ gradle/posix.gradle | 41 +++++ gradle/publish.gradle | 117 +++++++++++--- gradle/utility.gradle | 34 ++++ jvm/.gitkeep | 0 ktor-client/build.gradle | 7 +- ktor-client/jvm/.gitkeep | 0 ktor-client/ktor-client-android/build.gradle | 14 +- .../io.ktor.client.HttpClientEngineContainer | 0 .../io/ktor/client/engine/android/Android.kt | 0 .../engine/android/AndroidClientEngine.kt | 0 .../engine/android/AndroidEngineConfig.kt | 0 .../engine/android/AndroidHttpRequest.kt | 0 .../engine/android/AndroidHttpResponse.kt | 0 .../client/engine/android/AndroidHttpsTest.kt | 2 +- .../client/engine/android/AndroidProxyTest.kt | 0 .../ktor/client/engine/android/CommonTests.kt | 0 ktor-client/ktor-client-apache/build.gradle | 15 +- .../io.ktor.client.HttpClientEngineContainer | 0 .../io/ktor/client/engine/apache/Apache.kt | 0 .../ktor/client/engine/apache/ApacheEngine.kt | 0 .../engine/apache/ApacheEngineConfig.kt | 0 .../client/engine/apache/ApacheHttpRequest.kt | 0 .../engine/apache/ApacheHttpResponse.kt | 0 .../engine/apache/ApacheRequestProducer.kt | 0 .../engine/apache/ApacheResponseConsumer.kt | 0 .../ktor/client/engine/apache/CommonTests.kt | 0 ktor-client/ktor-client-cio/build.gradle | 19 ++- .../io.ktor.client.HttpClientEngineContainer | 0 .../src/io/ktor/client/engine/cio/CIO.kt | 0 .../io/ktor/client/engine/cio/CIOEngine.kt | 0 .../ktor/client/engine/cio/CIOEngineConfig.kt | 0 .../ktor/client/engine/cio/CIOHttpResponse.kt | 1 - .../client/engine/cio/ConnectionFactory.kt | 0 .../client/engine/cio/ConnectionPipeline.kt | 8 +- .../src/io/ktor/client/engine/cio/Endpoint.kt | 0 .../io/ktor/client/engine/cio/EngineTasks.kt | 0 .../src/io/ktor/client/engine/cio/utils.kt | 0 .../io/ktor/client/engine/cio/CIOHttpsTest.kt | 0 .../ktor/client/engine/cio/CIORequestTest.kt | 0 .../io/ktor/client/engine/cio/CommonTests.kt | 0 ktor-client/ktor-client-core/build.gradle | 18 ++- .../src/io/ktor/client/HttpClient.kt | 2 +- .../src/io/ktor/client/HttpClientConfig.kt | 2 +- .../src/io/ktor/client/call/HttpClientCall.kt | 0 .../src/io/ktor/client/call/TypeInfo.kt | 0 .../src/io/ktor/client/call/utils.kt | 12 ++ .../io/ktor/client/engine/HttpClientEngine.kt | 0 .../client/engine/HttpClientEngineConfig.kt | 0 .../src/io/ktor/client/engine/Utils.kt | 0 .../io/ktor/client/features/DefaultRequest.kt | 0 .../ktor/client/features/DefaultTransform.kt | 0 .../io/ktor/client/features/ExpectSuccess.kt | 0 .../ktor/client/features/HttpClientFeature.kt | 0 .../io/ktor/client/features/HttpPlainText.kt | 7 +- .../io/ktor/client/features/HttpRedirect.kt | 0 .../src/io/ktor/client/features/HttpSend.kt | 0 .../src/io/ktor/client/features/UserAgent.kt | 0 .../cookies/AcceptAllCookiesStorage.kt | 0 .../cookies/ConstantCookiesStorage.kt | 0 .../client/features/cookies/CookiesStorage.kt | 0 .../client/features/cookies/HttpCookies.kt | 0 .../client/features/observer/DelegatedCall.kt | 0 .../features/observer/ResponseObserver.kt | 0 .../src/io/ktor/client/request/Content.kt | 0 .../src/io/ktor/client/request/HttpRequest.kt | 3 + .../client/request/HttpRequestPipeline.kt | 0 .../src/io/ktor/client/request/builders.kt | 22 +++ .../io/ktor/client/request/buildersWithUrl.kt | 109 +++++++++++++ .../client/request/forms/FormDataContent.kt | 0 .../ktor/client/request/forms/formBuilders.kt | 0 .../io/ktor/client/request/forms/formDsl.kt | 0 .../src/io/ktor/client/request/utils.kt | 0 .../io/ktor/client/response/HttpResponse.kt | 0 .../client/response/HttpResponseConfig.kt | 0 .../client/response/HttpResponsePipeline.kt | 0 .../src/io/ktor/client/response/readers.kt | 0 .../src/io/ktor/client/utils/CIO.kt | 0 .../src/io/ktor/client/utils/Content.kt | 0 .../io/ktor/client/utils/HttpCacheControl.kt | 0 .../src/io/ktor/client/utils/headers.kt | 0 .../{ => common}/test/TypeInfoTest.kt | 0 .../js/src/io/ktor/client/HttpClientJs.kt | 13 ++ .../src/io/ktor/client/call/TypeInfoJs.kt | 0 .../src/io/ktor/client/engine/js/Js.kt | 0 .../ktor/client/engine/js/JsClientEngine.kt | 0 .../ktor/client/engine/js/JsHttpResponse.kt | 0 .../src/io/ktor/client/engine/js/JsUtils.kt | 0 .../ktor/client/engine/js/ReadableStream.kt | 0 .../ktor/client/engine/js/compatible/Utils.kt | 0 .../js/compatible/browser/BrowserUtils.kt | 0 .../engine/js/compatible/node/NodeUtils.kt | 0 .../client/features/DefaultTransformJs.kt | 0 .../src/io/ktor/client/HttpClientJvm.kt | 9 +- .../src/io/ktor/client/call/TypeInfoJvm.kt | 0 .../src/io/ktor/client/call/utilsJvm.kt | 0 .../ktor/client/engine/HttpClientJvmEngine.kt | 0 .../client/features/DefaultTransformersJvm.kt | 0 .../io/ktor/client/request/HttpRequestJvm.kt | 0 .../src/io/ktor/client/request/buildersJvm.kt | 0 .../src/io/ktor/client/utils/CIOJvm.kt | 0 .../test/CookiesTest.kt | 0 .../test/TypeInfoTestJvm.kt | 0 .../test/UserAgentTest.kt | 0 .../ktor-client-core-ios/build.gradle | 6 - .../src/io/ktor/client/HttpClientIos.kt | 7 - .../src/io/ktor/client/engine/ios/Ios.kt | 5 - .../ktor-client-core-js/build.gradle | 9 -- .../src/io/ktor/client/HttpClientJs.kt | 7 - .../ktor-client-core-jvm/build.gradle | 11 -- .../posix/src/io/ktor/client/HttpClient.kt | 17 ++ .../src/io/ktor/client/call/TypeInfoIos.kt | 0 .../posix/src/io/ktor/client/engine/Loader.kt | 10 ++ .../client/features/DefaultTransformIos.kt | 0 ktor-client/ktor-client-features/build.gradle | 8 +- ktor-client/ktor-client-features/jvm/.gitkeep | 0 .../ktor-client-auth-basic/build.gradle | 17 +- .../client/features/auth/basic/BasicAuth.kt | 4 +- .../features/auth/basic/BasicAuthTest.kt | 3 +- .../test}/BasicAuthTestWithServer.kt | 0 .../ktor-client-auth/build.gradle | 17 +- .../src/io/ktor/client/features/auth/Auth.kt | 0 .../auth/providers/BasicAuthProvider.kt | 0 .../auth/providers/DigestAuthProvider.kt | 4 +- .../{ => jvm}/test/DigestTest.kt | 0 .../ktor-client-json/build.gradle | 26 ++- .../ktor/client/features/json/JsonFeature.kt | 0 .../client/features/json/JsonSerializer.kt | 0 .../json/serializer/KotlinxSerializer.kt | 0 .../test/KotlinxSerializerTest.kt | 0 .../ktor/client/features/json/DefaultJs.kt} | 6 +- .../js/test/JsSerializerTest.kt} | 0 ...o.ktor.client.features.json.JsonSerializer | 1 + .../ktor/client/features/json/DefaultJvm.kt | 9 +- .../ktor-client-gson/build.gradle | 18 ++- ...o.ktor.client.features.json.JsonSerializer | 0 .../client/features/json/GsonSerializer.kt | 0 .../client/features/json/tests/GsonTest.kt | 0 .../ktor-client-jackson/build.gradle | 19 ++- ...o.ktor.client.features.json.JsonSerializer | 0 .../client/features/json/JacksonSerializer.kt | 0 .../client/features/json/tests/JacksonTest.kt | 0 .../ktor-client-json-ios/build.gradle | 8 - .../ktor-client-json-js/build.gradle | 8 - .../ktor-client-json-jvm/build.gradle | 18 --- .../features/json/tests/KotlinxJsonTest.kt | 12 -- .../ktor-client-json-tests/build.gradle | 24 +-- .../client/features/json/tests/JsonTest.kt | 28 ++-- .../jvm/test}/DefaultSerializerJsonTest.kt | 4 +- .../client/features/json/DefaultPosix.kt} | 0 .../ktor-client-logging/build.gradle | 13 ++ .../ktor-client-logging/build.gradle.kts | 4 - .../ktor/client/features/logging/LogLevel.kt | 0 .../io/ktor/client/features/logging/Logger.kt | 0 .../ktor/client/features/logging/Logging.kt | 13 +- .../ktor/client/features/logging/LoggerJs.kt | 0 .../ktor/client/features/logging/LoggerJvm.kt | 0 .../client/features/logging/LoggingTest.kt | 0 .../ktor-client-logging-ios/build.gradle.kts | 6 - .../ktor-client-logging-js/build.gradle.kts | 6 - .../ktor-client-logging-jvm/build.gradle.kts | 10 -- .../ktor/client/features/logging/LoggerIos.kt | 0 .../ktor-client-websocket/build.gradle | 16 +- .../features/websocket/ClientSessions.kt | 0 .../features/websocket/WebSocketContent.kt | 0 .../client/features/websocket/WebSockets.kt | 0 .../client/features/websocket/builders.kt | 0 .../features/websocket/WebSocketTest.kt | 0 ktor-client/ktor-client-ios/build.gradle | 12 +- .../src/io/ktor/client/engine/ios/Ios.kt | 16 ++ .../ktor/client/engine/ios/IosClientEngine.kt | 7 +- .../engine/ios/IosClientEngineConfig.kt | 11 +- .../ktor/client/engine/ios/IosHttpResponse.kt | 0 .../src/io/ktor/client/engine/ios/Utils.kt | 0 .../darwin/test/IosEnginesTest.kt | 42 +++++ .../ktor-client-ios/darwin/test/utils.kt | 75 +++++++++ .../src/io/ktor/client/engine/ios/Ios.kt | 10 -- ktor-client/ktor-client-jetty/build.gradle | 12 +- .../src/io/ktor/client/engine/jetty/Jetty.kt | 0 .../client/engine/jetty/JettyEngineConfig.kt | 0 .../client/engine/jetty/JettyHttp2Engine.kt | 0 .../client/engine/jetty/JettyHttp2Request.kt | 0 .../client/engine/jetty/JettyHttpRequest.kt | 0 .../client/engine/jetty/JettyHttpResponse.kt | 0 .../engine/jetty/JettyResponseListener.kt | 0 .../src/io/ktor/client/engine/jetty/utils.kt | 0 ktor-client/ktor-client-js/build.gradle | 9 +- ktor-client/ktor-client-js/{ => js}/src/Js.kt | 0 ktor-client/ktor-client-mock/build.gradle | 6 +- .../io/ktor/client/engine/mock/MockEngine.kt | 6 +- .../client/engine/mock/MockEngineConfig.kt | 0 .../client/engine/mock/MockHttpRequest.kt | 0 .../client/engine/mock/MockHttpResponse.kt | 0 .../client/tests/mock}/MockEngineTests.kt | 4 + .../ktor-client-mock-ios/build.gradle | 6 - .../ktor-client-mock-js/build.gradle | 6 - .../ktor-client-mock-jvm/build.gradle | 6 - ktor-client/ktor-client-okhttp/build.gradle | 15 +- .../io.ktor.client.HttpClientEngineContainer | 0 .../io/ktor/client/engine/okhttp/OkHttp.kt | 0 .../ktor/client/engine/okhttp/OkHttpConfig.kt | 0 .../ktor/client/engine/okhttp/OkHttpEngine.kt | 0 .../client/engine/okhttp/OkHttpResponse.kt | 0 .../io/ktor/client/engine/okhttp/OkUtils.kt | 0 .../client/engine/okhttp/StreamRequestBody.kt | 0 .../ktor/client/engine/okhttp/CommonTests.kt | 0 .../ktor/client/engine/okhttp/RequestTests.kt | 0 ktor-client/ktor-client-tests/build.gradle | 27 ++-- .../io/ktor/client/tests/AttributesTest.kt | 0 .../src/io/ktor/client/tests/BuildersTest.kt | 0 .../src/io/ktor/client/tests/CacheTest.kt | 0 .../io/ktor/client/tests/ConnectionTest.kt | 0 .../src/io/ktor/client/tests/ContentTest.kt | 0 .../src/io/ktor/client/tests/CookiesTest.kt | 0 .../src/io/ktor/client/tests/FeaturesTest.kt | 0 .../src/io/ktor/client/tests/FullFormTest.kt | 0 .../io/ktor/client/tests/HttpClientTest.kt | 0 .../io/ktor/client/tests/HttpRedirectTest.kt | 0 .../io/ktor/client/tests/MultithreadedTest.kt | 0 .../src/io/ktor/client/tests/PostTest.kt | 0 .../io/ktor/client/tests/cio/SemaphoreTest.kt | 0 .../client/tests/utils/ClientTestUtils.kt | 0 .../ktor/client/tests/utils/TestWithKtor.kt | 0 .../io/ktor/client/tests/utils/generators.kt | 0 .../io/ktor/client/tests/DefaultEngineTest.kt | 0 ktor-features/build.gradle | 18 ++- ktor-features/jvm/.gitkeep | 0 ktor-features/ktor-auth-jwt/build.gradle | 20 ++- .../{ => jvm}/src/io/ktor/auth/jwt/JWTAuth.kt | 0 .../test/io/ktor/auth/jwt/JWTAuthTest.kt | 0 ktor-features/ktor-auth-ldap/build.gradle | 13 +- .../{ => jvm}/src/io/ktor/auth/ldap/Ldap.kt | 0 .../io/ktor/tests/auth/ldap/LdapAuthTest.kt | 0 ktor-features/ktor-auth/build.gradle | 17 +- .../src/io/ktor/auth/Authentication.kt | 0 .../src/io/ktor/auth/AuthenticationContext.kt | 0 .../io/ktor/auth/AuthenticationFailedCause.kt | 0 .../io/ktor/auth/AuthenticationPipeline.kt | 0 .../auth/AuthenticationProcedureChallenge.kt | 0 .../io/ktor/auth/AuthenticationProvider.kt | 0 .../{ => jvm}/src/io/ktor/auth/BasicAuth.kt | 0 .../{ => jvm}/src/io/ktor/auth/DigestAuth.kt | 0 .../{ => jvm}/src/io/ktor/auth/FormAuth.kt | 0 .../{ => jvm}/src/io/ktor/auth/Headers.kt | 0 .../{ => jvm}/src/io/ktor/auth/OAuth.kt | 0 .../{ => jvm}/src/io/ktor/auth/OAuth1a.kt | 0 .../{ => jvm}/src/io/ktor/auth/OAuth2.kt | 0 .../src/io/ktor/auth/OAuthProcedure.kt | 0 .../{ => jvm}/src/io/ktor/auth/Principal.kt | 0 .../{ => jvm}/src/io/ktor/auth/SessionAuth.kt | 0 .../{ => jvm}/src/io/ktor/auth/SimpleAuth.kt | 0 .../src/io/ktor/auth/UnauthorizedResponse.kt | 0 .../io/ktor/tests/auth/AuthBuildersTest.kt | 0 .../io/ktor/tests/auth/AuthHeadersTest.kt | 0 .../test/io/ktor/tests/auth/AuthTests.kt | 0 .../test/io/ktor/tests/auth/BasicAuthTest.kt | 0 .../test/io/ktor/tests/auth/CryptoTest.kt | 0 .../test/io/ktor/tests/auth/DigestTest.kt | 0 .../test/io/ktor/tests/auth/HttpClientTest.kt | 0 .../test/io/ktor/tests/auth/OAuth1a.kt | 0 .../test/io/ktor/tests/auth/OAuth2.kt | 0 .../io/ktor/tests/auth/SessionAuthTest.kt | 0 .../tests/auth/UserHashedTableAuthTest.kt | 0 ktor-features/ktor-freemarker/build.gradle | 5 +- .../src/io/ktor/freemarker/FreeMarker.kt | 0 .../src/io/ktor/freemarker/RespondTemplate.kt | 0 .../ktor/tests/freemarker/FreeMarkerTest.kt | 0 ktor-features/ktor-gson/build.gradle | 7 +- .../{ => jvm}/src/io/ktor/gson/GsonSupport.kt | 0 .../test/io/ktor/tests/gson/GsonTest.kt | 0 ktor-features/ktor-html-builder/build.gradle | 4 +- .../{ => jvm}/src/io/ktor/html/RespondHtml.kt | 0 .../src/io/ktor/html/RespondHtmlTemplate.kt | 0 .../{ => jvm}/src/io/ktor/html/Template.kt | 0 .../io/ktor/tests/html/HtmlBuilderTest.kt | 0 .../io/ktor/tests/html/HtmlTemplateTest.kt | 0 ktor-features/ktor-jackson/build.gradle | 10 +- .../src/io/ktor/jackson/JacksonConverter.kt | 0 .../test/io/ktor/tests/jackson/JacksonTest.kt | 0 ktor-features/ktor-locations/build.gradle | 4 +- .../src/io/ktor/locations/Location.kt | 0 .../src/io/ktor/locations/Locations.kt | 0 .../src/io/ktor/locations/URLBuilder.kt | 0 .../tests/locations/CustomLocationsTest.kt | 0 .../io/ktor/tests/locations/LocationsTest.kt | 0 .../tests/locations/OAuthLocationsTest.kt | 0 .../test/io/ktor/tests/locations/Verifiers.kt | 0 ktor-features/ktor-metrics/build.gradle | 12 +- .../{ => jvm}/src/io/ktor/metrics/Metrics.kt | 0 ktor-features/ktor-mustache/build.gradle | 5 +- .../src/io/ktor/mustache/Mustache.kt | 0 .../src/io/ktor/mustache/RespondTemplate.kt | 0 .../test-resources/withPlaceholder.mustache | 0 .../withoutPlaceholder.mustache | 0 .../test/io/ktor/mustache/MustacheTest.kt | 0 .../{ => jvm}/src/io/ktor/sessions/Cache.kt | 0 .../src/io/ktor/sessions/CacheStorage.kt | 0 .../src/io/ktor/sessions/DirectoryStorage.kt | 0 .../test/io/ktor/tests/sessions/CacheTest.kt | 0 .../sessions/DirectorySessionStorageTest.kt | 0 ktor-features/ktor-velocity/build.gradle | 10 +- .../src/io/ktor/velocity/RespondTemplate.kt | 0 .../src/io/ktor/velocity/Velocity.kt | 0 .../io/ktor/tests/velocity/VelocityTest.kt | 0 ktor-features/ktor-webjars/build.gradle | 18 ++- .../{ => jvm}/src/io/ktor/webjars/Webjars.kt | 14 +- .../test/io/ktor/webjars/WebjarsTest.kt | 0 ktor-features/ktor-websockets/build.gradle | 17 +- .../src/io/ktor/websocket/Routing.kt | 0 .../ktor/websocket/WebSocketServerSession.kt | 0 .../src/io/ktor/websocket/WebSocketUpgrade.kt | 0 .../src/io/ktor/websocket/WebSockets.kt | 0 .../ktor/tests/websocket/CIOWebSocketTest.kt | 0 .../tests/websocket/JettyWebSocketTest.kt | 0 .../tests/websocket/NettyWebSocketTest.kt | 0 .../io/ktor/tests/websocket/ParserTest.kt | 0 .../tests/websocket/TomcatWebSocketTest.kt | 0 .../tests/websocket/WebSocketEngineSuite.kt | 0 .../io/ktor/tests/websocket/WebSocketTest.kt | 0 .../WebSocketWithContentNegotiationTest.kt | 0 .../io/ktor/tests/websocket/WriterTest.kt | 0 ktor-http/build.gradle | 4 +- .../src/io/ktor/content/Compatibility.kt | 0 .../http/ApplicationResponseProperties.kt | 0 .../src/io/ktor/http/CacheControl.kt | 0 .../{ => common}/src/io/ktor/http/Codecs.kt | 0 .../src/io/ktor/http/ContentDisposition.kt | 0 .../src/io/ktor/http/ContentRange.kt | 0 .../src/io/ktor/http/ContentTypes.kt | 0 .../{ => common}/src/io/ktor/http/Cookie.kt | 0 .../src/io/ktor/http/DateUtils.kt | 0 .../src/io/ktor/http/FileContentType.kt | 0 .../io/ktor/http/HeaderValueWithParameters.kt | 0 .../{ => common}/src/io/ktor/http/Headers.kt | 0 .../src/io/ktor/http/HttpHeaderValueParser.kt | 0 .../src/io/ktor/http/HttpHeaders.kt | 0 .../src/io/ktor/http/HttpMessage.kt | 0 .../src/io/ktor/http/HttpMessageProperties.kt | 0 .../src/io/ktor/http/HttpMethod.kt | 0 .../src/io/ktor/http/HttpProtocolVersion.kt | 0 .../src/io/ktor/http/HttpStatusCode.kt | 0 .../src/io/ktor/http/HttpUrlEncoded.kt | 0 .../{ => common}/src/io/ktor/http/IpParser.kt | 0 .../src/io/ktor/http/LinkHeader.kt | 0 .../{ => common}/src/io/ktor/http/Mimes.kt | 0 .../src/io/ktor/http/Parameters.kt | 0 .../{ => common}/src/io/ktor/http/Query.kt | 0 .../{ => common}/src/io/ktor/http/Ranges.kt | 0 .../src/io/ktor/http/RangesSpecifier.kt | 0 .../io/ktor/http/RequestConnectionPoint.kt | 0 .../src/io/ktor/http/URLBuilder.kt | 0 .../src/io/ktor/http/URLParser.kt | 0 .../src/io/ktor/http/URLProtocol.kt | 0 .../{ => common}/src/io/ktor/http/URLUtils.kt | 0 .../src/io/ktor/http/auth/AuthScheme.kt | 0 .../io/ktor/http/auth/HeaderValueEncoding.kt | 0 .../src/io/ktor/http/auth/HttpAuthHeader.kt | 0 .../io/ktor/http/content/ByteArrayContent.kt | 0 .../io/ktor/http/content/CachingOptions.kt | 13 +- .../src/io/ktor/http/content/Multipart.kt | 0 .../io/ktor/http/content/OutgoingContent.kt | 0 .../src/io/ktor/http/content/TextContent.kt | 0 .../src/io/ktor/http/parsing/Debug.kt | 0 .../io/ktor/http/parsing/GrammarBuilder.kt | 0 .../src/io/ktor/http/parsing/Parser.kt | 0 .../src/io/ktor/http/parsing/ParserDsl.kt | 0 .../src/io/ktor/http/parsing/Primitives.kt | 0 .../io/ktor/http/parsing/regex/RegexParser.kt | 0 .../parsing/regex/RegexParserGenerator.kt | 0 .../test/io/ktor/tests/http/CodecTest.kt | 0 .../ktor/tests/http/ContentTypeLookupTest.kt | 0 .../ktor/tests/http/ContentTypeMatchTest.kt | 0 .../io/ktor/tests/http/ContentTypeTest.kt | 0 .../test/io/ktor/tests/http/HeadersTest.kt | 0 .../io/ktor/tests/http/HttpStatusCodeTest.kt | 0 .../io/ktor/tests/http/QueryParametersTest.kt | 0 .../test/io/ktor/tests/http/RangesTest.kt | 0 .../test/io/ktor/tests/http/URLBuilderTest.kt | 0 .../test/io/ktor/tests/http/UrlTest.kt | 0 .../http/ApplicationResponsePropertiesJvm.kt | 0 .../src/io/ktor/http/FileContentTypeJvm.kt | 0 .../src/io/ktor/http/HttpDate.kt | 0 .../io/ktor/http/HttpMessagePropertiesJvm.kt | 0 .../src/io/ktor/http/URLBuilderJvm.kt | 0 .../src/io/ktor/http/URLUtilsJvm.kt | 0 .../io/ktor/http/content/CachingOptionsJvm.kt | 0 .../io/ktor/http/content/JarFileContent.kt | 0 .../io/ktor/http/content/LocalFileContent.kt | 0 .../src/io/ktor/http/content/MultipartJvm.kt | 0 .../io/ktor/http/content/URIFileContent.kt | 6 + .../src/io/ktor/http/content/Versions.kt | 0 .../src/io/ktor/http/content/WriterContent.kt | 0 .../src/io/ktor/http/websocket/Utils.kt | 0 .../io/ktor/tests/http/URLBuilderTest.kt} | 3 +- ktor-http/ktor-http-cio/build.gradle | 14 +- .../src/io/ktor/http/cio/CIOHeaders.kt | 2 +- .../ktor/http/cio/ChunkedTransferEncoding.kt | 45 +++--- .../src/io/ktor/http/cio/ConnectionOptions.kt | 53 ++++--- .../src/io/ktor/http/cio/HttpBody.kt | 38 ++--- .../src/io/ktor/http/cio/HttpHeadersMap.kt | 19 ++- .../src/io/ktor/http/cio/HttpParser.kt | 35 +++- .../src/io/ktor/http/cio/RequestResponse.kt | 11 +- .../ktor/http/cio/internals/AsciiCharTree.kt | 39 +++-- .../http/cio/internals/CharArrayBuilder.kt} | 95 ++++++----- .../ktor/http/cio/internals/CharArrayPool.kt | 16 ++ .../src/io/ktor/http/cio/internals/Chars.kt | 25 +-- .../ktor/http/cio/internals/MutableRange.kt | 0 .../io/ktor/http/cio/internals/Tokenizer.kt | 0 .../tests/http/cio/CharArrayBuilderTest.kt} | 39 +++-- .../src/io/ktor/http/cio/CIOMultipartData.kt | 4 +- .../src/io/ktor/http/cio/Multipart.kt | 10 +- .../src/io/ktor/http/cio/Pipeline.kt | 0 .../ktor/http/cio/RequestResponseBuilder.kt | 0 .../io/ktor/http/cio/internals/CharsJvm.kt | 20 +++ .../http/cio/internals/HttpByteBufferPool.kt | 11 +- .../http/cio/internals/WeakTimeoutQueue.kt | 23 +-- .../io/ktor/http/cio/websocket/CloseReason.kt | 0 .../cio/websocket/DefaultWebSocketSession.kt | 0 .../websocket/DefaultWebSocketSessionImpl.kt | 0 .../src/io/ktor/http/cio/websocket/Frame.kt | 0 .../io/ktor/http/cio/websocket/FrameParser.kt | 0 .../io/ktor/http/cio/websocket/PingPong.kt | 0 .../ktor/http/cio/websocket/RawWebSocket.kt | 0 .../io/ktor/http/cio/websocket/Serializer.kt | 0 .../cio/websocket/SimpleFrameCollector.kt | 0 .../src/io/ktor/http/cio/websocket/Utils.kt | 0 .../cio/websocket/WebSocketInternalAPI.kt | 0 .../http/cio/websocket/WebSocketReader.kt | 0 .../http/cio/websocket/WebSocketSession.kt | 0 .../http/cio/websocket/WebSocketWriter.kt | 0 .../io/ktor/tests/http/cio/ChunkedTest.kt | 15 +- .../io/ktor/tests/http/cio/HeadersTest.kt | 2 +- .../io/ktor/tests/http/cio/IntegrationTest.kt | 0 .../io/ktor/tests/http/cio/MultipartTest.kt | 0 .../ktor/tests/http/cio/RequestParserTest.kt | 0 .../http/cio/RequestResponseBuilderTest.kt | 4 +- .../io/ktor/tests/http/cio/TestHttpServer.kt | 25 ++- .../tests/http/cio/WeakTimeoutQueueTest.kt | 0 .../ktor/http/cio/internals/CharBufferPool.kt | 28 ---- ktor-http/ktor-http-ios/build.gradle | 6 - ktor-http/ktor-http-js/build.gradle | 6 - ktor-http/ktor-http-jvm/build.gradle | 6 - ktor-network/build.gradle | 6 +- .../network/selector/ActorSelectorManager.kt | 0 .../selector/InterestSuspensionsMap.kt | 0 .../network/selector/LockFreeMPSCQueue.kt | 0 .../io/ktor/network/selector/Selectable.kt | 0 .../ktor/network/selector/SelectorManager.kt | 0 .../selector/SelectorManagerSupport.kt | 0 .../src/io/ktor/network/sockets/Builders.kt | 0 .../src/io/ktor/network/sockets/CIOReader.kt | 0 .../src/io/ktor/network/sockets/CIOWriter.kt | 0 .../src/io/ktor/network/sockets/Datagram.kt | 0 .../network/sockets/DatagramSocketImpl.kt | 0 .../src/io/ktor/network/sockets/NIOSocket.kt | 0 .../ktor/network/sockets/ServerSocketImpl.kt | 0 .../src/io/ktor/network/sockets/SocketImpl.kt | 0 .../src/io/ktor/network/sockets/Sockets.kt | 0 .../src/io/ktor/network/util/Coroutines.kt | 0 .../network/util/IOCoroutineDispatcher.kt | 0 .../src/io/ktor/network/util/Pools.kt | 0 .../network/sockets/tests/ClientSocketTest.kt | 0 .../network/sockets/tests/ServerSocketTest.kt | 0 ktor-network/ktor-network-tls/build.gradle | 8 +- .../src/io/ktor/network/tls/Cipher.kt | 0 .../src/io/ktor/network/tls/CipherSuites.kt | 0 .../src/io/ktor/network/tls/Hashes.kt | 0 .../src/io/ktor/network/tls/Headers.kt | 0 .../{ => jvm}/src/io/ktor/network/tls/Keys.kt | 0 .../{ => jvm}/src/io/ktor/network/tls/OID.kt | 0 .../src/io/ktor/network/tls/Parser.kt | 0 .../src/io/ktor/network/tls/Render.kt | 0 .../{ => jvm}/src/io/ktor/network/tls/TLS.kt | 0 .../src/io/ktor/network/tls/TLSAlert.kt | 0 .../io/ktor/network/tls/TLSClientHandshake.kt | 0 .../io/ktor/network/tls/TLSClientSession.kt | 0 .../io/ktor/network/tls/TLSHandshakeType.kt | 0 .../src/io/ktor/network/tls/TLSRecordType.kt | 0 .../src/io/ktor/network/tls/TLSVersion.kt | 0 .../src/io/ktor/network/tls/Utils.kt | 0 .../network/tls/certificates/Certificates.kt | 0 .../ktor/network/tls/certificates/builders.kt | 0 .../network/tls/extensions/NamedCurves.kt | 0 .../network/tls/extensions/PointFormat.kt | 0 .../tls/extensions/SignatureAlgorithm.kt | 0 .../network/tls/extensions/TLSExtension.kt | 0 .../network/tls/platform/PlatformVersion.kt | 0 .../ktor/network/tls/tests/ConnectionTests.kt | 4 +- ktor-server/jvm/.gitkeep | 0 .../ktor-server-benchmarks/build.gradle | 49 ++++-- .../benchmarks/AsyncIntegrationBenchmark.kt | 0 .../ktor/server/benchmarks/BenchmarkRunner.kt | 0 .../server/benchmarks/CIOChunkedBenchmark.kt | 0 .../server/benchmarks/ChannelBenchmarks.kt | 0 .../ktor/server/benchmarks/CodecsBenchmark.kt | 0 .../benchmarks/HttpBenchmarkAsyncClients.kt | 0 .../server/benchmarks/HttpBenchmarkClient.kt | 0 .../server/benchmarks/IntegrationBenchmark.kt | 0 .../server/benchmarks/PipelineBenchmark.kt | 0 .../server/benchmarks/PlatformBenchmark.kt | 0 .../server/benchmarks/RoutingBenchmark.kt | 0 .../benchmarks/StringValuesBenchmark.kt | 0 .../benchmarks/cio/CIOIntegrationBenchmark.kt | 0 .../benchmarks/cio/CIOPlatformBenchmark.kt | 0 .../jetty/JettyIntegrationBenchmark.kt | 0 .../jetty/JettyPlatformBenchmark.kt | 0 .../netty/NettyIntegrationBenchmark.kt | 0 .../netty/NettyPlatformBenchmark.kt | 0 .../test/TestIntegrationBenchmark.kt | 0 ktor-server/ktor-server-cio/build.gradle | 18 ++- .../{ => jvm}/src/io/ktor/server/cio/CIO.kt | 0 .../io/ktor/server/cio/CIOApplicationCall.kt | 0 .../ktor/server/cio/CIOApplicationEngine.kt | 0 .../ktor/server/cio/CIOApplicationRequest.kt | 3 +- .../ktor/server/cio/CIOApplicationResponse.kt | 0 .../src/io/ktor/server/cio/EngineMain.kt | 0 .../src/io/ktor/server/cio/HttpServer.kt | 5 +- .../io/ktor/tests/server/cio/CIOEngineTest.kt | 0 .../tests/server/cio/CIOHttpClientTest.kt | 0 .../io/ktor/tests/server/cio/RAWExample.kt | 7 +- ktor-server/ktor-server-core/build.gradle | 15 +- .../src/io/ktor/application/Application.kt | 0 .../io/ktor/application/ApplicationCall.kt | 0 .../application/ApplicationCallPipeline.kt | 0 .../application/ApplicationEnvironment.kt | 0 .../io/ktor/application/ApplicationEvents.kt | 0 .../io/ktor/application/ApplicationFeature.kt | 0 .../application/DefaultApplicationEvents.kt | 0 .../src/io/ktor/config/ApplicationConfig.kt | 0 .../io/ktor/config/HoconApplicationConfig.kt | 0 .../io/ktor/config/MapApplicationConfig.kt | 0 .../src/io/ktor/features/AutoHeadResponse.kt | 0 .../{ => jvm}/src/io/ktor/features/CORS.kt | 0 .../src/io/ktor/features/CachingHeaders.kt | 0 .../{ => jvm}/src/io/ktor/features/CallId.kt | 0 .../src/io/ktor/features/CallLogging.kt | 0 .../src/io/ktor/features/Compression.kt | 0 .../io/ktor/features/ConditionalHeaders.kt | 0 .../io/ktor/features/ContentNegotiation.kt | 0 .../src/io/ktor/features/DataConversion.kt | 0 .../src/io/ktor/features/DefaultHeaders.kt | 0 .../{ => jvm}/src/io/ktor/features/HSTS.kt | 0 .../src/io/ktor/features/HttpsRedirect.kt | 0 .../io/ktor/features/MultipleRangeWriter.kt | 0 .../io/ktor/features/OriginConnectionPoint.kt | 0 .../src/io/ktor/features/PartialContent.kt | 0 .../src/io/ktor/features/StatusPages.kt | 0 .../{ => jvm}/src/io/ktor/http/LinkHeader.kt | 0 .../{ => jvm}/src/io/ktor/http/Push.kt | 0 .../io/ktor/http/content/DefaultTransform.kt | 0 .../http/content/HttpStatusCodeContent.kt | 0 .../ktor/http/content/OutputStreamContent.kt | 0 .../src/io/ktor/http/content/StaticContent.kt | 0 .../http/content/StaticContentResolution.kt | 17 +- .../request/ApplicationReceiveFunctions.kt | 0 .../src/io/ktor/request/ApplicationRequest.kt | 0 .../request/ApplicationRequestProperties.kt | 0 .../src/io/ktor/request/RequestCookies.kt | 0 .../io/ktor/response/ApplicationResponse.kt | 0 .../response/ApplicationResponseFunctions.kt | 0 .../response/ApplicationResponseProperties.kt | 0 .../ktor/response/ApplicationSendPipeline.kt | 0 .../response/DefaultResponsePushBuilder.kt | 0 .../src/io/ktor/response/ResponseCookies.kt | 0 .../src/io/ktor/response/ResponseHeaders.kt | 0 .../io/ktor/response/ResponsePushBuilder.kt | 0 .../{ => jvm}/src/io/ktor/routing/Route.kt | 0 .../src/io/ktor/routing/RouteSelector.kt | 0 .../{ => jvm}/src/io/ktor/routing/Routing.kt | 0 .../io/ktor/routing/RoutingApplicationCall.kt | 0 .../src/io/ktor/routing/RoutingBuilder.kt | 0 .../src/io/ktor/routing/RoutingPath.kt | 0 .../src/io/ktor/routing/RoutingResolve.kt | 0 .../io/ktor/routing/RoutingResolveTrace.kt | 0 .../src/io/ktor/sessions/SessionProvider.kt | 0 .../src/io/ktor/sessions/SessionSerializer.kt | 0 .../sessions/SessionSerializerReflection.kt | 0 .../src/io/ktor/sessions/SessionStorage.kt | 0 .../io/ktor/sessions/SessionStorageMemory.kt | 0 .../src/io/ktor/sessions/SessionTracker.kt | 0 .../io/ktor/sessions/SessionTrackerById.kt | 0 .../io/ktor/sessions/SessionTrackerByValue.kt | 0 .../src/io/ktor/sessions/SessionTransport.kt | 0 .../ktor/sessions/SessionTransportCookie.kt | 0 .../ktor/sessions/SessionTransportHeader.kt | 0 .../sessions/SessionTransportTransformer.kt | 0 .../SessionTransportTransformerDigest.kt | 0 .../SessionTransportTransformerEncrypt.kt | 0 ...ansportTransformerMessageAuthentication.kt | 0 .../src/io/ktor/sessions/Sessions.kt | 0 .../src/io/ktor/sessions/SessionsBuilder.kt | 0 .../src/io/ktor/util/ConversionService.kt | 0 .../io/ktor/util/DispatcherWithShutdown.kt | 0 .../{ => jvm}/src/io/ktor/util/URLBuilder.kt | 0 .../{ => jvm}/test-resources/error404.html | 0 .../{ => jvm}/test-resources/logback-test.xml | 0 .../tests/http/FindContainingJarFileTest.kt | 0 .../tests/http/MultipleRangeWriterTest.kt | 0 .../ktor-server-host-common/build.gradle | 7 +- .../ktor/server/engine/ApplicationEngine.kt | 0 .../engine/ApplicationEngineEnvironment.kt | 0 .../ApplicationEngineEnvironmentReloading.kt | 0 .../ktor/server/engine/BaseApplicationCall.kt | 0 .../server/engine/BaseApplicationEngine.kt | 0 .../server/engine/BaseApplicationRequest.kt | 0 .../server/engine/BaseApplicationResponse.kt | 0 .../src/io/ktor/server/engine/CommandLine.kt | 0 .../server/engine/DefaultEnginePipeline.kt | 0 .../io/ktor/server/engine/DefaultTransform.kt | 7 +- .../io/ktor/server/engine/EmbeddedServer.kt | 0 .../src/io/ktor/server/engine/EngineAPI.kt | 0 .../server/engine/EngineConnectorConfig.kt | 0 .../engine/EngineContextCancellationHelper.kt | 0 .../io/ktor/server/engine/EnginePipeline.kt | 0 .../src/io/ktor/server/engine/Long.kt | 0 .../server/engine/OverridingClassLoader.kt | 0 .../src/io/ktor/server/engine/ShutDownUrl.kt | 0 .../{ => jvm}/test-resources/application.conf | 0 .../test-resources/applicationWithEnv.conf | 0 ...licationEngineEnvironmentReloadingTests.kt | 0 .../io/ktor/tests/hosts/CommandLineTest.kt | 0 ktor-server/ktor-server-jetty/build.gradle | 37 +++-- .../src/io/ktor/server/jetty/Embedded.kt | 0 .../src/io/ktor/server/jetty/EngineMain.kt | 0 .../ktor/server/jetty/JettyApplicationCall.kt | 0 .../server/jetty/JettyApplicationEngine.kt | 0 .../jetty/JettyApplicationEngineBase.kt | 0 .../server/jetty/JettyApplicationResponse.kt | 0 .../io/ktor/server/jetty/JettyKtorHandler.kt | 0 .../io/ktor/server/jetty/ServerInitializer.kt | 0 .../server/jetty/internal/EndPointChannels.kt | 0 .../server/jetty/internal/JettyUpgradeImpl.kt | 0 .../tests/server/jetty/JettyEngineTest.kt | 0 .../jetty/JettyServletContainerEngineTest.kt | 11 +- .../tests/server/jetty/JettyStressTest.kt | 0 .../server/jetty/MultipleDispatchOnTimeout.kt | 0 .../ktor-server-jetty-test-http2/build.gradle | 18 ++- .../tests/server/jetty/JettyEngineTest.kt | 0 .../jetty/JettyServletContainerEngineTest.kt | 11 +- .../server/jetty/MultipleDispatchOnTimeout.kt | 0 ktor-server/ktor-server-netty/build.gradle | 24 ++- .../{ => jvm}/src/io/ktor/server/netty/CIO.kt | 0 .../src/io/ktor/server/netty/Embedded.kt | 0 .../src/io/ktor/server/netty/EngineMain.kt | 0 .../ktor/server/netty/NettyApplicationCall.kt | 0 .../netty/NettyApplicationCallHandler.kt | 0 .../server/netty/NettyApplicationEngine.kt | 0 .../server/netty/NettyApplicationRequest.kt | 0 .../netty/NettyApplicationRequestCookies.kt | 0 .../netty/NettyApplicationRequestHeaders.kt | 0 .../server/netty/NettyApplicationResponse.kt | 0 .../server/netty/NettyChannelInitializer.kt | 0 .../ktor/server/netty/NettyDirectDecoder.kt | 0 .../ktor/server/netty/NettyDirectEncoder.kt | 0 .../server/netty/NettyMultipartDataSupport.kt | 0 .../server/netty/cio/NettyRequestQueue.kt | 0 .../server/netty/cio/NettyResponsePipeline.kt | 0 .../server/netty/cio/RequestBodyHandler.kt | 0 .../netty/http1/NettyConnectionPoint.kt | 0 .../netty/http1/NettyHttp1ApplicationCall.kt | 0 .../http1/NettyHttp1ApplicationRequest.kt | 0 .../http1/NettyHttp1ApplicationResponse.kt | 0 .../server/netty/http1/NettyHttp1Handler.kt | 0 .../netty/http2/Http2LocalConnectionPoint.kt | 0 .../server/netty/http2/HttpFrameAdapter.kt | 0 .../netty/http2/NettyHttp2ApplicationCall.kt | 0 .../http2/NettyHttp2ApplicationRequest.kt | 0 .../http2/NettyHttp2ApplicationResponse.kt | 0 .../server/netty/http2/NettyHttp2Handler.kt | 0 .../tests/server/netty/NettyEngineTest.kt | 0 .../tests/server/netty/NettyStressTest.kt | 0 ktor-server/ktor-server-servlet/build.gradle | 7 +- .../io/ktor/server/servlet/AsyncServlet.kt | 0 .../io/ktor/server/servlet/BlockingServlet.kt | 0 .../src/io/ktor/server/servlet/JAASBridge.kt | 0 .../src/io/ktor/server/servlet/KtorServlet.kt | 0 .../servlet/ServletApplicationEngine.kt | 0 .../servlet/ServletApplicationRequest.kt | 0 .../ServletApplicationRequestCookies.kt | 0 .../ServletApplicationRequestHeaders.kt | 0 .../servlet/ServletApplicationResponse.kt | 0 .../server/servlet/ServletConnectionPoint.kt | 0 .../io/ktor/server/servlet/ServletReader.kt | 0 .../io/ktor/server/servlet/ServletUpgrade.kt | 0 .../io/ktor/server/servlet/ServletWriter.kt | 0 .../src/io/ktor/server/servlet/v4/Push.kt | 0 .../ktor-server-test-host/build.gradle | 35 ++-- .../ktor/server/testing/EngineStressSuite.kt | 10 +- .../io/ktor/server/testing/EngineTestBase.kt | 0 .../io/ktor/server/testing/EngineTestSuite.kt | 133 +++++++++++----- .../server/testing}/HighLoadHttpGenerator.kt | 96 ++++++++--- .../ktor/server/testing/StressSuiteRunner.kt | 0 .../server/testing/TestApplicationCall.kt | 0 .../server/testing/TestApplicationEngine.kt | 0 .../server/testing/TestApplicationRequest.kt | 0 .../server/testing/TestApplicationResponse.kt | 0 .../src/io/ktor/server/testing/TestEngine.kt | 0 .../src/io/ktor/server/testing/Utils.kt | 0 .../testing/client/TestHttpClientConfig.kt | 0 .../testing/client/TestHttpClientEngine.kt | 0 .../testing/client/TestHttpClientRequest.kt | 0 .../testing/client/TestHttpClientResponse.kt | 0 ktor-server/ktor-server-tests/build.gradle | 16 +- .../testing/TestApplicationEngineTest.kt | 0 .../ApplicationRequestHeaderTest.kt | 0 .../tests/server/application/ConfigTest.kt | 0 .../tests/server/application/HandlerTest.kt | 0 .../io/ktor/tests/server/features/CORSTest.kt | 0 .../ktor/tests/server/features/CallIdTest.kt | 0 .../tests/server/features/CallLoggingTest.kt | 0 .../tests/server/features/CompressionTest.kt | 0 .../features/ConditionalHeadersTests.kt | 0 .../server/features/ContentNegotiationTest.kt | 0 .../ktor/tests/server/features/CookiesTest.kt | 0 .../server/features/DataConversionTest.kt | 0 .../io/ktor/tests/server/features/HSTSTest.kt | 0 .../io/ktor/tests/server/features/HeadTest.kt | 0 .../features/HttpsRedirectFeatureTest.kt | 0 .../features/OriginConnectionPointTest.kt | 0 .../server/features/PartialContentTest.kt | 4 +- .../server/features/StaticContentTest.kt | 52 ++++-- .../tests/server/features/StatusPageTest.kt | 0 .../http/ApplicationRequestContentTest.kt | 0 .../ktor/tests/server/http/DefaultPushTest.kt | 0 .../tests/server/http/RespondFunctionsTest.kt | 0 .../tests/server/http/RespondWriteTest.kt | 0 .../server/http/TestEngineMultipartTest.kt | 0 .../ktor/tests/server/http/URLBuilderTest.kt | 0 .../ktor/tests/server/http/UrlEncodedTest.kt | 0 .../tests/server/routing/RoutingBuildTest.kt | 0 .../server/routing/RoutingProcessingTest.kt | 0 .../server/routing/RoutingResolveTest.kt | 0 .../server/sessions/AutoSerializerTest.kt | 0 .../ktor/tests/server/sessions/SessionTest.kt | 0 ktor-server/ktor-server-tomcat/build.gradle | 19 ++- .../src/io/ktor/server/tomcat/Embedded.kt | 0 .../src/io/ktor/server/tomcat/EngineMain.kt | 0 .../server/tomcat/TomcatApplicationEngine.kt | 0 .../tests/server/tomcat/TomcatEngineTest.kt | 0 ktor-utils/build.gradle | 18 +++ .../src/io/ktor/pipeline/Compatibility.kt | 0 .../src/io/ktor/util/Annotations.kt | 0 .../src/io/ktor/util/Attributes.kt | 0 .../{ => common}/src/io/ktor/util/Base64.kt | 4 +- .../src/io/ktor/util/ByteChannels.kt | 0 .../src/io/ktor/util/CaseInsensitiveMap.kt | 0 .../{ => common}/src/io/ktor/util/Charset.kt | 0 .../src/io/ktor/util/Collections.kt | 0 .../{ => common}/src/io/ktor/util/Crypto.kt | 2 + .../src/io/ktor/util/DelegatingMutableSet.kt | 0 .../{ => common}/src/io/ktor/util/Hash.kt | 0 .../{ => common}/src/io/ktor/util/Lock.kt | 0 .../{ => common}/src/io/ktor/util/Ranges.kt | 0 .../src/io/ktor/util/StackFrames.kt | 0 .../src/io/ktor/util/StringValues.kt | 0 .../{ => common}/src/io/ktor/util/Text.kt | 0 .../src/io/ktor/util/date/Date.kt | 0 .../src/io/ktor/util/pipeline/ContextDsl.kt | 0 .../src/io/ktor/util/pipeline/Pipeline.kt | 0 .../io/ktor/util/pipeline/PipelineContext.kt | 0 .../io/ktor/util/pipeline/PipelinePhase.kt | 0 .../common/test/io/ktor/tests/utils/Base64.kt | 51 ++++++ .../tests/utils/CaseInsensitiveMapTest.kt | 0 .../test/io/ktor/tests/utils/GMTDateTest.kt | 0 .../ktor/tests/utils/PipelineContractsTest.kt | 0 .../io/ktor/tests/utils/PipelinePhasesTest.kt | 0 .../io/ktor/tests/utils/StringValuesTest.kt | 0 .../src/io/ktor/util/AttributesJs.kt | 0 .../src/io/ktor/util/CollectionsJs.kt | 0 .../src/io/ktor/util/CryptoJs.kt | 0 .../src/io/ktor/util/Lock.kt | 0 .../src/io/ktor/util/StackFramesJs.kt | 0 .../src/io/ktor/util/date/DateJs.kt | 0 .../src/io/ktor/util/AttributesJvm.kt | 0 .../src/io/ktor/util/BufferViewJvm.kt | 0 .../src/io/ktor/util/CollectionsJvm.kt | 0 .../src/io/ktor/util/CryptoJvm.kt | 2 + .../src/io/ktor/util/DatesJvm.kt | 0 .../src/io/ktor/util/Deflater.kt | 0 .../src/io/ktor/util/InputJvm.kt | 0 .../src/io/ktor/util/LockJvm.kt | 0 .../src/io/ktor/util/Logging.kt | 0 .../src/io/ktor/util/NIO.kt | 0 .../src/io/ktor/util/Nonce.kt | 0 .../src/io/ktor/util/Path.kt | 0 .../src/io/ktor/util/Reflection.kt | 0 .../src/io/ktor/util/StackFramesJvm.kt | 0 .../src/io/ktor/util/cio/ByteBufferPool.kt | 0 .../src/io/ktor/util/cio/CIO.kt | 0 .../src/io/ktor/util/cio/Channels.kt | 0 .../src/io/ktor/util/cio/FileChannels.kt | 0 .../io/ktor/util/cio/InputStreamAdapters.kt | 40 +++++ .../io/ktor/util/cio/OutputStreamAdapters.kt | 0 .../src/io/ktor/util/cio/Readers.kt | 0 .../src/io/ktor/util/cio/Semaphore.kt | 0 .../src/io/ktor/util/date/DateJvm.kt | 0 .../src/io/ktor/util/date/DateUtils.kt | 0 .../ktor/util/internal/LockFreeLinkedList.kt | 0 .../tests/utils/DeflaterReadChannelTest.kt | 10 +- .../io/ktor/tests/utils/FileChannelTest.kt | 0 .../io/ktor/tests/utils/HexFunctionsTest.kt | 0 .../io/ktor/tests/utils/NonceSmokeTest.kt | 0 .../tests/utils/PipelineStackFramesTest.kt | 0 .../test/io/ktor/tests/utils/PipelineTest.kt | 0 .../tests/utils/ReflectionSupertypesTest.kt | 0 ktor-utils/ktor-utils-ios/build.gradle | 4 - .../src/io/ktor/util/CryptoIos.kt | 24 --- .../src/io/ktor/util/LockIos.kt | 21 --- ktor-utils/ktor-utils-js/build.gradle | 4 - ktor-utils/ktor-utils-jvm/build.gradle | 5 - ktor-utils/posix/interop/utils.def | 34 ++++ .../src/io/ktor/util/AttributesIos.kt | 0 .../src/io/ktor/util/CollectionsIos.kt | 0 .../posix/src/io/ktor/util/CryptoIos.kt | 7 + ktor-utils/posix/src/io/ktor/util/LockIos.kt | 21 +++ .../src/io/ktor/util/StackFramesIos.kt | 0 .../src/io/ktor/util/date/DateIos.kt | 3 +- ktor-utils/test/io/ktor/tests/utils/Base64.kt | 51 ------ settings.gradle | 18 --- 848 files changed, 2346 insertions(+), 1483 deletions(-) delete mode 100644 gradle/atomicfu-common.gradle delete mode 100644 gradle/atomicfu-js.gradle delete mode 100644 gradle/atomicfu-jvm.gradle delete mode 100644 gradle/atomicfu-native.gradle delete mode 100644 gradle/bintray.gradle create mode 100644 gradle/darwin.gradle delete mode 100644 gradle/engines.gradle create mode 100644 gradle/ide.gradle delete mode 100644 gradle/maven.gradle delete mode 100644 gradle/native.gradle create mode 100644 gradle/nodejs.gradle delete mode 100644 gradle/platform.gradle create mode 100644 gradle/pom.gradle create mode 100644 gradle/posix.gradle create mode 100644 gradle/utility.gradle create mode 100644 jvm/.gitkeep create mode 100644 ktor-client/jvm/.gitkeep rename ktor-client/ktor-client-android/{ => jvm}/resources/META-INF/services/io.ktor.client.HttpClientEngineContainer (100%) rename ktor-client/ktor-client-android/{ => jvm}/src/io/ktor/client/engine/android/Android.kt (100%) rename ktor-client/ktor-client-android/{ => jvm}/src/io/ktor/client/engine/android/AndroidClientEngine.kt (100%) rename ktor-client/ktor-client-android/{ => jvm}/src/io/ktor/client/engine/android/AndroidEngineConfig.kt (100%) rename ktor-client/ktor-client-android/{ => jvm}/src/io/ktor/client/engine/android/AndroidHttpRequest.kt (100%) rename ktor-client/ktor-client-android/{ => jvm}/src/io/ktor/client/engine/android/AndroidHttpResponse.kt (100%) rename ktor-client/ktor-client-android/{ => jvm}/test/io/ktor/client/engine/android/AndroidHttpsTest.kt (99%) rename ktor-client/ktor-client-android/{ => jvm}/test/io/ktor/client/engine/android/AndroidProxyTest.kt (100%) rename ktor-client/ktor-client-android/{ => jvm}/test/io/ktor/client/engine/android/CommonTests.kt (100%) rename ktor-client/ktor-client-apache/{ => jvm}/resources/META-INF/services/io.ktor.client.HttpClientEngineContainer (100%) rename ktor-client/ktor-client-apache/{ => jvm}/src/io/ktor/client/engine/apache/Apache.kt (100%) rename ktor-client/ktor-client-apache/{ => jvm}/src/io/ktor/client/engine/apache/ApacheEngine.kt (100%) rename ktor-client/ktor-client-apache/{ => jvm}/src/io/ktor/client/engine/apache/ApacheEngineConfig.kt (100%) rename ktor-client/ktor-client-apache/{ => jvm}/src/io/ktor/client/engine/apache/ApacheHttpRequest.kt (100%) rename ktor-client/ktor-client-apache/{ => jvm}/src/io/ktor/client/engine/apache/ApacheHttpResponse.kt (100%) rename ktor-client/ktor-client-apache/{ => jvm}/src/io/ktor/client/engine/apache/ApacheRequestProducer.kt (100%) rename ktor-client/ktor-client-apache/{ => jvm}/src/io/ktor/client/engine/apache/ApacheResponseConsumer.kt (100%) rename ktor-client/ktor-client-apache/{ => jvm}/test/io/ktor/client/engine/apache/CommonTests.kt (100%) rename ktor-client/ktor-client-cio/{ => jvm}/resources/META-INF/services/io.ktor.client.HttpClientEngineContainer (100%) rename ktor-client/ktor-client-cio/{ => jvm}/src/io/ktor/client/engine/cio/CIO.kt (100%) rename ktor-client/ktor-client-cio/{ => jvm}/src/io/ktor/client/engine/cio/CIOEngine.kt (100%) rename ktor-client/ktor-client-cio/{ => jvm}/src/io/ktor/client/engine/cio/CIOEngineConfig.kt (100%) rename ktor-client/ktor-client-cio/{ => jvm}/src/io/ktor/client/engine/cio/CIOHttpResponse.kt (97%) rename ktor-client/ktor-client-cio/{ => jvm}/src/io/ktor/client/engine/cio/ConnectionFactory.kt (100%) rename ktor-client/ktor-client-cio/{ => jvm}/src/io/ktor/client/engine/cio/ConnectionPipeline.kt (94%) rename ktor-client/ktor-client-cio/{ => jvm}/src/io/ktor/client/engine/cio/Endpoint.kt (100%) rename ktor-client/ktor-client-cio/{ => jvm}/src/io/ktor/client/engine/cio/EngineTasks.kt (100%) rename ktor-client/ktor-client-cio/{ => jvm}/src/io/ktor/client/engine/cio/utils.kt (100%) rename ktor-client/ktor-client-cio/{ => jvm}/test/io/ktor/client/engine/cio/CIOHttpsTest.kt (100%) rename ktor-client/ktor-client-cio/{ => jvm}/test/io/ktor/client/engine/cio/CIORequestTest.kt (100%) rename ktor-client/ktor-client-cio/{ => jvm}/test/io/ktor/client/engine/cio/CommonTests.kt (100%) rename ktor-client/ktor-client-core/{ => common}/src/io/ktor/client/HttpClient.kt (99%) rename ktor-client/ktor-client-core/{ => common}/src/io/ktor/client/HttpClientConfig.kt (98%) rename ktor-client/ktor-client-core/{ => common}/src/io/ktor/client/call/HttpClientCall.kt (100%) rename ktor-client/ktor-client-core/{ => common}/src/io/ktor/client/call/TypeInfo.kt (100%) rename ktor-client/ktor-client-core/{ => common}/src/io/ktor/client/call/utils.kt (72%) rename ktor-client/ktor-client-core/{ => common}/src/io/ktor/client/engine/HttpClientEngine.kt (100%) rename ktor-client/ktor-client-core/{ => common}/src/io/ktor/client/engine/HttpClientEngineConfig.kt (100%) rename ktor-client/ktor-client-core/{ => common}/src/io/ktor/client/engine/Utils.kt (100%) rename ktor-client/ktor-client-core/{ => common}/src/io/ktor/client/features/DefaultRequest.kt (100%) rename ktor-client/ktor-client-core/{ => common}/src/io/ktor/client/features/DefaultTransform.kt (100%) rename ktor-client/ktor-client-core/{ => common}/src/io/ktor/client/features/ExpectSuccess.kt (100%) rename ktor-client/ktor-client-core/{ => common}/src/io/ktor/client/features/HttpClientFeature.kt (100%) rename ktor-client/ktor-client-core/{ => common}/src/io/ktor/client/features/HttpPlainText.kt (88%) rename ktor-client/ktor-client-core/{ => common}/src/io/ktor/client/features/HttpRedirect.kt (100%) rename ktor-client/ktor-client-core/{ => common}/src/io/ktor/client/features/HttpSend.kt (100%) rename ktor-client/ktor-client-core/{ => common}/src/io/ktor/client/features/UserAgent.kt (100%) rename ktor-client/ktor-client-core/{ => common}/src/io/ktor/client/features/cookies/AcceptAllCookiesStorage.kt (100%) rename ktor-client/ktor-client-core/{ => common}/src/io/ktor/client/features/cookies/ConstantCookiesStorage.kt (100%) rename ktor-client/ktor-client-core/{ => common}/src/io/ktor/client/features/cookies/CookiesStorage.kt (100%) rename ktor-client/ktor-client-core/{ => common}/src/io/ktor/client/features/cookies/HttpCookies.kt (100%) rename ktor-client/ktor-client-core/{ => common}/src/io/ktor/client/features/observer/DelegatedCall.kt (100%) rename ktor-client/ktor-client-core/{ => common}/src/io/ktor/client/features/observer/ResponseObserver.kt (100%) rename ktor-client/ktor-client-core/{ => common}/src/io/ktor/client/request/Content.kt (100%) rename ktor-client/ktor-client-core/{ => common}/src/io/ktor/client/request/HttpRequest.kt (99%) rename ktor-client/ktor-client-core/{ => common}/src/io/ktor/client/request/HttpRequestPipeline.kt (100%) rename ktor-client/ktor-client-core/{ => common}/src/io/ktor/client/request/builders.kt (93%) create mode 100644 ktor-client/ktor-client-core/common/src/io/ktor/client/request/buildersWithUrl.kt rename ktor-client/ktor-client-core/{ => common}/src/io/ktor/client/request/forms/FormDataContent.kt (100%) rename ktor-client/ktor-client-core/{ => common}/src/io/ktor/client/request/forms/formBuilders.kt (100%) rename ktor-client/ktor-client-core/{ => common}/src/io/ktor/client/request/forms/formDsl.kt (100%) rename ktor-client/ktor-client-core/{ => common}/src/io/ktor/client/request/utils.kt (100%) rename ktor-client/ktor-client-core/{ => common}/src/io/ktor/client/response/HttpResponse.kt (100%) rename ktor-client/ktor-client-core/{ => common}/src/io/ktor/client/response/HttpResponseConfig.kt (100%) rename ktor-client/ktor-client-core/{ => common}/src/io/ktor/client/response/HttpResponsePipeline.kt (100%) rename ktor-client/ktor-client-core/{ => common}/src/io/ktor/client/response/readers.kt (100%) rename ktor-client/ktor-client-core/{ => common}/src/io/ktor/client/utils/CIO.kt (100%) rename ktor-client/ktor-client-core/{ => common}/src/io/ktor/client/utils/Content.kt (100%) rename ktor-client/ktor-client-core/{ => common}/src/io/ktor/client/utils/HttpCacheControl.kt (100%) rename ktor-client/ktor-client-core/{ => common}/src/io/ktor/client/utils/headers.kt (100%) rename ktor-client/ktor-client-core/{ => common}/test/TypeInfoTest.kt (100%) create mode 100644 ktor-client/ktor-client-core/js/src/io/ktor/client/HttpClientJs.kt rename ktor-client/ktor-client-core/{ktor-client-core-js => js}/src/io/ktor/client/call/TypeInfoJs.kt (100%) rename ktor-client/ktor-client-core/{ktor-client-core-js => js}/src/io/ktor/client/engine/js/Js.kt (100%) rename ktor-client/ktor-client-core/{ktor-client-core-js => js}/src/io/ktor/client/engine/js/JsClientEngine.kt (100%) rename ktor-client/ktor-client-core/{ktor-client-core-js => js}/src/io/ktor/client/engine/js/JsHttpResponse.kt (100%) rename ktor-client/ktor-client-core/{ktor-client-core-js => js}/src/io/ktor/client/engine/js/JsUtils.kt (100%) rename ktor-client/ktor-client-core/{ktor-client-core-js => js}/src/io/ktor/client/engine/js/ReadableStream.kt (100%) rename ktor-client/ktor-client-core/{ktor-client-core-js => js}/src/io/ktor/client/engine/js/compatible/Utils.kt (100%) rename ktor-client/ktor-client-core/{ktor-client-core-js => js}/src/io/ktor/client/engine/js/compatible/browser/BrowserUtils.kt (100%) rename ktor-client/ktor-client-core/{ktor-client-core-js => js}/src/io/ktor/client/engine/js/compatible/node/NodeUtils.kt (100%) rename ktor-client/ktor-client-core/{ktor-client-core-js => js}/src/io/ktor/client/features/DefaultTransformJs.kt (100%) rename ktor-client/ktor-client-core/{ktor-client-core-jvm => jvm}/src/io/ktor/client/HttpClientJvm.kt (71%) rename ktor-client/ktor-client-core/{ktor-client-core-jvm => jvm}/src/io/ktor/client/call/TypeInfoJvm.kt (100%) rename ktor-client/ktor-client-core/{ktor-client-core-jvm => jvm}/src/io/ktor/client/call/utilsJvm.kt (100%) rename ktor-client/ktor-client-core/{ktor-client-core-jvm => jvm}/src/io/ktor/client/engine/HttpClientJvmEngine.kt (100%) rename ktor-client/ktor-client-core/{ktor-client-core-jvm => jvm}/src/io/ktor/client/features/DefaultTransformersJvm.kt (100%) rename ktor-client/ktor-client-core/{ktor-client-core-jvm => jvm}/src/io/ktor/client/request/HttpRequestJvm.kt (100%) rename ktor-client/ktor-client-core/{ktor-client-core-jvm => jvm}/src/io/ktor/client/request/buildersJvm.kt (100%) rename ktor-client/ktor-client-core/{ktor-client-core-jvm => jvm}/src/io/ktor/client/utils/CIOJvm.kt (100%) rename ktor-client/ktor-client-core/{ktor-client-core-jvm => jvm}/test/CookiesTest.kt (100%) rename ktor-client/ktor-client-core/{ktor-client-core-jvm => jvm}/test/TypeInfoTestJvm.kt (100%) rename ktor-client/ktor-client-core/{ktor-client-core-jvm => jvm}/test/UserAgentTest.kt (100%) delete mode 100644 ktor-client/ktor-client-core/ktor-client-core-ios/build.gradle delete mode 100644 ktor-client/ktor-client-core/ktor-client-core-ios/src/io/ktor/client/HttpClientIos.kt delete mode 100644 ktor-client/ktor-client-core/ktor-client-core-ios/src/io/ktor/client/engine/ios/Ios.kt delete mode 100644 ktor-client/ktor-client-core/ktor-client-core-js/build.gradle delete mode 100644 ktor-client/ktor-client-core/ktor-client-core-js/src/io/ktor/client/HttpClientJs.kt delete mode 100644 ktor-client/ktor-client-core/ktor-client-core-jvm/build.gradle create mode 100644 ktor-client/ktor-client-core/posix/src/io/ktor/client/HttpClient.kt rename ktor-client/ktor-client-core/{ktor-client-core-ios => posix}/src/io/ktor/client/call/TypeInfoIos.kt (100%) create mode 100644 ktor-client/ktor-client-core/posix/src/io/ktor/client/engine/Loader.kt rename ktor-client/ktor-client-core/{ktor-client-core-ios => posix}/src/io/ktor/client/features/DefaultTransformIos.kt (100%) create mode 100644 ktor-client/ktor-client-features/jvm/.gitkeep rename ktor-client/ktor-client-features/ktor-client-auth-basic/{ => common}/src/io/ktor/client/features/auth/basic/BasicAuth.kt (91%) rename ktor-client/ktor-client-features/ktor-client-auth-basic/{ => common}/test/io/ktor/client/features/auth/basic/BasicAuthTest.kt (87%) rename ktor-client/ktor-client-features/ktor-client-auth-basic/{test/io/ktor/client/features/auth/basic => jvm/test}/BasicAuthTestWithServer.kt (100%) rename ktor-client/ktor-client-features/ktor-client-auth/{ => jvm}/src/io/ktor/client/features/auth/Auth.kt (100%) rename ktor-client/ktor-client-features/ktor-client-auth/{ => jvm}/src/io/ktor/client/features/auth/providers/BasicAuthProvider.kt (100%) rename ktor-client/ktor-client-features/ktor-client-auth/{ => jvm}/src/io/ktor/client/features/auth/providers/DigestAuthProvider.kt (96%) rename ktor-client/ktor-client-features/ktor-client-auth/{ => jvm}/test/DigestTest.kt (100%) rename ktor-client/ktor-client-features/ktor-client-json/{ => common}/src/io/ktor/client/features/json/JsonFeature.kt (100%) rename ktor-client/ktor-client-features/ktor-client-json/{ => common}/src/io/ktor/client/features/json/JsonSerializer.kt (100%) rename ktor-client/ktor-client-features/ktor-client-json/{ => common}/src/io/ktor/client/features/json/serializer/KotlinxSerializer.kt (100%) rename ktor-client/ktor-client-features/ktor-client-json/{ => common}/test/KotlinxSerializerTest.kt (100%) rename ktor-client/ktor-client-features/ktor-client-json/{ktor-client-json-js/src/io/ktor/client/features/json/defaultSerializer.kt => js/src/io/ktor/client/features/json/DefaultJs.kt} (59%) rename ktor-client/{ktor-client-js/test/io/ktor/client/engine/js/test/JsClientTests.kt => ktor-client-features/ktor-client-json/js/test/JsSerializerTest.kt} (100%) create mode 100644 ktor-client/ktor-client-features/ktor-client-json/jvm/resources/META-INF/services/io.ktor.client.features.json.JsonSerializer rename ktor-client/ktor-client-features/ktor-client-json/{ktor-client-json-jvm => jvm}/src/io/ktor/client/features/json/DefaultJvm.kt (72%) rename ktor-client/ktor-client-features/ktor-client-json/ktor-client-gson/{ => jvm}/resources/META-INF/services/io.ktor.client.features.json.JsonSerializer (100%) rename ktor-client/ktor-client-features/ktor-client-json/ktor-client-gson/{ => jvm}/src/io/ktor/client/features/json/GsonSerializer.kt (100%) rename ktor-client/ktor-client-features/ktor-client-json/ktor-client-gson/{ => jvm}/test/io/ktor/client/features/json/tests/GsonTest.kt (100%) rename ktor-client/ktor-client-features/ktor-client-json/ktor-client-jackson/{ => jvm}/resources/META-INF/services/io.ktor.client.features.json.JsonSerializer (100%) rename ktor-client/ktor-client-features/ktor-client-json/ktor-client-jackson/{ => jvm}/src/io/ktor/client/features/json/JacksonSerializer.kt (100%) rename ktor-client/ktor-client-features/ktor-client-json/ktor-client-jackson/{ => jvm}/test/io/ktor/client/features/json/tests/JacksonTest.kt (100%) delete mode 100644 ktor-client/ktor-client-features/ktor-client-json/ktor-client-json-ios/build.gradle delete mode 100644 ktor-client/ktor-client-features/ktor-client-json/ktor-client-json-js/build.gradle delete mode 100644 ktor-client/ktor-client-features/ktor-client-json/ktor-client-json-jvm/build.gradle delete mode 100644 ktor-client/ktor-client-features/ktor-client-json/ktor-client-json-jvm/test/io/ktor/client/features/json/tests/KotlinxJsonTest.kt rename ktor-client/ktor-client-features/ktor-client-json/ktor-client-json-tests/{ => jvm}/src/io/ktor/client/features/json/tests/JsonTest.kt (94%) rename ktor-client/ktor-client-features/ktor-client-json/{ktor-client-json-jvm/test/io/ktor/client/features/json/tests => ktor-client-json-tests/jvm/test}/DefaultSerializerJsonTest.kt (54%) rename ktor-client/ktor-client-features/ktor-client-json/{ktor-client-json-ios/src/io/ktor/client/features/json/DefaultIos.kt => posix/src/io/ktor/client/features/json/DefaultPosix.kt} (100%) create mode 100644 ktor-client/ktor-client-features/ktor-client-logging/build.gradle delete mode 100644 ktor-client/ktor-client-features/ktor-client-logging/build.gradle.kts rename ktor-client/ktor-client-features/ktor-client-logging/{ => common}/src/io/ktor/client/features/logging/LogLevel.kt (100%) rename ktor-client/ktor-client-features/ktor-client-logging/{ => common}/src/io/ktor/client/features/logging/Logger.kt (100%) rename ktor-client/ktor-client-features/ktor-client-logging/{ => common}/src/io/ktor/client/features/logging/Logging.kt (91%) rename ktor-client/ktor-client-features/ktor-client-logging/{ktor-client-logging-js => js}/src/io/ktor/client/features/logging/LoggerJs.kt (100%) rename ktor-client/ktor-client-features/ktor-client-logging/{ktor-client-logging-jvm => jvm}/src/io/ktor/client/features/logging/LoggerJvm.kt (100%) rename ktor-client/ktor-client-features/ktor-client-logging/{ktor-client-logging-jvm => jvm}/test/io/ktor/client/features/logging/LoggingTest.kt (100%) delete mode 100644 ktor-client/ktor-client-features/ktor-client-logging/ktor-client-logging-ios/build.gradle.kts delete mode 100644 ktor-client/ktor-client-features/ktor-client-logging/ktor-client-logging-js/build.gradle.kts delete mode 100644 ktor-client/ktor-client-features/ktor-client-logging/ktor-client-logging-jvm/build.gradle.kts rename ktor-client/ktor-client-features/ktor-client-logging/{ktor-client-logging-ios => posix}/src/io/ktor/client/features/logging/LoggerIos.kt (100%) rename ktor-client/ktor-client-features/ktor-client-websocket/{ => jvm}/src/io/ktor/client/features/websocket/ClientSessions.kt (100%) rename ktor-client/ktor-client-features/ktor-client-websocket/{ => jvm}/src/io/ktor/client/features/websocket/WebSocketContent.kt (100%) rename ktor-client/ktor-client-features/ktor-client-websocket/{ => jvm}/src/io/ktor/client/features/websocket/WebSockets.kt (100%) rename ktor-client/ktor-client-features/ktor-client-websocket/{ => jvm}/src/io/ktor/client/features/websocket/builders.kt (100%) rename ktor-client/ktor-client-features/ktor-client-websocket/{ => jvm}/test/io/ktor/client/features/websocket/WebSocketTest.kt (100%) create mode 100644 ktor-client/ktor-client-ios/darwin/src/io/ktor/client/engine/ios/Ios.kt rename ktor-client/ktor-client-ios/{ => darwin}/src/io/ktor/client/engine/ios/IosClientEngine.kt (96%) rename ktor-client/ktor-client-ios/{ => darwin}/src/io/ktor/client/engine/ios/IosClientEngineConfig.kt (72%) rename ktor-client/ktor-client-ios/{ => darwin}/src/io/ktor/client/engine/ios/IosHttpResponse.kt (100%) rename ktor-client/ktor-client-ios/{ => darwin}/src/io/ktor/client/engine/ios/Utils.kt (100%) create mode 100644 ktor-client/ktor-client-ios/darwin/test/IosEnginesTest.kt create mode 100644 ktor-client/ktor-client-ios/darwin/test/utils.kt delete mode 100644 ktor-client/ktor-client-ios/src/io/ktor/client/engine/ios/Ios.kt rename ktor-client/ktor-client-jetty/{ => jvm}/src/io/ktor/client/engine/jetty/Jetty.kt (100%) rename ktor-client/ktor-client-jetty/{ => jvm}/src/io/ktor/client/engine/jetty/JettyEngineConfig.kt (100%) rename ktor-client/ktor-client-jetty/{ => jvm}/src/io/ktor/client/engine/jetty/JettyHttp2Engine.kt (100%) rename ktor-client/ktor-client-jetty/{ => jvm}/src/io/ktor/client/engine/jetty/JettyHttp2Request.kt (100%) rename ktor-client/ktor-client-jetty/{ => jvm}/src/io/ktor/client/engine/jetty/JettyHttpRequest.kt (100%) rename ktor-client/ktor-client-jetty/{ => jvm}/src/io/ktor/client/engine/jetty/JettyHttpResponse.kt (100%) rename ktor-client/ktor-client-jetty/{ => jvm}/src/io/ktor/client/engine/jetty/JettyResponseListener.kt (100%) rename ktor-client/ktor-client-jetty/{ => jvm}/src/io/ktor/client/engine/jetty/utils.kt (100%) rename ktor-client/ktor-client-js/{ => js}/src/Js.kt (100%) rename ktor-client/ktor-client-mock/{ => common}/src/io/ktor/client/engine/mock/MockEngine.kt (93%) rename ktor-client/ktor-client-mock/{ => common}/src/io/ktor/client/engine/mock/MockEngineConfig.kt (100%) rename ktor-client/ktor-client-mock/{ => common}/src/io/ktor/client/engine/mock/MockHttpRequest.kt (100%) rename ktor-client/ktor-client-mock/{ => common}/src/io/ktor/client/engine/mock/MockHttpResponse.kt (100%) rename ktor-client/ktor-client-mock/{ktor-client-mock-jvm/test => jvm/test/io/ktor/client/tests/mock}/MockEngineTests.kt (97%) delete mode 100644 ktor-client/ktor-client-mock/ktor-client-mock-ios/build.gradle delete mode 100644 ktor-client/ktor-client-mock/ktor-client-mock-js/build.gradle delete mode 100644 ktor-client/ktor-client-mock/ktor-client-mock-jvm/build.gradle rename ktor-client/ktor-client-okhttp/{ => jvm}/resources/META-INF/services/io.ktor.client.HttpClientEngineContainer (100%) rename ktor-client/ktor-client-okhttp/{ => jvm}/src/io/ktor/client/engine/okhttp/OkHttp.kt (100%) rename ktor-client/ktor-client-okhttp/{ => jvm}/src/io/ktor/client/engine/okhttp/OkHttpConfig.kt (100%) rename ktor-client/ktor-client-okhttp/{ => jvm}/src/io/ktor/client/engine/okhttp/OkHttpEngine.kt (100%) rename ktor-client/ktor-client-okhttp/{ => jvm}/src/io/ktor/client/engine/okhttp/OkHttpResponse.kt (100%) rename ktor-client/ktor-client-okhttp/{ => jvm}/src/io/ktor/client/engine/okhttp/OkUtils.kt (100%) rename ktor-client/ktor-client-okhttp/{ => jvm}/src/io/ktor/client/engine/okhttp/StreamRequestBody.kt (100%) rename ktor-client/ktor-client-okhttp/{ => jvm}/test/io/ktor/client/engine/okhttp/CommonTests.kt (100%) rename ktor-client/ktor-client-okhttp/{ => jvm}/test/io/ktor/client/engine/okhttp/RequestTests.kt (100%) rename ktor-client/ktor-client-tests/{ => jvm}/src/io/ktor/client/tests/AttributesTest.kt (100%) rename ktor-client/ktor-client-tests/{ => jvm}/src/io/ktor/client/tests/BuildersTest.kt (100%) rename ktor-client/ktor-client-tests/{ => jvm}/src/io/ktor/client/tests/CacheTest.kt (100%) rename ktor-client/ktor-client-tests/{ => jvm}/src/io/ktor/client/tests/ConnectionTest.kt (100%) rename ktor-client/ktor-client-tests/{ => jvm}/src/io/ktor/client/tests/ContentTest.kt (100%) rename ktor-client/ktor-client-tests/{ => jvm}/src/io/ktor/client/tests/CookiesTest.kt (100%) rename ktor-client/ktor-client-tests/{ => jvm}/src/io/ktor/client/tests/FeaturesTest.kt (100%) rename ktor-client/ktor-client-tests/{ => jvm}/src/io/ktor/client/tests/FullFormTest.kt (100%) rename ktor-client/ktor-client-tests/{ => jvm}/src/io/ktor/client/tests/HttpClientTest.kt (100%) rename ktor-client/ktor-client-tests/{ => jvm}/src/io/ktor/client/tests/HttpRedirectTest.kt (100%) rename ktor-client/ktor-client-tests/{ => jvm}/src/io/ktor/client/tests/MultithreadedTest.kt (100%) rename ktor-client/ktor-client-tests/{ => jvm}/src/io/ktor/client/tests/PostTest.kt (100%) rename ktor-client/ktor-client-tests/{ => jvm}/src/io/ktor/client/tests/cio/SemaphoreTest.kt (100%) rename ktor-client/ktor-client-tests/{ => jvm}/src/io/ktor/client/tests/utils/ClientTestUtils.kt (100%) rename ktor-client/ktor-client-tests/{ => jvm}/src/io/ktor/client/tests/utils/TestWithKtor.kt (100%) rename ktor-client/ktor-client-tests/{ => jvm}/src/io/ktor/client/tests/utils/generators.kt (100%) rename ktor-client/ktor-client-tests/{ => jvm}/test/io/ktor/client/tests/DefaultEngineTest.kt (100%) create mode 100644 ktor-features/jvm/.gitkeep rename ktor-features/ktor-auth-jwt/{ => jvm}/src/io/ktor/auth/jwt/JWTAuth.kt (100%) rename ktor-features/ktor-auth-jwt/{ => jvm}/test/io/ktor/auth/jwt/JWTAuthTest.kt (100%) rename ktor-features/ktor-auth-ldap/{ => jvm}/src/io/ktor/auth/ldap/Ldap.kt (100%) rename ktor-features/ktor-auth-ldap/{ => jvm}/test/io/ktor/tests/auth/ldap/LdapAuthTest.kt (100%) rename ktor-features/ktor-auth/{ => jvm}/src/io/ktor/auth/Authentication.kt (100%) rename ktor-features/ktor-auth/{ => jvm}/src/io/ktor/auth/AuthenticationContext.kt (100%) rename ktor-features/ktor-auth/{ => jvm}/src/io/ktor/auth/AuthenticationFailedCause.kt (100%) rename ktor-features/ktor-auth/{ => jvm}/src/io/ktor/auth/AuthenticationPipeline.kt (100%) rename ktor-features/ktor-auth/{ => jvm}/src/io/ktor/auth/AuthenticationProcedureChallenge.kt (100%) rename ktor-features/ktor-auth/{ => jvm}/src/io/ktor/auth/AuthenticationProvider.kt (100%) rename ktor-features/ktor-auth/{ => jvm}/src/io/ktor/auth/BasicAuth.kt (100%) rename ktor-features/ktor-auth/{ => jvm}/src/io/ktor/auth/DigestAuth.kt (100%) rename ktor-features/ktor-auth/{ => jvm}/src/io/ktor/auth/FormAuth.kt (100%) rename ktor-features/ktor-auth/{ => jvm}/src/io/ktor/auth/Headers.kt (100%) rename ktor-features/ktor-auth/{ => jvm}/src/io/ktor/auth/OAuth.kt (100%) rename ktor-features/ktor-auth/{ => jvm}/src/io/ktor/auth/OAuth1a.kt (100%) rename ktor-features/ktor-auth/{ => jvm}/src/io/ktor/auth/OAuth2.kt (100%) rename ktor-features/ktor-auth/{ => jvm}/src/io/ktor/auth/OAuthProcedure.kt (100%) rename ktor-features/ktor-auth/{ => jvm}/src/io/ktor/auth/Principal.kt (100%) rename ktor-features/ktor-auth/{ => jvm}/src/io/ktor/auth/SessionAuth.kt (100%) rename ktor-features/ktor-auth/{ => jvm}/src/io/ktor/auth/SimpleAuth.kt (100%) rename ktor-features/ktor-auth/{ => jvm}/src/io/ktor/auth/UnauthorizedResponse.kt (100%) rename ktor-features/ktor-auth/{ => jvm}/test/io/ktor/tests/auth/AuthBuildersTest.kt (100%) rename ktor-features/ktor-auth/{ => jvm}/test/io/ktor/tests/auth/AuthHeadersTest.kt (100%) rename ktor-features/ktor-auth/{ => jvm}/test/io/ktor/tests/auth/AuthTests.kt (100%) rename ktor-features/ktor-auth/{ => jvm}/test/io/ktor/tests/auth/BasicAuthTest.kt (100%) rename ktor-features/ktor-auth/{ => jvm}/test/io/ktor/tests/auth/CryptoTest.kt (100%) rename ktor-features/ktor-auth/{ => jvm}/test/io/ktor/tests/auth/DigestTest.kt (100%) rename ktor-features/ktor-auth/{ => jvm}/test/io/ktor/tests/auth/HttpClientTest.kt (100%) rename ktor-features/ktor-auth/{ => jvm}/test/io/ktor/tests/auth/OAuth1a.kt (100%) rename ktor-features/ktor-auth/{ => jvm}/test/io/ktor/tests/auth/OAuth2.kt (100%) rename ktor-features/ktor-auth/{ => jvm}/test/io/ktor/tests/auth/SessionAuthTest.kt (100%) rename ktor-features/ktor-auth/{ => jvm}/test/io/ktor/tests/auth/UserHashedTableAuthTest.kt (100%) rename ktor-features/ktor-freemarker/{ => jvm}/src/io/ktor/freemarker/FreeMarker.kt (100%) rename ktor-features/ktor-freemarker/{ => jvm}/src/io/ktor/freemarker/RespondTemplate.kt (100%) rename ktor-features/ktor-freemarker/{ => jvm}/test/io/ktor/tests/freemarker/FreeMarkerTest.kt (100%) rename ktor-features/ktor-gson/{ => jvm}/src/io/ktor/gson/GsonSupport.kt (100%) rename ktor-features/ktor-gson/{ => jvm}/test/io/ktor/tests/gson/GsonTest.kt (100%) rename ktor-features/ktor-html-builder/{ => jvm}/src/io/ktor/html/RespondHtml.kt (100%) rename ktor-features/ktor-html-builder/{ => jvm}/src/io/ktor/html/RespondHtmlTemplate.kt (100%) rename ktor-features/ktor-html-builder/{ => jvm}/src/io/ktor/html/Template.kt (100%) rename ktor-features/ktor-html-builder/{ => jvm}/test/io/ktor/tests/html/HtmlBuilderTest.kt (100%) rename ktor-features/ktor-html-builder/{ => jvm}/test/io/ktor/tests/html/HtmlTemplateTest.kt (100%) rename ktor-features/ktor-jackson/{ => jvm}/src/io/ktor/jackson/JacksonConverter.kt (100%) rename ktor-features/ktor-jackson/{ => jvm}/test/io/ktor/tests/jackson/JacksonTest.kt (100%) rename ktor-features/ktor-locations/{ => jvm}/src/io/ktor/locations/Location.kt (100%) rename ktor-features/ktor-locations/{ => jvm}/src/io/ktor/locations/Locations.kt (100%) rename ktor-features/ktor-locations/{ => jvm}/src/io/ktor/locations/URLBuilder.kt (100%) rename ktor-features/ktor-locations/{ => jvm}/test/io/ktor/tests/locations/CustomLocationsTest.kt (100%) rename ktor-features/ktor-locations/{ => jvm}/test/io/ktor/tests/locations/LocationsTest.kt (100%) rename ktor-features/ktor-locations/{ => jvm}/test/io/ktor/tests/locations/OAuthLocationsTest.kt (100%) rename ktor-features/ktor-locations/{ => jvm}/test/io/ktor/tests/locations/Verifiers.kt (100%) rename ktor-features/ktor-metrics/{ => jvm}/src/io/ktor/metrics/Metrics.kt (100%) rename ktor-features/ktor-mustache/{ => jvm}/src/io/ktor/mustache/Mustache.kt (100%) rename ktor-features/ktor-mustache/{ => jvm}/src/io/ktor/mustache/RespondTemplate.kt (100%) rename ktor-features/ktor-mustache/{ => jvm}/test-resources/withPlaceholder.mustache (100%) rename ktor-features/ktor-mustache/{ => jvm}/test-resources/withoutPlaceholder.mustache (100%) rename ktor-features/ktor-mustache/{ => jvm}/test/io/ktor/mustache/MustacheTest.kt (100%) rename ktor-features/ktor-server-sessions/{ => jvm}/src/io/ktor/sessions/Cache.kt (100%) rename ktor-features/ktor-server-sessions/{ => jvm}/src/io/ktor/sessions/CacheStorage.kt (100%) rename ktor-features/ktor-server-sessions/{ => jvm}/src/io/ktor/sessions/DirectoryStorage.kt (100%) rename ktor-features/ktor-server-sessions/{ => jvm}/test/io/ktor/tests/sessions/CacheTest.kt (100%) rename ktor-features/ktor-server-sessions/{ => jvm}/test/io/ktor/tests/sessions/DirectorySessionStorageTest.kt (100%) rename ktor-features/ktor-velocity/{ => jvm}/src/io/ktor/velocity/RespondTemplate.kt (100%) rename ktor-features/ktor-velocity/{ => jvm}/src/io/ktor/velocity/Velocity.kt (100%) rename ktor-features/ktor-velocity/{ => jvm}/test/io/ktor/tests/velocity/VelocityTest.kt (100%) rename ktor-features/ktor-webjars/{ => jvm}/src/io/ktor/webjars/Webjars.kt (86%) rename ktor-features/ktor-webjars/{ => jvm}/test/io/ktor/webjars/WebjarsTest.kt (100%) rename ktor-features/ktor-websockets/{ => jvm}/src/io/ktor/websocket/Routing.kt (100%) rename ktor-features/ktor-websockets/{ => jvm}/src/io/ktor/websocket/WebSocketServerSession.kt (100%) rename ktor-features/ktor-websockets/{ => jvm}/src/io/ktor/websocket/WebSocketUpgrade.kt (100%) rename ktor-features/ktor-websockets/{ => jvm}/src/io/ktor/websocket/WebSockets.kt (100%) rename ktor-features/ktor-websockets/{ => jvm}/test/io/ktor/tests/websocket/CIOWebSocketTest.kt (100%) rename ktor-features/ktor-websockets/{ => jvm}/test/io/ktor/tests/websocket/JettyWebSocketTest.kt (100%) rename ktor-features/ktor-websockets/{ => jvm}/test/io/ktor/tests/websocket/NettyWebSocketTest.kt (100%) rename ktor-features/ktor-websockets/{ => jvm}/test/io/ktor/tests/websocket/ParserTest.kt (100%) rename ktor-features/ktor-websockets/{ => jvm}/test/io/ktor/tests/websocket/TomcatWebSocketTest.kt (100%) rename ktor-features/ktor-websockets/{ => jvm}/test/io/ktor/tests/websocket/WebSocketEngineSuite.kt (100%) rename ktor-features/ktor-websockets/{ => jvm}/test/io/ktor/tests/websocket/WebSocketTest.kt (100%) rename ktor-features/ktor-websockets/{ => jvm}/test/io/ktor/tests/websocket/WebSocketWithContentNegotiationTest.kt (100%) rename ktor-features/ktor-websockets/{ => jvm}/test/io/ktor/tests/websocket/WriterTest.kt (100%) rename ktor-http/{ => common}/src/io/ktor/content/Compatibility.kt (100%) rename ktor-http/{ => common}/src/io/ktor/http/ApplicationResponseProperties.kt (100%) rename ktor-http/{ => common}/src/io/ktor/http/CacheControl.kt (100%) rename ktor-http/{ => common}/src/io/ktor/http/Codecs.kt (100%) rename ktor-http/{ => common}/src/io/ktor/http/ContentDisposition.kt (100%) rename ktor-http/{ => common}/src/io/ktor/http/ContentRange.kt (100%) rename ktor-http/{ => common}/src/io/ktor/http/ContentTypes.kt (100%) rename ktor-http/{ => common}/src/io/ktor/http/Cookie.kt (100%) rename ktor-http/{ => common}/src/io/ktor/http/DateUtils.kt (100%) rename ktor-http/{ => common}/src/io/ktor/http/FileContentType.kt (100%) rename ktor-http/{ => common}/src/io/ktor/http/HeaderValueWithParameters.kt (100%) rename ktor-http/{ => common}/src/io/ktor/http/Headers.kt (100%) rename ktor-http/{ => common}/src/io/ktor/http/HttpHeaderValueParser.kt (100%) rename ktor-http/{ => common}/src/io/ktor/http/HttpHeaders.kt (100%) rename ktor-http/{ => common}/src/io/ktor/http/HttpMessage.kt (100%) rename ktor-http/{ => common}/src/io/ktor/http/HttpMessageProperties.kt (100%) rename ktor-http/{ => common}/src/io/ktor/http/HttpMethod.kt (100%) rename ktor-http/{ => common}/src/io/ktor/http/HttpProtocolVersion.kt (100%) rename ktor-http/{ => common}/src/io/ktor/http/HttpStatusCode.kt (100%) rename ktor-http/{ => common}/src/io/ktor/http/HttpUrlEncoded.kt (100%) rename ktor-http/{ => common}/src/io/ktor/http/IpParser.kt (100%) rename ktor-http/{ => common}/src/io/ktor/http/LinkHeader.kt (100%) rename ktor-http/{ => common}/src/io/ktor/http/Mimes.kt (100%) rename ktor-http/{ => common}/src/io/ktor/http/Parameters.kt (100%) rename ktor-http/{ => common}/src/io/ktor/http/Query.kt (100%) rename ktor-http/{ => common}/src/io/ktor/http/Ranges.kt (100%) rename ktor-http/{ => common}/src/io/ktor/http/RangesSpecifier.kt (100%) rename ktor-http/{ => common}/src/io/ktor/http/RequestConnectionPoint.kt (100%) rename ktor-http/{ => common}/src/io/ktor/http/URLBuilder.kt (100%) rename ktor-http/{ => common}/src/io/ktor/http/URLParser.kt (100%) rename ktor-http/{ => common}/src/io/ktor/http/URLProtocol.kt (100%) rename ktor-http/{ => common}/src/io/ktor/http/URLUtils.kt (100%) rename ktor-http/{ => common}/src/io/ktor/http/auth/AuthScheme.kt (100%) rename ktor-http/{ => common}/src/io/ktor/http/auth/HeaderValueEncoding.kt (100%) rename ktor-http/{ => common}/src/io/ktor/http/auth/HttpAuthHeader.kt (100%) rename ktor-http/{ => common}/src/io/ktor/http/content/ByteArrayContent.kt (100%) rename ktor-http/{ => common}/src/io/ktor/http/content/CachingOptions.kt (99%) rename ktor-http/{ => common}/src/io/ktor/http/content/Multipart.kt (100%) rename ktor-http/{ => common}/src/io/ktor/http/content/OutgoingContent.kt (100%) rename ktor-http/{ => common}/src/io/ktor/http/content/TextContent.kt (100%) rename ktor-http/{ => common}/src/io/ktor/http/parsing/Debug.kt (100%) rename ktor-http/{ => common}/src/io/ktor/http/parsing/GrammarBuilder.kt (100%) rename ktor-http/{ => common}/src/io/ktor/http/parsing/Parser.kt (100%) rename ktor-http/{ => common}/src/io/ktor/http/parsing/ParserDsl.kt (100%) rename ktor-http/{ => common}/src/io/ktor/http/parsing/Primitives.kt (100%) rename ktor-http/{ => common}/src/io/ktor/http/parsing/regex/RegexParser.kt (100%) rename ktor-http/{ => common}/src/io/ktor/http/parsing/regex/RegexParserGenerator.kt (100%) rename ktor-http/{ => common}/test/io/ktor/tests/http/CodecTest.kt (100%) rename ktor-http/{ => common}/test/io/ktor/tests/http/ContentTypeLookupTest.kt (100%) rename ktor-http/{ => common}/test/io/ktor/tests/http/ContentTypeMatchTest.kt (100%) rename ktor-http/{ => common}/test/io/ktor/tests/http/ContentTypeTest.kt (100%) rename ktor-http/{ => common}/test/io/ktor/tests/http/HeadersTest.kt (100%) rename ktor-http/{ => common}/test/io/ktor/tests/http/HttpStatusCodeTest.kt (100%) rename ktor-http/{ => common}/test/io/ktor/tests/http/QueryParametersTest.kt (100%) rename ktor-http/{ => common}/test/io/ktor/tests/http/RangesTest.kt (100%) rename ktor-http/{ => common}/test/io/ktor/tests/http/URLBuilderTest.kt (100%) rename ktor-http/{ => common}/test/io/ktor/tests/http/UrlTest.kt (100%) rename ktor-http/{ktor-http-jvm => jvm}/src/io/ktor/http/ApplicationResponsePropertiesJvm.kt (100%) rename ktor-http/{ktor-http-jvm => jvm}/src/io/ktor/http/FileContentTypeJvm.kt (100%) rename ktor-http/{ktor-http-jvm => jvm}/src/io/ktor/http/HttpDate.kt (100%) rename ktor-http/{ktor-http-jvm => jvm}/src/io/ktor/http/HttpMessagePropertiesJvm.kt (100%) rename ktor-http/{ktor-http-jvm => jvm}/src/io/ktor/http/URLBuilderJvm.kt (100%) rename ktor-http/{ktor-http-jvm => jvm}/src/io/ktor/http/URLUtilsJvm.kt (100%) rename ktor-http/{ktor-http-jvm => jvm}/src/io/ktor/http/content/CachingOptionsJvm.kt (100%) rename ktor-http/{ktor-http-jvm => jvm}/src/io/ktor/http/content/JarFileContent.kt (100%) rename ktor-http/{ktor-http-jvm => jvm}/src/io/ktor/http/content/LocalFileContent.kt (100%) rename ktor-http/{ktor-http-jvm => jvm}/src/io/ktor/http/content/MultipartJvm.kt (100%) rename ktor-http/{ktor-http-jvm => jvm}/src/io/ktor/http/content/URIFileContent.kt (83%) rename ktor-http/{ktor-http-jvm => jvm}/src/io/ktor/http/content/Versions.kt (100%) rename ktor-http/{ktor-http-jvm => jvm}/src/io/ktor/http/content/WriterContent.kt (100%) rename ktor-http/{ktor-http-jvm => jvm}/src/io/ktor/http/websocket/Utils.kt (100%) rename ktor-http/{ktor-http-jvm/test/io/ktor/tests/http/URLBuilderJvmTest.kt => jvm/test/io/ktor/tests/http/URLBuilderTest.kt} (98%) rename ktor-http/ktor-http-cio/{ => common}/src/io/ktor/http/cio/CIOHeaders.kt (96%) rename ktor-http/ktor-http-cio/{ => common}/src/io/ktor/http/cio/ChunkedTransferEncoding.kt (80%) rename ktor-http/ktor-http-cio/{ => common}/src/io/ktor/http/cio/ConnectionOptions.kt (69%) rename ktor-http/ktor-http-cio/{ => common}/src/io/ktor/http/cio/HttpBody.kt (77%) rename ktor-http/ktor-http-cio/{ => common}/src/io/ktor/http/cio/HttpHeadersMap.kt (87%) rename ktor-http/ktor-http-cio/{ => common}/src/io/ktor/http/cio/HttpParser.kt (83%) rename ktor-http/ktor-http-cio/{ => common}/src/io/ktor/http/cio/RequestResponse.kt (82%) rename ktor-http/ktor-http-cio/{ => common}/src/io/ktor/http/cio/internals/AsciiCharTree.kt (53%) rename ktor-http/ktor-http-cio/{src/io/ktor/http/cio/internals/CharBufferBuilder.kt => common/src/io/ktor/http/cio/internals/CharArrayBuilder.kt} (72%) create mode 100644 ktor-http/ktor-http-cio/common/src/io/ktor/http/cio/internals/CharArrayPool.kt rename ktor-http/ktor-http-cio/{ => common}/src/io/ktor/http/cio/internals/Chars.kt (83%) rename ktor-http/ktor-http-cio/{ => common}/src/io/ktor/http/cio/internals/MutableRange.kt (100%) rename ktor-http/ktor-http-cio/{ => common}/src/io/ktor/http/cio/internals/Tokenizer.kt (100%) rename ktor-http/ktor-http-cio/{test/io/ktor/tests/http/cio/CharBufferBuilderTest.kt => common/test/io/ktor/tests/http/cio/CharArrayBuilderTest.kt} (79%) rename ktor-http/ktor-http-cio/{ => jvm}/src/io/ktor/http/cio/CIOMultipartData.kt (98%) rename ktor-http/ktor-http-cio/{ => jvm}/src/io/ktor/http/cio/Multipart.kt (98%) rename ktor-http/ktor-http-cio/{ => jvm}/src/io/ktor/http/cio/Pipeline.kt (100%) rename ktor-http/ktor-http-cio/{ => jvm}/src/io/ktor/http/cio/RequestResponseBuilder.kt (100%) create mode 100644 ktor-http/ktor-http-cio/jvm/src/io/ktor/http/cio/internals/CharsJvm.kt rename ktor-http/ktor-http-cio/{ => jvm}/src/io/ktor/http/cio/internals/HttpByteBufferPool.kt (63%) rename ktor-http/ktor-http-cio/{ => jvm}/src/io/ktor/http/cio/internals/WeakTimeoutQueue.kt (91%) rename ktor-http/ktor-http-cio/{ => jvm}/src/io/ktor/http/cio/websocket/CloseReason.kt (100%) rename ktor-http/ktor-http-cio/{ => jvm}/src/io/ktor/http/cio/websocket/DefaultWebSocketSession.kt (100%) rename ktor-http/ktor-http-cio/{ => jvm}/src/io/ktor/http/cio/websocket/DefaultWebSocketSessionImpl.kt (100%) rename ktor-http/ktor-http-cio/{ => jvm}/src/io/ktor/http/cio/websocket/Frame.kt (100%) rename ktor-http/ktor-http-cio/{ => jvm}/src/io/ktor/http/cio/websocket/FrameParser.kt (100%) rename ktor-http/ktor-http-cio/{ => jvm}/src/io/ktor/http/cio/websocket/PingPong.kt (100%) rename ktor-http/ktor-http-cio/{ => jvm}/src/io/ktor/http/cio/websocket/RawWebSocket.kt (100%) rename ktor-http/ktor-http-cio/{ => jvm}/src/io/ktor/http/cio/websocket/Serializer.kt (100%) rename ktor-http/ktor-http-cio/{ => jvm}/src/io/ktor/http/cio/websocket/SimpleFrameCollector.kt (100%) rename ktor-http/ktor-http-cio/{ => jvm}/src/io/ktor/http/cio/websocket/Utils.kt (100%) rename ktor-http/ktor-http-cio/{ => jvm}/src/io/ktor/http/cio/websocket/WebSocketInternalAPI.kt (100%) rename ktor-http/ktor-http-cio/{ => jvm}/src/io/ktor/http/cio/websocket/WebSocketReader.kt (100%) rename ktor-http/ktor-http-cio/{ => jvm}/src/io/ktor/http/cio/websocket/WebSocketSession.kt (100%) rename ktor-http/ktor-http-cio/{ => jvm}/src/io/ktor/http/cio/websocket/WebSocketWriter.kt (100%) rename ktor-http/ktor-http-cio/{ => jvm}/test/io/ktor/tests/http/cio/ChunkedTest.kt (94%) rename ktor-http/ktor-http-cio/{ => jvm}/test/io/ktor/tests/http/cio/HeadersTest.kt (99%) rename ktor-http/ktor-http-cio/{ => jvm}/test/io/ktor/tests/http/cio/IntegrationTest.kt (100%) rename ktor-http/ktor-http-cio/{ => jvm}/test/io/ktor/tests/http/cio/MultipartTest.kt (100%) rename ktor-http/ktor-http-cio/{ => jvm}/test/io/ktor/tests/http/cio/RequestParserTest.kt (100%) rename ktor-http/ktor-http-cio/{ => jvm}/test/io/ktor/tests/http/cio/RequestResponseBuilderTest.kt (96%) rename ktor-http/ktor-http-cio/{ => jvm}/test/io/ktor/tests/http/cio/TestHttpServer.kt (82%) rename ktor-http/ktor-http-cio/{ => jvm}/test/io/ktor/tests/http/cio/WeakTimeoutQueueTest.kt (100%) delete mode 100644 ktor-http/ktor-http-cio/src/io/ktor/http/cio/internals/CharBufferPool.kt delete mode 100644 ktor-http/ktor-http-ios/build.gradle delete mode 100644 ktor-http/ktor-http-js/build.gradle delete mode 100644 ktor-http/ktor-http-jvm/build.gradle rename ktor-network/{ => jvm}/src/io/ktor/network/selector/ActorSelectorManager.kt (100%) rename ktor-network/{ => jvm}/src/io/ktor/network/selector/InterestSuspensionsMap.kt (100%) rename ktor-network/{ => jvm}/src/io/ktor/network/selector/LockFreeMPSCQueue.kt (100%) rename ktor-network/{ => jvm}/src/io/ktor/network/selector/Selectable.kt (100%) rename ktor-network/{ => jvm}/src/io/ktor/network/selector/SelectorManager.kt (100%) rename ktor-network/{ => jvm}/src/io/ktor/network/selector/SelectorManagerSupport.kt (100%) rename ktor-network/{ => jvm}/src/io/ktor/network/sockets/Builders.kt (100%) rename ktor-network/{ => jvm}/src/io/ktor/network/sockets/CIOReader.kt (100%) rename ktor-network/{ => jvm}/src/io/ktor/network/sockets/CIOWriter.kt (100%) rename ktor-network/{ => jvm}/src/io/ktor/network/sockets/Datagram.kt (100%) rename ktor-network/{ => jvm}/src/io/ktor/network/sockets/DatagramSocketImpl.kt (100%) rename ktor-network/{ => jvm}/src/io/ktor/network/sockets/NIOSocket.kt (100%) rename ktor-network/{ => jvm}/src/io/ktor/network/sockets/ServerSocketImpl.kt (100%) rename ktor-network/{ => jvm}/src/io/ktor/network/sockets/SocketImpl.kt (100%) rename ktor-network/{ => jvm}/src/io/ktor/network/sockets/Sockets.kt (100%) rename ktor-network/{ => jvm}/src/io/ktor/network/util/Coroutines.kt (100%) rename ktor-network/{ => jvm}/src/io/ktor/network/util/IOCoroutineDispatcher.kt (100%) rename ktor-network/{ => jvm}/src/io/ktor/network/util/Pools.kt (100%) rename ktor-network/{ => jvm}/test/io/ktor/network/sockets/tests/ClientSocketTest.kt (100%) rename ktor-network/{ => jvm}/test/io/ktor/network/sockets/tests/ServerSocketTest.kt (100%) rename ktor-network/ktor-network-tls/{ => jvm}/src/io/ktor/network/tls/Cipher.kt (100%) rename ktor-network/ktor-network-tls/{ => jvm}/src/io/ktor/network/tls/CipherSuites.kt (100%) rename ktor-network/ktor-network-tls/{ => jvm}/src/io/ktor/network/tls/Hashes.kt (100%) rename ktor-network/ktor-network-tls/{ => jvm}/src/io/ktor/network/tls/Headers.kt (100%) rename ktor-network/ktor-network-tls/{ => jvm}/src/io/ktor/network/tls/Keys.kt (100%) rename ktor-network/ktor-network-tls/{ => jvm}/src/io/ktor/network/tls/OID.kt (100%) rename ktor-network/ktor-network-tls/{ => jvm}/src/io/ktor/network/tls/Parser.kt (100%) rename ktor-network/ktor-network-tls/{ => jvm}/src/io/ktor/network/tls/Render.kt (100%) rename ktor-network/ktor-network-tls/{ => jvm}/src/io/ktor/network/tls/TLS.kt (100%) rename ktor-network/ktor-network-tls/{ => jvm}/src/io/ktor/network/tls/TLSAlert.kt (100%) rename ktor-network/ktor-network-tls/{ => jvm}/src/io/ktor/network/tls/TLSClientHandshake.kt (100%) rename ktor-network/ktor-network-tls/{ => jvm}/src/io/ktor/network/tls/TLSClientSession.kt (100%) rename ktor-network/ktor-network-tls/{ => jvm}/src/io/ktor/network/tls/TLSHandshakeType.kt (100%) rename ktor-network/ktor-network-tls/{ => jvm}/src/io/ktor/network/tls/TLSRecordType.kt (100%) rename ktor-network/ktor-network-tls/{ => jvm}/src/io/ktor/network/tls/TLSVersion.kt (100%) rename ktor-network/ktor-network-tls/{ => jvm}/src/io/ktor/network/tls/Utils.kt (100%) rename ktor-network/ktor-network-tls/{ => jvm}/src/io/ktor/network/tls/certificates/Certificates.kt (100%) rename ktor-network/ktor-network-tls/{ => jvm}/src/io/ktor/network/tls/certificates/builders.kt (100%) rename ktor-network/ktor-network-tls/{ => jvm}/src/io/ktor/network/tls/extensions/NamedCurves.kt (100%) rename ktor-network/ktor-network-tls/{ => jvm}/src/io/ktor/network/tls/extensions/PointFormat.kt (100%) rename ktor-network/ktor-network-tls/{ => jvm}/src/io/ktor/network/tls/extensions/SignatureAlgorithm.kt (100%) rename ktor-network/ktor-network-tls/{ => jvm}/src/io/ktor/network/tls/extensions/TLSExtension.kt (100%) rename ktor-network/ktor-network-tls/{ => jvm}/src/io/ktor/network/tls/platform/PlatformVersion.kt (100%) rename ktor-network/ktor-network-tls/{ => jvm}/test/io/ktor/network/tls/tests/ConnectionTests.kt (86%) create mode 100644 ktor-server/jvm/.gitkeep rename ktor-server/ktor-server-benchmarks/{src-jmh => src/jmh/kotlin}/io/ktor/server/benchmarks/AsyncIntegrationBenchmark.kt (100%) rename ktor-server/ktor-server-benchmarks/{src-jmh => src/jmh/kotlin}/io/ktor/server/benchmarks/BenchmarkRunner.kt (100%) rename ktor-server/ktor-server-benchmarks/{src-jmh => src/jmh/kotlin}/io/ktor/server/benchmarks/CIOChunkedBenchmark.kt (100%) rename ktor-server/ktor-server-benchmarks/{src-jmh => src/jmh/kotlin}/io/ktor/server/benchmarks/ChannelBenchmarks.kt (100%) rename ktor-server/ktor-server-benchmarks/{src-jmh => src/jmh/kotlin}/io/ktor/server/benchmarks/CodecsBenchmark.kt (100%) rename ktor-server/ktor-server-benchmarks/{src-jmh => src/jmh/kotlin}/io/ktor/server/benchmarks/HttpBenchmarkAsyncClients.kt (100%) rename ktor-server/ktor-server-benchmarks/{src-jmh => src/jmh/kotlin}/io/ktor/server/benchmarks/HttpBenchmarkClient.kt (100%) rename ktor-server/ktor-server-benchmarks/{src-jmh => src/jmh/kotlin}/io/ktor/server/benchmarks/IntegrationBenchmark.kt (100%) rename ktor-server/ktor-server-benchmarks/{src-jmh => src/jmh/kotlin}/io/ktor/server/benchmarks/PipelineBenchmark.kt (100%) rename ktor-server/ktor-server-benchmarks/{src-jmh => src/jmh/kotlin}/io/ktor/server/benchmarks/PlatformBenchmark.kt (100%) rename ktor-server/ktor-server-benchmarks/{src-jmh => src/jmh/kotlin}/io/ktor/server/benchmarks/RoutingBenchmark.kt (100%) rename ktor-server/ktor-server-benchmarks/{src-jmh => src/jmh/kotlin}/io/ktor/server/benchmarks/StringValuesBenchmark.kt (100%) rename ktor-server/ktor-server-benchmarks/{src-jmh => src/jmh/kotlin}/io/ktor/server/benchmarks/cio/CIOIntegrationBenchmark.kt (100%) rename ktor-server/ktor-server-benchmarks/{src-jmh => src/jmh/kotlin}/io/ktor/server/benchmarks/cio/CIOPlatformBenchmark.kt (100%) rename ktor-server/ktor-server-benchmarks/{src-jmh => src/jmh/kotlin}/io/ktor/server/benchmarks/jetty/JettyIntegrationBenchmark.kt (100%) rename ktor-server/ktor-server-benchmarks/{src-jmh => src/jmh/kotlin}/io/ktor/server/benchmarks/jetty/JettyPlatformBenchmark.kt (100%) rename ktor-server/ktor-server-benchmarks/{src-jmh => src/jmh/kotlin}/io/ktor/server/benchmarks/netty/NettyIntegrationBenchmark.kt (100%) rename ktor-server/ktor-server-benchmarks/{src-jmh => src/jmh/kotlin}/io/ktor/server/benchmarks/netty/NettyPlatformBenchmark.kt (100%) rename ktor-server/ktor-server-benchmarks/{src-jmh => src/jmh/kotlin}/io/ktor/server/benchmarks/test/TestIntegrationBenchmark.kt (100%) rename ktor-server/ktor-server-cio/{ => jvm}/src/io/ktor/server/cio/CIO.kt (100%) rename ktor-server/ktor-server-cio/{ => jvm}/src/io/ktor/server/cio/CIOApplicationCall.kt (100%) rename ktor-server/ktor-server-cio/{ => jvm}/src/io/ktor/server/cio/CIOApplicationEngine.kt (100%) rename ktor-server/ktor-server-cio/{ => jvm}/src/io/ktor/server/cio/CIOApplicationRequest.kt (94%) rename ktor-server/ktor-server-cio/{ => jvm}/src/io/ktor/server/cio/CIOApplicationResponse.kt (100%) rename ktor-server/ktor-server-cio/{ => jvm}/src/io/ktor/server/cio/EngineMain.kt (100%) rename ktor-server/ktor-server-cio/{ => jvm}/src/io/ktor/server/cio/HttpServer.kt (96%) rename ktor-server/ktor-server-cio/{ => jvm}/test/io/ktor/tests/server/cio/CIOEngineTest.kt (100%) rename ktor-server/ktor-server-cio/{ => jvm}/test/io/ktor/tests/server/cio/CIOHttpClientTest.kt (100%) rename ktor-server/ktor-server-cio/{ => jvm}/test/io/ktor/tests/server/cio/RAWExample.kt (85%) rename ktor-server/ktor-server-core/{ => jvm}/src/io/ktor/application/Application.kt (100%) rename ktor-server/ktor-server-core/{ => jvm}/src/io/ktor/application/ApplicationCall.kt (100%) rename ktor-server/ktor-server-core/{ => jvm}/src/io/ktor/application/ApplicationCallPipeline.kt (100%) rename ktor-server/ktor-server-core/{ => jvm}/src/io/ktor/application/ApplicationEnvironment.kt (100%) rename ktor-server/ktor-server-core/{ => jvm}/src/io/ktor/application/ApplicationEvents.kt (100%) rename ktor-server/ktor-server-core/{ => jvm}/src/io/ktor/application/ApplicationFeature.kt (100%) rename ktor-server/ktor-server-core/{ => jvm}/src/io/ktor/application/DefaultApplicationEvents.kt (100%) rename ktor-server/ktor-server-core/{ => jvm}/src/io/ktor/config/ApplicationConfig.kt (100%) rename ktor-server/ktor-server-core/{ => jvm}/src/io/ktor/config/HoconApplicationConfig.kt (100%) rename ktor-server/ktor-server-core/{ => jvm}/src/io/ktor/config/MapApplicationConfig.kt (100%) rename ktor-server/ktor-server-core/{ => jvm}/src/io/ktor/features/AutoHeadResponse.kt (100%) rename ktor-server/ktor-server-core/{ => jvm}/src/io/ktor/features/CORS.kt (100%) rename ktor-server/ktor-server-core/{ => jvm}/src/io/ktor/features/CachingHeaders.kt (100%) rename ktor-server/ktor-server-core/{ => jvm}/src/io/ktor/features/CallId.kt (100%) rename ktor-server/ktor-server-core/{ => jvm}/src/io/ktor/features/CallLogging.kt (100%) rename ktor-server/ktor-server-core/{ => jvm}/src/io/ktor/features/Compression.kt (100%) rename ktor-server/ktor-server-core/{ => jvm}/src/io/ktor/features/ConditionalHeaders.kt (100%) rename ktor-server/ktor-server-core/{ => jvm}/src/io/ktor/features/ContentNegotiation.kt (100%) rename ktor-server/ktor-server-core/{ => jvm}/src/io/ktor/features/DataConversion.kt (100%) rename ktor-server/ktor-server-core/{ => jvm}/src/io/ktor/features/DefaultHeaders.kt (100%) rename ktor-server/ktor-server-core/{ => jvm}/src/io/ktor/features/HSTS.kt (100%) rename ktor-server/ktor-server-core/{ => jvm}/src/io/ktor/features/HttpsRedirect.kt (100%) rename ktor-server/ktor-server-core/{ => jvm}/src/io/ktor/features/MultipleRangeWriter.kt (100%) rename ktor-server/ktor-server-core/{ => jvm}/src/io/ktor/features/OriginConnectionPoint.kt (100%) rename ktor-server/ktor-server-core/{ => jvm}/src/io/ktor/features/PartialContent.kt (100%) rename ktor-server/ktor-server-core/{ => jvm}/src/io/ktor/features/StatusPages.kt (100%) rename ktor-server/ktor-server-core/{ => jvm}/src/io/ktor/http/LinkHeader.kt (100%) rename ktor-server/ktor-server-core/{ => jvm}/src/io/ktor/http/Push.kt (100%) rename ktor-server/ktor-server-core/{ => jvm}/src/io/ktor/http/content/DefaultTransform.kt (100%) rename ktor-server/ktor-server-core/{ => jvm}/src/io/ktor/http/content/HttpStatusCodeContent.kt (100%) rename ktor-server/ktor-server-core/{ => jvm}/src/io/ktor/http/content/OutputStreamContent.kt (100%) rename ktor-server/ktor-server-core/{ => jvm}/src/io/ktor/http/content/StaticContent.kt (100%) rename ktor-server/ktor-server-core/{ => jvm}/src/io/ktor/http/content/StaticContentResolution.kt (85%) rename ktor-server/ktor-server-core/{ => jvm}/src/io/ktor/request/ApplicationReceiveFunctions.kt (100%) rename ktor-server/ktor-server-core/{ => jvm}/src/io/ktor/request/ApplicationRequest.kt (100%) rename ktor-server/ktor-server-core/{ => jvm}/src/io/ktor/request/ApplicationRequestProperties.kt (100%) rename ktor-server/ktor-server-core/{ => jvm}/src/io/ktor/request/RequestCookies.kt (100%) rename ktor-server/ktor-server-core/{ => jvm}/src/io/ktor/response/ApplicationResponse.kt (100%) rename ktor-server/ktor-server-core/{ => jvm}/src/io/ktor/response/ApplicationResponseFunctions.kt (100%) rename ktor-server/ktor-server-core/{ => jvm}/src/io/ktor/response/ApplicationResponseProperties.kt (100%) rename ktor-server/ktor-server-core/{ => jvm}/src/io/ktor/response/ApplicationSendPipeline.kt (100%) rename ktor-server/ktor-server-core/{ => jvm}/src/io/ktor/response/DefaultResponsePushBuilder.kt (100%) rename ktor-server/ktor-server-core/{ => jvm}/src/io/ktor/response/ResponseCookies.kt (100%) rename ktor-server/ktor-server-core/{ => jvm}/src/io/ktor/response/ResponseHeaders.kt (100%) rename ktor-server/ktor-server-core/{ => jvm}/src/io/ktor/response/ResponsePushBuilder.kt (100%) rename ktor-server/ktor-server-core/{ => jvm}/src/io/ktor/routing/Route.kt (100%) rename ktor-server/ktor-server-core/{ => jvm}/src/io/ktor/routing/RouteSelector.kt (100%) rename ktor-server/ktor-server-core/{ => jvm}/src/io/ktor/routing/Routing.kt (100%) rename ktor-server/ktor-server-core/{ => jvm}/src/io/ktor/routing/RoutingApplicationCall.kt (100%) rename ktor-server/ktor-server-core/{ => jvm}/src/io/ktor/routing/RoutingBuilder.kt (100%) rename ktor-server/ktor-server-core/{ => jvm}/src/io/ktor/routing/RoutingPath.kt (100%) rename ktor-server/ktor-server-core/{ => jvm}/src/io/ktor/routing/RoutingResolve.kt (100%) rename ktor-server/ktor-server-core/{ => jvm}/src/io/ktor/routing/RoutingResolveTrace.kt (100%) rename ktor-server/ktor-server-core/{ => jvm}/src/io/ktor/sessions/SessionProvider.kt (100%) rename ktor-server/ktor-server-core/{ => jvm}/src/io/ktor/sessions/SessionSerializer.kt (100%) rename ktor-server/ktor-server-core/{ => jvm}/src/io/ktor/sessions/SessionSerializerReflection.kt (100%) rename ktor-server/ktor-server-core/{ => jvm}/src/io/ktor/sessions/SessionStorage.kt (100%) rename ktor-server/ktor-server-core/{ => jvm}/src/io/ktor/sessions/SessionStorageMemory.kt (100%) rename ktor-server/ktor-server-core/{ => jvm}/src/io/ktor/sessions/SessionTracker.kt (100%) rename ktor-server/ktor-server-core/{ => jvm}/src/io/ktor/sessions/SessionTrackerById.kt (100%) rename ktor-server/ktor-server-core/{ => jvm}/src/io/ktor/sessions/SessionTrackerByValue.kt (100%) rename ktor-server/ktor-server-core/{ => jvm}/src/io/ktor/sessions/SessionTransport.kt (100%) rename ktor-server/ktor-server-core/{ => jvm}/src/io/ktor/sessions/SessionTransportCookie.kt (100%) rename ktor-server/ktor-server-core/{ => jvm}/src/io/ktor/sessions/SessionTransportHeader.kt (100%) rename ktor-server/ktor-server-core/{ => jvm}/src/io/ktor/sessions/SessionTransportTransformer.kt (100%) rename ktor-server/ktor-server-core/{ => jvm}/src/io/ktor/sessions/SessionTransportTransformerDigest.kt (100%) rename ktor-server/ktor-server-core/{ => jvm}/src/io/ktor/sessions/SessionTransportTransformerEncrypt.kt (100%) rename ktor-server/ktor-server-core/{ => jvm}/src/io/ktor/sessions/SessionTransportTransformerMessageAuthentication.kt (100%) rename ktor-server/ktor-server-core/{ => jvm}/src/io/ktor/sessions/Sessions.kt (100%) rename ktor-server/ktor-server-core/{ => jvm}/src/io/ktor/sessions/SessionsBuilder.kt (100%) rename ktor-server/ktor-server-core/{ => jvm}/src/io/ktor/util/ConversionService.kt (100%) rename ktor-server/ktor-server-core/{ => jvm}/src/io/ktor/util/DispatcherWithShutdown.kt (100%) rename ktor-server/ktor-server-core/{ => jvm}/src/io/ktor/util/URLBuilder.kt (100%) rename ktor-server/ktor-server-core/{ => jvm}/test-resources/error404.html (100%) rename ktor-server/ktor-server-core/{ => jvm}/test-resources/logback-test.xml (100%) rename ktor-server/ktor-server-core/{ => jvm}/test/io/ktor/tests/http/FindContainingJarFileTest.kt (100%) rename ktor-server/ktor-server-core/{ => jvm}/test/io/ktor/tests/http/MultipleRangeWriterTest.kt (100%) rename ktor-server/ktor-server-host-common/{ => jvm}/src/io/ktor/server/engine/ApplicationEngine.kt (100%) rename ktor-server/ktor-server-host-common/{ => jvm}/src/io/ktor/server/engine/ApplicationEngineEnvironment.kt (100%) rename ktor-server/ktor-server-host-common/{ => jvm}/src/io/ktor/server/engine/ApplicationEngineEnvironmentReloading.kt (100%) rename ktor-server/ktor-server-host-common/{ => jvm}/src/io/ktor/server/engine/BaseApplicationCall.kt (100%) rename ktor-server/ktor-server-host-common/{ => jvm}/src/io/ktor/server/engine/BaseApplicationEngine.kt (100%) rename ktor-server/ktor-server-host-common/{ => jvm}/src/io/ktor/server/engine/BaseApplicationRequest.kt (100%) rename ktor-server/ktor-server-host-common/{ => jvm}/src/io/ktor/server/engine/BaseApplicationResponse.kt (100%) rename ktor-server/ktor-server-host-common/{ => jvm}/src/io/ktor/server/engine/CommandLine.kt (100%) rename ktor-server/ktor-server-host-common/{ => jvm}/src/io/ktor/server/engine/DefaultEnginePipeline.kt (100%) rename ktor-server/ktor-server-host-common/{ => jvm}/src/io/ktor/server/engine/DefaultTransform.kt (95%) rename ktor-server/ktor-server-host-common/{ => jvm}/src/io/ktor/server/engine/EmbeddedServer.kt (100%) rename ktor-server/ktor-server-host-common/{ => jvm}/src/io/ktor/server/engine/EngineAPI.kt (100%) rename ktor-server/ktor-server-host-common/{ => jvm}/src/io/ktor/server/engine/EngineConnectorConfig.kt (100%) rename ktor-server/ktor-server-host-common/{ => jvm}/src/io/ktor/server/engine/EngineContextCancellationHelper.kt (100%) rename ktor-server/ktor-server-host-common/{ => jvm}/src/io/ktor/server/engine/EnginePipeline.kt (100%) rename ktor-server/ktor-server-host-common/{ => jvm}/src/io/ktor/server/engine/Long.kt (100%) rename ktor-server/ktor-server-host-common/{ => jvm}/src/io/ktor/server/engine/OverridingClassLoader.kt (100%) rename ktor-server/ktor-server-host-common/{ => jvm}/src/io/ktor/server/engine/ShutDownUrl.kt (100%) rename ktor-server/ktor-server-host-common/{ => jvm}/test-resources/application.conf (100%) rename ktor-server/ktor-server-host-common/{ => jvm}/test-resources/applicationWithEnv.conf (100%) rename ktor-server/ktor-server-host-common/{ => jvm}/test/io/ktor/tests/hosts/ApplicationEngineEnvironmentReloadingTests.kt (100%) rename ktor-server/ktor-server-host-common/{ => jvm}/test/io/ktor/tests/hosts/CommandLineTest.kt (100%) rename ktor-server/ktor-server-jetty/{ => jvm}/src/io/ktor/server/jetty/Embedded.kt (100%) rename ktor-server/ktor-server-jetty/{ => jvm}/src/io/ktor/server/jetty/EngineMain.kt (100%) rename ktor-server/ktor-server-jetty/{ => jvm}/src/io/ktor/server/jetty/JettyApplicationCall.kt (100%) rename ktor-server/ktor-server-jetty/{ => jvm}/src/io/ktor/server/jetty/JettyApplicationEngine.kt (100%) rename ktor-server/ktor-server-jetty/{ => jvm}/src/io/ktor/server/jetty/JettyApplicationEngineBase.kt (100%) rename ktor-server/ktor-server-jetty/{ => jvm}/src/io/ktor/server/jetty/JettyApplicationResponse.kt (100%) rename ktor-server/ktor-server-jetty/{ => jvm}/src/io/ktor/server/jetty/JettyKtorHandler.kt (100%) rename ktor-server/ktor-server-jetty/{ => jvm}/src/io/ktor/server/jetty/ServerInitializer.kt (100%) rename ktor-server/ktor-server-jetty/{ => jvm}/src/io/ktor/server/jetty/internal/EndPointChannels.kt (100%) rename ktor-server/ktor-server-jetty/{ => jvm}/src/io/ktor/server/jetty/internal/JettyUpgradeImpl.kt (100%) rename ktor-server/ktor-server-jetty/{ktor-server-jetty-test-http2 => jvm}/test/io/ktor/tests/server/jetty/JettyEngineTest.kt (100%) rename ktor-server/ktor-server-jetty/{ => jvm}/test/io/ktor/tests/server/jetty/JettyServletContainerEngineTest.kt (83%) rename ktor-server/ktor-server-jetty/{ => jvm}/test/io/ktor/tests/server/jetty/JettyStressTest.kt (100%) rename ktor-server/ktor-server-jetty/{ktor-server-jetty-test-http2 => jvm}/test/io/ktor/tests/server/jetty/MultipleDispatchOnTimeout.kt (100%) rename ktor-server/ktor-server-jetty/{ => ktor-server-jetty-test-http2/jvm}/test/io/ktor/tests/server/jetty/JettyEngineTest.kt (100%) rename ktor-server/ktor-server-jetty/ktor-server-jetty-test-http2/{ => jvm}/test/io/ktor/tests/server/jetty/JettyServletContainerEngineTest.kt (83%) rename ktor-server/ktor-server-jetty/{ => ktor-server-jetty-test-http2/jvm}/test/io/ktor/tests/server/jetty/MultipleDispatchOnTimeout.kt (100%) rename ktor-server/ktor-server-netty/{ => jvm}/src/io/ktor/server/netty/CIO.kt (100%) rename ktor-server/ktor-server-netty/{ => jvm}/src/io/ktor/server/netty/Embedded.kt (100%) rename ktor-server/ktor-server-netty/{ => jvm}/src/io/ktor/server/netty/EngineMain.kt (100%) rename ktor-server/ktor-server-netty/{ => jvm}/src/io/ktor/server/netty/NettyApplicationCall.kt (100%) rename ktor-server/ktor-server-netty/{ => jvm}/src/io/ktor/server/netty/NettyApplicationCallHandler.kt (100%) rename ktor-server/ktor-server-netty/{ => jvm}/src/io/ktor/server/netty/NettyApplicationEngine.kt (100%) rename ktor-server/ktor-server-netty/{ => jvm}/src/io/ktor/server/netty/NettyApplicationRequest.kt (100%) rename ktor-server/ktor-server-netty/{ => jvm}/src/io/ktor/server/netty/NettyApplicationRequestCookies.kt (100%) rename ktor-server/ktor-server-netty/{ => jvm}/src/io/ktor/server/netty/NettyApplicationRequestHeaders.kt (100%) rename ktor-server/ktor-server-netty/{ => jvm}/src/io/ktor/server/netty/NettyApplicationResponse.kt (100%) rename ktor-server/ktor-server-netty/{ => jvm}/src/io/ktor/server/netty/NettyChannelInitializer.kt (100%) rename ktor-server/ktor-server-netty/{ => jvm}/src/io/ktor/server/netty/NettyDirectDecoder.kt (100%) rename ktor-server/ktor-server-netty/{ => jvm}/src/io/ktor/server/netty/NettyDirectEncoder.kt (100%) rename ktor-server/ktor-server-netty/{ => jvm}/src/io/ktor/server/netty/NettyMultipartDataSupport.kt (100%) rename ktor-server/ktor-server-netty/{ => jvm}/src/io/ktor/server/netty/cio/NettyRequestQueue.kt (100%) rename ktor-server/ktor-server-netty/{ => jvm}/src/io/ktor/server/netty/cio/NettyResponsePipeline.kt (100%) rename ktor-server/ktor-server-netty/{ => jvm}/src/io/ktor/server/netty/cio/RequestBodyHandler.kt (100%) rename ktor-server/ktor-server-netty/{ => jvm}/src/io/ktor/server/netty/http1/NettyConnectionPoint.kt (100%) rename ktor-server/ktor-server-netty/{ => jvm}/src/io/ktor/server/netty/http1/NettyHttp1ApplicationCall.kt (100%) rename ktor-server/ktor-server-netty/{ => jvm}/src/io/ktor/server/netty/http1/NettyHttp1ApplicationRequest.kt (100%) rename ktor-server/ktor-server-netty/{ => jvm}/src/io/ktor/server/netty/http1/NettyHttp1ApplicationResponse.kt (100%) rename ktor-server/ktor-server-netty/{ => jvm}/src/io/ktor/server/netty/http1/NettyHttp1Handler.kt (100%) rename ktor-server/ktor-server-netty/{ => jvm}/src/io/ktor/server/netty/http2/Http2LocalConnectionPoint.kt (100%) rename ktor-server/ktor-server-netty/{ => jvm}/src/io/ktor/server/netty/http2/HttpFrameAdapter.kt (100%) rename ktor-server/ktor-server-netty/{ => jvm}/src/io/ktor/server/netty/http2/NettyHttp2ApplicationCall.kt (100%) rename ktor-server/ktor-server-netty/{ => jvm}/src/io/ktor/server/netty/http2/NettyHttp2ApplicationRequest.kt (100%) rename ktor-server/ktor-server-netty/{ => jvm}/src/io/ktor/server/netty/http2/NettyHttp2ApplicationResponse.kt (100%) rename ktor-server/ktor-server-netty/{ => jvm}/src/io/ktor/server/netty/http2/NettyHttp2Handler.kt (100%) rename ktor-server/ktor-server-netty/{ => jvm}/test/io/ktor/tests/server/netty/NettyEngineTest.kt (100%) rename ktor-server/ktor-server-netty/{ => jvm}/test/io/ktor/tests/server/netty/NettyStressTest.kt (100%) rename ktor-server/ktor-server-servlet/{ => jvm}/src/io/ktor/server/servlet/AsyncServlet.kt (100%) rename ktor-server/ktor-server-servlet/{ => jvm}/src/io/ktor/server/servlet/BlockingServlet.kt (100%) rename ktor-server/ktor-server-servlet/{ => jvm}/src/io/ktor/server/servlet/JAASBridge.kt (100%) rename ktor-server/ktor-server-servlet/{ => jvm}/src/io/ktor/server/servlet/KtorServlet.kt (100%) rename ktor-server/ktor-server-servlet/{ => jvm}/src/io/ktor/server/servlet/ServletApplicationEngine.kt (100%) rename ktor-server/ktor-server-servlet/{ => jvm}/src/io/ktor/server/servlet/ServletApplicationRequest.kt (100%) rename ktor-server/ktor-server-servlet/{ => jvm}/src/io/ktor/server/servlet/ServletApplicationRequestCookies.kt (100%) rename ktor-server/ktor-server-servlet/{ => jvm}/src/io/ktor/server/servlet/ServletApplicationRequestHeaders.kt (100%) rename ktor-server/ktor-server-servlet/{ => jvm}/src/io/ktor/server/servlet/ServletApplicationResponse.kt (100%) rename ktor-server/ktor-server-servlet/{ => jvm}/src/io/ktor/server/servlet/ServletConnectionPoint.kt (100%) rename ktor-server/ktor-server-servlet/{ => jvm}/src/io/ktor/server/servlet/ServletReader.kt (100%) rename ktor-server/ktor-server-servlet/{ => jvm}/src/io/ktor/server/servlet/ServletUpgrade.kt (100%) rename ktor-server/ktor-server-servlet/{ => jvm}/src/io/ktor/server/servlet/ServletWriter.kt (100%) rename ktor-server/ktor-server-servlet/{ => jvm}/src/io/ktor/server/servlet/v4/Push.kt (100%) rename ktor-server/ktor-server-test-host/{ => jvm}/src/io/ktor/server/testing/EngineStressSuite.kt (97%) rename ktor-server/ktor-server-test-host/{ => jvm}/src/io/ktor/server/testing/EngineTestBase.kt (100%) rename ktor-server/ktor-server-test-host/{ => jvm}/src/io/ktor/server/testing/EngineTestSuite.kt (92%) rename ktor-server/{ktor-server-core/test/io/ktor/tests/http => ktor-server-test-host/jvm/src/io/ktor/server/testing}/HighLoadHttpGenerator.kt (89%) rename ktor-server/ktor-server-test-host/{ => jvm}/src/io/ktor/server/testing/StressSuiteRunner.kt (100%) rename ktor-server/ktor-server-test-host/{ => jvm}/src/io/ktor/server/testing/TestApplicationCall.kt (100%) rename ktor-server/ktor-server-test-host/{ => jvm}/src/io/ktor/server/testing/TestApplicationEngine.kt (100%) rename ktor-server/ktor-server-test-host/{ => jvm}/src/io/ktor/server/testing/TestApplicationRequest.kt (100%) rename ktor-server/ktor-server-test-host/{ => jvm}/src/io/ktor/server/testing/TestApplicationResponse.kt (100%) rename ktor-server/ktor-server-test-host/{ => jvm}/src/io/ktor/server/testing/TestEngine.kt (100%) rename ktor-server/ktor-server-test-host/{ => jvm}/src/io/ktor/server/testing/Utils.kt (100%) rename ktor-server/ktor-server-test-host/{ => jvm}/src/io/ktor/server/testing/client/TestHttpClientConfig.kt (100%) rename ktor-server/ktor-server-test-host/{ => jvm}/src/io/ktor/server/testing/client/TestHttpClientEngine.kt (100%) rename ktor-server/ktor-server-test-host/{ => jvm}/src/io/ktor/server/testing/client/TestHttpClientRequest.kt (100%) rename ktor-server/ktor-server-test-host/{ => jvm}/src/io/ktor/server/testing/client/TestHttpClientResponse.kt (100%) rename ktor-server/ktor-server-tests/{test => jvm/src}/io/ktor/tests/server/testing/TestApplicationEngineTest.kt (100%) rename ktor-server/ktor-server-tests/{ => jvm}/test/io/ktor/tests/server/application/ApplicationRequestHeaderTest.kt (100%) rename ktor-server/ktor-server-tests/{ => jvm}/test/io/ktor/tests/server/application/ConfigTest.kt (100%) rename ktor-server/ktor-server-tests/{ => jvm}/test/io/ktor/tests/server/application/HandlerTest.kt (100%) rename ktor-server/ktor-server-tests/{ => jvm}/test/io/ktor/tests/server/features/CORSTest.kt (100%) rename ktor-server/ktor-server-tests/{ => jvm}/test/io/ktor/tests/server/features/CallIdTest.kt (100%) rename ktor-server/ktor-server-tests/{ => jvm}/test/io/ktor/tests/server/features/CallLoggingTest.kt (100%) rename ktor-server/ktor-server-tests/{ => jvm}/test/io/ktor/tests/server/features/CompressionTest.kt (100%) rename ktor-server/ktor-server-tests/{ => jvm}/test/io/ktor/tests/server/features/ConditionalHeadersTests.kt (100%) rename ktor-server/ktor-server-tests/{ => jvm}/test/io/ktor/tests/server/features/ContentNegotiationTest.kt (100%) rename ktor-server/ktor-server-tests/{ => jvm}/test/io/ktor/tests/server/features/CookiesTest.kt (100%) rename ktor-server/ktor-server-tests/{ => jvm}/test/io/ktor/tests/server/features/DataConversionTest.kt (100%) rename ktor-server/ktor-server-tests/{ => jvm}/test/io/ktor/tests/server/features/HSTSTest.kt (100%) rename ktor-server/ktor-server-tests/{ => jvm}/test/io/ktor/tests/server/features/HeadTest.kt (100%) rename ktor-server/ktor-server-tests/{ => jvm}/test/io/ktor/tests/server/features/HttpsRedirectFeatureTest.kt (100%) rename ktor-server/ktor-server-tests/{ => jvm}/test/io/ktor/tests/server/features/OriginConnectionPointTest.kt (100%) rename ktor-server/ktor-server-tests/{ => jvm}/test/io/ktor/tests/server/features/PartialContentTest.kt (99%) rename ktor-server/ktor-server-tests/{ => jvm}/test/io/ktor/tests/server/features/StaticContentTest.kt (84%) rename ktor-server/ktor-server-tests/{ => jvm}/test/io/ktor/tests/server/features/StatusPageTest.kt (100%) rename ktor-server/ktor-server-tests/{ => jvm}/test/io/ktor/tests/server/http/ApplicationRequestContentTest.kt (100%) rename ktor-server/ktor-server-tests/{ => jvm}/test/io/ktor/tests/server/http/DefaultPushTest.kt (100%) rename ktor-server/ktor-server-tests/{ => jvm}/test/io/ktor/tests/server/http/RespondFunctionsTest.kt (100%) rename ktor-server/ktor-server-tests/{ => jvm}/test/io/ktor/tests/server/http/RespondWriteTest.kt (100%) rename ktor-server/ktor-server-tests/{ => jvm}/test/io/ktor/tests/server/http/TestEngineMultipartTest.kt (100%) rename ktor-server/ktor-server-tests/{ => jvm}/test/io/ktor/tests/server/http/URLBuilderTest.kt (100%) rename ktor-server/ktor-server-tests/{ => jvm}/test/io/ktor/tests/server/http/UrlEncodedTest.kt (100%) rename ktor-server/ktor-server-tests/{ => jvm}/test/io/ktor/tests/server/routing/RoutingBuildTest.kt (100%) rename ktor-server/ktor-server-tests/{ => jvm}/test/io/ktor/tests/server/routing/RoutingProcessingTest.kt (100%) rename ktor-server/ktor-server-tests/{ => jvm}/test/io/ktor/tests/server/routing/RoutingResolveTest.kt (100%) rename ktor-server/ktor-server-tests/{ => jvm}/test/io/ktor/tests/server/sessions/AutoSerializerTest.kt (100%) rename ktor-server/ktor-server-tests/{ => jvm}/test/io/ktor/tests/server/sessions/SessionTest.kt (100%) rename ktor-server/ktor-server-tomcat/{ => jvm}/src/io/ktor/server/tomcat/Embedded.kt (100%) rename ktor-server/ktor-server-tomcat/{ => jvm}/src/io/ktor/server/tomcat/EngineMain.kt (100%) rename ktor-server/ktor-server-tomcat/{ => jvm}/src/io/ktor/server/tomcat/TomcatApplicationEngine.kt (100%) rename ktor-server/ktor-server-tomcat/{ => jvm}/test/io/ktor/tests/server/tomcat/TomcatEngineTest.kt (100%) rename ktor-utils/{ => common}/src/io/ktor/pipeline/Compatibility.kt (100%) rename ktor-utils/{ => common}/src/io/ktor/util/Annotations.kt (100%) rename ktor-utils/{ => common}/src/io/ktor/util/Attributes.kt (100%) rename ktor-utils/{ => common}/src/io/ktor/util/Base64.kt (93%) rename ktor-utils/{ => common}/src/io/ktor/util/ByteChannels.kt (100%) rename ktor-utils/{ => common}/src/io/ktor/util/CaseInsensitiveMap.kt (100%) rename ktor-utils/{ => common}/src/io/ktor/util/Charset.kt (100%) rename ktor-utils/{ => common}/src/io/ktor/util/Collections.kt (100%) rename ktor-utils/{ => common}/src/io/ktor/util/Crypto.kt (95%) rename ktor-utils/{ => common}/src/io/ktor/util/DelegatingMutableSet.kt (100%) rename ktor-utils/{ => common}/src/io/ktor/util/Hash.kt (100%) rename ktor-utils/{ => common}/src/io/ktor/util/Lock.kt (100%) rename ktor-utils/{ => common}/src/io/ktor/util/Ranges.kt (100%) rename ktor-utils/{ => common}/src/io/ktor/util/StackFrames.kt (100%) rename ktor-utils/{ => common}/src/io/ktor/util/StringValues.kt (100%) rename ktor-utils/{ => common}/src/io/ktor/util/Text.kt (100%) rename ktor-utils/{ => common}/src/io/ktor/util/date/Date.kt (100%) rename ktor-utils/{ => common}/src/io/ktor/util/pipeline/ContextDsl.kt (100%) rename ktor-utils/{ => common}/src/io/ktor/util/pipeline/Pipeline.kt (100%) rename ktor-utils/{ => common}/src/io/ktor/util/pipeline/PipelineContext.kt (100%) rename ktor-utils/{ => common}/src/io/ktor/util/pipeline/PipelinePhase.kt (100%) create mode 100644 ktor-utils/common/test/io/ktor/tests/utils/Base64.kt rename ktor-utils/{ => common}/test/io/ktor/tests/utils/CaseInsensitiveMapTest.kt (100%) rename ktor-utils/{ => common}/test/io/ktor/tests/utils/GMTDateTest.kt (100%) rename ktor-utils/{ => common}/test/io/ktor/tests/utils/PipelineContractsTest.kt (100%) rename ktor-utils/{ => common}/test/io/ktor/tests/utils/PipelinePhasesTest.kt (100%) rename ktor-utils/{ => common}/test/io/ktor/tests/utils/StringValuesTest.kt (100%) rename ktor-utils/{ktor-utils-js => js}/src/io/ktor/util/AttributesJs.kt (100%) rename ktor-utils/{ktor-utils-js => js}/src/io/ktor/util/CollectionsJs.kt (100%) rename ktor-utils/{ktor-utils-js => js}/src/io/ktor/util/CryptoJs.kt (100%) rename ktor-utils/{ktor-utils-js => js}/src/io/ktor/util/Lock.kt (100%) rename ktor-utils/{ktor-utils-js => js}/src/io/ktor/util/StackFramesJs.kt (100%) rename ktor-utils/{ktor-utils-js => js}/src/io/ktor/util/date/DateJs.kt (100%) rename ktor-utils/{ktor-utils-jvm => jvm}/src/io/ktor/util/AttributesJvm.kt (100%) rename ktor-utils/{ktor-utils-jvm => jvm}/src/io/ktor/util/BufferViewJvm.kt (100%) rename ktor-utils/{ktor-utils-jvm => jvm}/src/io/ktor/util/CollectionsJvm.kt (100%) rename ktor-utils/{ktor-utils-jvm => jvm}/src/io/ktor/util/CryptoJvm.kt (97%) rename ktor-utils/{ktor-utils-jvm => jvm}/src/io/ktor/util/DatesJvm.kt (100%) rename ktor-utils/{ktor-utils-jvm => jvm}/src/io/ktor/util/Deflater.kt (100%) rename ktor-utils/{ktor-utils-jvm => jvm}/src/io/ktor/util/InputJvm.kt (100%) rename ktor-utils/{ktor-utils-jvm => jvm}/src/io/ktor/util/LockJvm.kt (100%) rename ktor-utils/{ktor-utils-jvm => jvm}/src/io/ktor/util/Logging.kt (100%) rename ktor-utils/{ktor-utils-jvm => jvm}/src/io/ktor/util/NIO.kt (100%) rename ktor-utils/{ktor-utils-jvm => jvm}/src/io/ktor/util/Nonce.kt (100%) rename ktor-utils/{ktor-utils-jvm => jvm}/src/io/ktor/util/Path.kt (100%) rename ktor-utils/{ktor-utils-jvm => jvm}/src/io/ktor/util/Reflection.kt (100%) rename ktor-utils/{ktor-utils-jvm => jvm}/src/io/ktor/util/StackFramesJvm.kt (100%) rename ktor-utils/{ktor-utils-jvm => jvm}/src/io/ktor/util/cio/ByteBufferPool.kt (100%) rename ktor-utils/{ktor-utils-jvm => jvm}/src/io/ktor/util/cio/CIO.kt (100%) rename ktor-utils/{ktor-utils-jvm => jvm}/src/io/ktor/util/cio/Channels.kt (100%) rename ktor-utils/{ktor-utils-jvm => jvm}/src/io/ktor/util/cio/FileChannels.kt (100%) create mode 100644 ktor-utils/jvm/src/io/ktor/util/cio/InputStreamAdapters.kt rename ktor-utils/{ktor-utils-jvm => jvm}/src/io/ktor/util/cio/OutputStreamAdapters.kt (100%) rename ktor-utils/{ktor-utils-jvm => jvm}/src/io/ktor/util/cio/Readers.kt (100%) rename ktor-utils/{ktor-utils-jvm => jvm}/src/io/ktor/util/cio/Semaphore.kt (100%) rename ktor-utils/{ktor-utils-jvm => jvm}/src/io/ktor/util/date/DateJvm.kt (100%) rename ktor-utils/{ktor-utils-jvm => jvm}/src/io/ktor/util/date/DateUtils.kt (100%) rename ktor-utils/{ktor-utils-jvm => jvm}/src/io/ktor/util/internal/LockFreeLinkedList.kt (100%) rename ktor-utils/{ktor-utils-jvm => jvm}/test/io/ktor/tests/utils/DeflaterReadChannelTest.kt (87%) rename ktor-utils/{ktor-utils-jvm => jvm}/test/io/ktor/tests/utils/FileChannelTest.kt (100%) rename ktor-utils/{ktor-utils-jvm => jvm}/test/io/ktor/tests/utils/HexFunctionsTest.kt (100%) rename ktor-utils/{ktor-utils-jvm => jvm}/test/io/ktor/tests/utils/NonceSmokeTest.kt (100%) rename ktor-utils/{ktor-utils-jvm => jvm}/test/io/ktor/tests/utils/PipelineStackFramesTest.kt (100%) rename ktor-utils/{ktor-utils-jvm => jvm}/test/io/ktor/tests/utils/PipelineTest.kt (100%) rename ktor-utils/{ktor-utils-jvm => jvm}/test/io/ktor/tests/utils/ReflectionSupertypesTest.kt (100%) delete mode 100644 ktor-utils/ktor-utils-ios/build.gradle delete mode 100644 ktor-utils/ktor-utils-ios/src/io/ktor/util/CryptoIos.kt delete mode 100644 ktor-utils/ktor-utils-ios/src/io/ktor/util/LockIos.kt delete mode 100644 ktor-utils/ktor-utils-js/build.gradle delete mode 100644 ktor-utils/ktor-utils-jvm/build.gradle create mode 100644 ktor-utils/posix/interop/utils.def rename ktor-utils/{ktor-utils-ios => posix}/src/io/ktor/util/AttributesIos.kt (100%) rename ktor-utils/{ktor-utils-ios => posix}/src/io/ktor/util/CollectionsIos.kt (100%) create mode 100644 ktor-utils/posix/src/io/ktor/util/CryptoIos.kt create mode 100644 ktor-utils/posix/src/io/ktor/util/LockIos.kt rename ktor-utils/{ktor-utils-ios => posix}/src/io/ktor/util/StackFramesIos.kt (100%) rename ktor-utils/{ktor-utils-ios => posix}/src/io/ktor/util/date/DateIos.kt (94%) delete mode 100644 ktor-utils/test/io/ktor/tests/utils/Base64.kt diff --git a/.gitignore b/.gitignore index 46347ddc61..0aa06ef89c 100644 --- a/.gitignore +++ b/.gitignore @@ -23,3 +23,4 @@ bin/ .settings .project .classpath +.konan diff --git a/binary-compatibility-validator/build.gradle b/binary-compatibility-validator/build.gradle index 8dd92c6d14..be58409afc 100644 --- a/binary-compatibility-validator/build.gradle +++ b/binary-compatibility-validator/build.gradle @@ -2,40 +2,34 @@ * Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. */ -sourceSets { - main { - kotlin.srcDir 'jvm/src' - } - test { - kotlin.srcDir 'jvm/test' - } -} - -dependencies { +kotlin.sourceSets.jvmMain.dependencies { api "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" - implementation project(":ktor-utils:ktor-utils-jvm") + api project(":ktor-utils") api 'org.ow2.asm:asm-debug-all:5.0.4' api 'com.google.code.gson:gson:2.6.2' +} +kotlin.sourceSets.jvmTest.dependencies { api "org.jetbrains.kotlin:kotlin-test-junit:$kotlin_version" api "junit:junit:4.12" } apply from: rootProject.file('gradle/compatibility.gradle') -test { +def binaryCompatibilityModules = project.ext.buildList() as List +def artifactNames = binaryCompatibilityModules.collect { it.dependencyProject.name } +def modules = binaryCompatibilityModules.collect { it.dependencyProject.projectDir } -// dependsOn cleanCompileTestKotlin +jvmTest { dependsOn configurations.binaryCompatibility + systemProperty 'validator.input.modules', modules.join(File.pathSeparator) + systemProperty 'validator.input.artifactNames', artifactNames.join(File.pathSeparator) systemProperty 'overwrite.output', project.properties['overwrite.output'] jvmArgs '-ea' +} - doFirst { - def binaryCompatibilityModules = project.ext.buildList() as List - def modules = binaryCompatibilityModules.collect { it.dependencyProject.projectDir } - - tasks.findByName("test").systemProperty('validator.input.modules', modules.join(File.pathSeparator)) - } +binaryCompatibilityModules.each { + jvmTest.dependsOn(it.dependencyProject.getTasksByName("jvmJar", true)) } diff --git a/binary-compatibility-validator/jvm/src/kotlinVisibilities.kt b/binary-compatibility-validator/jvm/src/kotlinVisibilities.kt index a968948ccf..ec1b2ccb66 100644 --- a/binary-compatibility-validator/jvm/src/kotlinVisibilities.kt +++ b/binary-compatibility-validator/jvm/src/kotlinVisibilities.kt @@ -36,6 +36,7 @@ fun ClassVisibility.findSetterForProperty(property: MemberVisibility): MemberVis } fun readKotlinVisibilities(declarationFile: File): Map { + check(declarationFile.exists()) val result = mutableListOf() declarationFile.bufferedReader().use { reader -> val jsonReader = JsonReader(reader) diff --git a/binary-compatibility-validator/jvm/test/PublicApiTest.kt b/binary-compatibility-validator/jvm/test/PublicApiTest.kt index 9530247dbd..fa85f80c1f 100644 --- a/binary-compatibility-validator/jvm/test/PublicApiTest.kt +++ b/binary-compatibility-validator/jvm/test/PublicApiTest.kt @@ -17,14 +17,16 @@ class PublicApiTest( ) { companion object { private val modulesList = System.getProperty("validator.input.modules") + private val artifactNames = System.getProperty("validator.input.artifactNames") private val nonPublicPackages: List = emptyList() @Parameterized.Parameters(name = "{1}") @JvmStatic fun modules(): List> { - return modulesList.split(File.pathSeparator).map { path -> + val names = artifactNames.split(File.pathSeparator) + return modulesList.split(File.pathSeparator).mapIndexed { id, path -> val dir = File(path) - arrayOf(dir, dir.name) + arrayOf(dir, names[id]) } } } @@ -39,11 +41,11 @@ class PublicApiTest( .map { readKotlinVisibilities(it) } .reduce { m1, m2 -> m1 + m2 } val api = getBinaryAPI(JarFile(jarFile), visibilities).filterOutNonPublic(nonPublicPackages) - api.dumpAndCompareWith(File("reference-public-api").resolve("${moduleName.removeSuffix("-jvm")}.txt")) + api.dumpAndCompareWith(File("reference-public-api").resolve("$moduleName.txt")) } private fun getJarPath(libsDir: File): File { - val regex = Regex("$moduleName.+\\.jar") + val regex = Regex("$moduleName-jvm.+\\.jar") val files = (libsDir.listFiles() ?: throw Exception("Cannot list files in $libsDir")) .filter { it.name.let { diff --git a/binary-compatibility-validator/jvm/test/utils.kt b/binary-compatibility-validator/jvm/test/utils.kt index c7844108b1..353304458f 100644 --- a/binary-compatibility-validator/jvm/test/utils.kt +++ b/binary-compatibility-validator/jvm/test/utils.kt @@ -35,7 +35,7 @@ private fun assertEqualsToFile(to: File, actual: CharSequence) { assertEquals( expectedText, actualText, - "Actual data differs from file content: ${to.name}\nTo overwrite the expected API rerun with -Doverwrite.output=true parameter\n" + "Actual data differs from file content: ${to.name}\nTo overwrite the expected API rerun with -Poverwrite.output=true parameter\n" ) } diff --git a/binary-compatibility-validator/reference-public-api/ktor-client-core.txt b/binary-compatibility-validator/reference-public-api/ktor-client-core.txt index 2a7fdf854c..14f02b6b30 100644 --- a/binary-compatibility-validator/reference-public-api/ktor-client-core.txt +++ b/binary-compatibility-validator/reference-public-api/ktor-client-core.txt @@ -122,7 +122,9 @@ public final class io/ktor/client/call/UtilsJvmKt { public final class io/ktor/client/call/UtilsKt { public static final fun call (Lio/ktor/client/HttpClient;Lio/ktor/client/request/HttpRequestBuilder;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static final fun call (Lio/ktor/client/HttpClient;Lio/ktor/http/Url;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public static final fun call (Lio/ktor/client/HttpClient;Ljava/lang/String;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static synthetic fun call$default (Lio/ktor/client/HttpClient;Lio/ktor/http/Url;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; public static synthetic fun call$default (Lio/ktor/client/HttpClient;Ljava/lang/String;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; } @@ -392,6 +394,10 @@ public final class io/ktor/client/request/BuildersKt { public static final fun request (Lkotlin/jvm/functions/Function1;)Lio/ktor/client/request/HttpRequestBuilder; } +public final class io/ktor/client/request/BuildersWithUrlKt { + public static final fun url (Lio/ktor/client/request/HttpRequestBuilder;Lio/ktor/http/Url;)V +} + public abstract class io/ktor/client/request/ClientUpgradeContent : io/ktor/http/content/OutgoingContent$NoContent { public fun ()V public final fun getOutput ()Lkotlinx/coroutines/io/ByteWriteChannel; diff --git a/binary-compatibility-validator/reference-public-api/ktor-http-cio.txt b/binary-compatibility-validator/reference-public-api/ktor-http-cio.txt index aa0475cb2e..bbbfdaf613 100644 --- a/binary-compatibility-validator/reference-public-api/ktor-http-cio.txt +++ b/binary-compatibility-validator/reference-public-api/ktor-http-cio.txt @@ -79,8 +79,7 @@ public abstract class io/ktor/http/cio/HttpMessage : java/io/Closeable { } public final class io/ktor/http/cio/HttpParserKt { - public static final fun parseHeaders (Lkotlinx/coroutines/io/ByteReadChannel;Lio/ktor/http/cio/internals/CharBufferBuilder;Lio/ktor/http/cio/internals/MutableRange;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static synthetic fun parseHeaders$default (Lkotlinx/coroutines/io/ByteReadChannel;Lio/ktor/http/cio/internals/CharBufferBuilder;Lio/ktor/http/cio/internals/MutableRange;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; + public static final fun parseHeaders (Lkotlinx/coroutines/io/ByteReadChannel;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public static final fun parseRequest (Lkotlinx/coroutines/io/ByteReadChannel;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public static final fun parseResponse (Lkotlinx/coroutines/io/ByteReadChannel;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; } @@ -167,30 +166,6 @@ public final class io/ktor/http/cio/Response : io/ktor/http/cio/HttpMessage { public final fun getVersion ()Ljava/lang/CharSequence; } -public final class io/ktor/http/cio/internals/CharBufferBuilder : java/lang/Appendable, java/lang/CharSequence { - public fun ()V - public fun (Lkotlinx/io/pool/ObjectPool;)V - public synthetic fun (Lkotlinx/io/pool/ObjectPool;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public fun append (C)Ljava/lang/Appendable; - public fun append (Ljava/lang/CharSequence;)Ljava/lang/Appendable; - public fun append (Ljava/lang/CharSequence;II)Ljava/lang/Appendable; - public final fun charAt (I)C - public fun equals (Ljava/lang/Object;)Z - public fun get (I)C - public fun getLength ()I - public final fun getPool ()Lkotlinx/io/pool/ObjectPool; - public fun hashCode ()I - public final fun length ()I - public final fun release ()V - public fun subSequence (II)Ljava/lang/CharSequence; - public fun toString ()Ljava/lang/String; -} - -public final class io/ktor/http/cio/internals/CharBufferPoolKt { - public static final field CHAR_BUFFER_BYTES I - public static final field CHAR_BUFFER_LENGTH I -} - public final class io/ktor/http/cio/internals/HttpByteBufferPoolKt { public static final fun getDefaultByteBufferPool ()Lkotlinx/io/pool/ObjectPool; } diff --git a/binary-compatibility-validator/reference-public-api/ktor-http.txt b/binary-compatibility-validator/reference-public-api/ktor-http.txt index 05f1ffe24d..4a2baf1fab 100644 --- a/binary-compatibility-validator/reference-public-api/ktor-http.txt +++ b/binary-compatibility-validator/reference-public-api/ktor-http.txt @@ -966,6 +966,84 @@ public final class io/ktor/http/Url { public final class io/ktor/http/Url$Companion { } +public final class io/ktor/http/auth/AuthScheme { + public static final field Basic Ljava/lang/String; + public static final field Digest Ljava/lang/String; + public static final field INSTANCE Lio/ktor/http/auth/AuthScheme; + public static final field Negotiate Ljava/lang/String; + public static final field OAuth Ljava/lang/String; + public final synthetic fun getBasic ()Ljava/lang/String; + public final synthetic fun getDigest ()Ljava/lang/String; + public final synthetic fun getNegotiate ()Ljava/lang/String; +} + +public final class io/ktor/http/auth/HeaderValueEncoding : java/lang/Enum { + public static final field QUOTED_ALWAYS Lio/ktor/http/auth/HeaderValueEncoding; + public static final field QUOTED_WHEN_REQUIRED Lio/ktor/http/auth/HeaderValueEncoding; + public static final field URI_ENCODE Lio/ktor/http/auth/HeaderValueEncoding; + public static fun valueOf (Ljava/lang/String;)Lio/ktor/http/auth/HeaderValueEncoding; + public static fun values ()[Lio/ktor/http/auth/HeaderValueEncoding; +} + +public abstract class io/ktor/http/auth/HttpAuthHeader { + public static final field Companion Lio/ktor/http/auth/HttpAuthHeader$Companion; + public final fun getAuthScheme ()Ljava/lang/String; + public abstract fun render ()Ljava/lang/String; + public abstract fun render (Lio/ktor/http/auth/HeaderValueEncoding;)Ljava/lang/String; + public fun toString ()Ljava/lang/String; +} + +public final class io/ktor/http/auth/HttpAuthHeader$Companion { + public final fun basicAuthChallenge (Ljava/lang/String;Ljava/nio/charset/Charset;)Lio/ktor/http/auth/HttpAuthHeader$Parameterized; + public final fun digestAuthChallenge (Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Ljava/lang/String;Ljava/lang/Boolean;Ljava/lang/String;)Lio/ktor/http/auth/HttpAuthHeader$Parameterized; + public static synthetic fun digestAuthChallenge$default (Lio/ktor/http/auth/HttpAuthHeader$Companion;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Ljava/lang/String;Ljava/lang/Boolean;Ljava/lang/String;ILjava/lang/Object;)Lio/ktor/http/auth/HttpAuthHeader$Parameterized; +} + +public final class io/ktor/http/auth/HttpAuthHeader$Parameterized : io/ktor/http/auth/HttpAuthHeader { + public fun (Ljava/lang/String;Ljava/util/List;Lio/ktor/http/auth/HeaderValueEncoding;)V + public synthetic fun (Ljava/lang/String;Ljava/util/List;Lio/ktor/http/auth/HeaderValueEncoding;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun (Ljava/lang/String;Ljava/util/Map;Lio/ktor/http/auth/HeaderValueEncoding;)V + public synthetic fun (Ljava/lang/String;Ljava/util/Map;Lio/ktor/http/auth/HeaderValueEncoding;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun equals (Ljava/lang/Object;)Z + public final fun getEncoding ()Lio/ktor/http/auth/HeaderValueEncoding; + public final fun getParameters ()Ljava/util/List; + public fun hashCode ()I + public final fun parameter (Ljava/lang/String;)Ljava/lang/String; + public fun render ()Ljava/lang/String; + public fun render (Lio/ktor/http/auth/HeaderValueEncoding;)Ljava/lang/String; + public final fun withParameter (Ljava/lang/String;Ljava/lang/String;)Lio/ktor/http/auth/HttpAuthHeader$Parameterized; +} + +public final class io/ktor/http/auth/HttpAuthHeader$Parameters { + public static final field Charset Ljava/lang/String; + public static final field INSTANCE Lio/ktor/http/auth/HttpAuthHeader$Parameters; + public static final field OAuthCallback Ljava/lang/String; + public static final field OAuthCallbackConfirmed Ljava/lang/String; + public static final field OAuthConsumerKey Ljava/lang/String; + public static final field OAuthNonce Ljava/lang/String; + public static final field OAuthSignature Ljava/lang/String; + public static final field OAuthSignatureMethod Ljava/lang/String; + public static final field OAuthTimestamp Ljava/lang/String; + public static final field OAuthToken Ljava/lang/String; + public static final field OAuthTokenSecret Ljava/lang/String; + public static final field OAuthVerifier Ljava/lang/String; + public static final field OAuthVersion Ljava/lang/String; + public static final field Realm Ljava/lang/String; +} + +public final class io/ktor/http/auth/HttpAuthHeader$Single : io/ktor/http/auth/HttpAuthHeader { + public fun (Ljava/lang/String;Ljava/lang/String;)V + public fun equals (Ljava/lang/Object;)Z + public final fun getBlob ()Ljava/lang/String; + public fun hashCode ()I + public fun render ()Ljava/lang/String; + public fun render (Lio/ktor/http/auth/HeaderValueEncoding;)Ljava/lang/String; +} + +public final class io/ktor/http/auth/HttpAuthHeaderKt { + public static final fun parseAuthorizationHeader (Ljava/lang/String;)Lio/ktor/http/auth/HttpAuthHeader; +} + public final class io/ktor/http/content/ByteArrayContent : io/ktor/http/content/OutgoingContent$ByteArrayContent { public fun ([BLio/ktor/http/ContentType;Lio/ktor/http/HttpStatusCode;)V public synthetic fun ([BLio/ktor/http/ContentType;Lio/ktor/http/HttpStatusCode;ILkotlin/jvm/internal/DefaultConstructorMarker;)V diff --git a/binary-compatibility-validator/reference-public-api/ktor-utils.txt b/binary-compatibility-validator/reference-public-api/ktor-utils.txt index 8494b4e5a3..65d358b6f4 100644 --- a/binary-compatibility-validator/reference-public-api/ktor-utils.txt +++ b/binary-compatibility-validator/reference-public-api/ktor-utils.txt @@ -87,6 +87,10 @@ public final class io/ktor/util/CollectionsKt { } public final class io/ktor/util/CryptoKt { + public static final fun Digest (Ljava/lang/String;)Lio/ktor/util/Digest; + public static final fun build (Lio/ktor/util/Digest;Ljava/lang/String;Ljava/nio/charset/Charset;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static final fun build (Lio/ktor/util/Digest;[BLkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static synthetic fun build$default (Lio/ktor/util/Digest;Ljava/lang/String;Ljava/nio/charset/Charset;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; public static final fun decodeBase64 (Ljava/lang/String;)[B public static final fun encodeBase64 ([B)Ljava/lang/String; public static final fun generateNonce ()Ljava/lang/String; @@ -112,6 +116,17 @@ public final class io/ktor/util/DeflaterKt { public static synthetic fun deflated$default (Lkotlinx/coroutines/io/ByteWriteChannel;ZLkotlinx/io/pool/ObjectPool;Lkotlin/coroutines/CoroutineContext;ILjava/lang/Object;)Lkotlinx/coroutines/io/ByteWriteChannel; } +public abstract interface class io/ktor/util/Digest { + public abstract fun build (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public abstract fun plusAssign ([B)V + public abstract fun reset ()V +} + +public final class io/ktor/util/Hash { + public static final field INSTANCE Lio/ktor/util/Hash; + public final fun combine ([Ljava/lang/Object;)I +} + public final class io/ktor/util/InputJvmKt { public static final fun asStream (Lkotlinx/io/core/Input;)Ljava/io/InputStream; } @@ -314,6 +329,11 @@ public final class io/ktor/util/cio/FileChannelsKt { public static synthetic fun writeChannel$default (Ljava/io/File;Lkotlinx/io/pool/ObjectPool;ILjava/lang/Object;)Lkotlinx/coroutines/io/ByteWriteChannel; } +public final class io/ktor/util/cio/InputStreamAdaptersKt { + public static final fun toByteReadChannel (Ljava/io/InputStream;Lkotlinx/io/pool/ObjectPool;Lkotlin/coroutines/CoroutineContext;Lkotlinx/coroutines/Job;)Lkotlinx/coroutines/io/ByteReadChannel; + public static synthetic fun toByteReadChannel$default (Ljava/io/InputStream;Lkotlinx/io/pool/ObjectPool;Lkotlin/coroutines/CoroutineContext;Lkotlinx/coroutines/Job;ILjava/lang/Object;)Lkotlinx/coroutines/io/ByteReadChannel; +} + public final class io/ktor/util/cio/NoopContinuation : kotlin/coroutines/Continuation { public static final field INSTANCE Lio/ktor/util/cio/NoopContinuation; public fun getContext ()Lkotlin/coroutines/CoroutineContext; diff --git a/build.gradle b/build.gradle index 6d54045215..bb62448747 100644 --- a/build.gradle +++ b/build.gradle @@ -1,14 +1,11 @@ -buildscript { - ext.kotlin_repository = { - if (kotlin_version.endsWith('-SNAPSHOT')) return 'https://oss.sonatype.org/content/repositories/snapshots' - return 'http://dl.bintray.com/kotlin/kotlin-eap' - }() +import org.jetbrains.kotlin.konan.target.HostManager +buildscript { repositories { + mavenLocal() jcenter() - maven { url 'https://plugins.gradle.org/m2/' } - maven { url kotlin_repository } - maven { url 'https://dl.bintray.com/jetbrains/kotlin-native-dependencies' } + maven { url "https://plugins.gradle.org/m2/" } + maven { url "https://dl.bintray.com/jetbrains/kotlin-native-dependencies" } maven { url "https://dl.bintray.com/kotlin/kotlin-dev" } } @@ -16,81 +13,91 @@ buildscript { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "org.jetbrains.kotlin:kotlin-allopen:$kotlin_version" classpath "com.jfrog.bintray.gradle:gradle-bintray-plugin:$bintray_plugin_version" - classpath 'net.researchgate:gradle-release:2.4.0' classpath "org.jetbrains.dokka:dokka-gradle-plugin:$dokka_version" - classpath "org.jetbrains.kotlin:kotlin-native-gradle-plugin:$kotlin_native_version" classpath "org.jetbrains.kotlinx:atomicfu-gradle-plugin:$atomic_fu_version" classpath "com.moowork.gradle:gradle-node-plugin:$gradle_node_version" classpath "org.jetbrains.kotlin:kotlin-serialization:$kotlin_version" + classpath 'de.undercouch:gradle-download-task:3.4.3' } } -apply plugin: 'net.researchgate.release' +ext.configuredVersion = project.hasProperty("releaseVersion") ? project.releaseVersion : project.version +ext.globalM2 = "$buildDir/m2" +ext.publishLocal = project.hasProperty("publishLocal") -ext.configuredVersion = project.hasProperty('releaseVersion') ? project.releaseVersion : project.version -ext.dokkaExcludes = [ - 'ktor-server', - 'ktor-samples', - 'ktor-features', - 'ktor-client' -] +apply from: "gradle/experimental.gradle" -ext.globalM2 = "$buildDir/m2" -ext.publishLocal = project.hasProperty('publishLocal') +/** + * `darwin` is subset of `posix`. + * Don't create `posix` and `darwin` sourceSets in single project. + */ +def platforms = ["common", "jvm", "js", "posix", "darwin"] +rootProject.ext.misc = ["binary-compatibility-validator", "ktor-server-benchmarks"] -apply from: 'gradle/platform.gradle' -apply from: 'gradle/experimental.gradle' +def projectNeedsPlatform(project, platform) { + if (rootProject.ext.misc.contains(project.name)) return platform == "jvm" -allprojects { - def platform = platformOf(project) + def files = project.projectDir.listFiles() + def hasPosix = files.any { it.name == "posix" } + def hasDarwin = files.any { it.name == "darwin" } - group = 'io.ktor' + if (hasPosix && hasDarwin) return false + if (!hasDarwin && platform == "darwin") return false + + return files.any { it.name == "common" || it.name == platform } +} + +allprojects { + group = "io.ktor" version = configuredVersion + project.ext.hostManager = new HostManager() repositories { mavenLocal() - maven { url 'https://dl.bintray.com/kotlin/kotlinx/' } - maven { url kotlin_repository } + maven { url "https://dl.bintray.com/kotlin/kotlinx/" } + maven { url "https://dl.bintray.com/kotlin/kotlin-eap" } maven { url "https://dl.bintray.com/kotlin/kotlin-dev" } - jcenter() - } - apply plugin: "kotlin-platform-${platform}" - apply from: rootProject.file("gradle/atomicfu-${platform}.gradle") - apply from: rootProject.file("gradle/${platform}.gradle") - - if (project.name != 'binary-compatibility-validator') { - apply from: rootProject.file('gradle/publish.gradle') + jcenter() } - if (project.parent != null && project.parent.name == 'ktor-server') { - apply from: rootProject.file('gradle/engines.gradle') - } + apply plugin: "kotlin-multiplatform" + apply plugin: "kotlinx-atomicfu" - task sourceJar(type: Jar, dependsOn: classes) { - classifier 'sources' - if (platform != 'native') { - from sourceSets.main.kotlin - duplicatesStrategy DuplicatesStrategy.EXCLUDE - def platformSrc = sourceSets.main.allSource - def commonSrc = rootProject.sourceSets.main.allSource - from(platformSrc + commonSrc) + platforms.each { platform -> + if (projectNeedsPlatform(project, platform)) { + configure([it]) { + apply from: rootProject.file("gradle/utility.gradle") + apply from: rootProject.file("gradle/${platform}.gradle") + } } } - task emptyJar(type: Jar) { - classifier 'javadoc' + if (!rootProject.ext.misc.contains(project.name)) { + apply from: rootProject.file('gradle/dokka.gradle') + apply from: rootProject.file('gradle/publish.gradle') } - tasks.build.dependsOn(['sourceJar', 'emptyJar']) + configurations { testOutput } -} + kotlin { + configure(sourceSets) { + def srcDir = name.endsWith("Main") ? "src" : "test" + def resourcesPrefix = name.endsWith("Test") ? "test-" : "" + def platform = name[0..-5] + + kotlin.srcDirs = ["$platform/$srcDir"] + resources.srcDirs = ["$platform/${resourcesPrefix}resources"] + + if (rootProject.ext.misc.contains(project.name)) return + languageSettings { + progressiveMode = true + experimentalAnnotations.each { useExperimentalAnnotation(it) } -release { - scmAdapters = [net.researchgate.release.GitAdapter] - git { - requireBranch = 'gradle-build' + if (project.path.startsWith(":ktor-server:ktor-server") && project.name != "ktor-server-core") { + useExperimentalAnnotation("io.ktor.server.engine.EngineAPI") + } + } + } } } - -afterReleaseBuild.dependsOn bintrayUpload diff --git a/gradle.properties b/gradle.properties index 2da86a2aa7..266c58bc35 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,11 +3,15 @@ kotlin.code.style=official # config version=1.0.2-SNAPSHOT +kotlin.incremental.js=true kotlin.incremental.multiplatform=true +# gradle +org.gradle.daemon=true +org.gradle.jvmargs=-Xmx2g -XX:MaxPermSize=2048m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 + # kotlin kotlin_version=1.3.11 -kotlin_native_version=1.3.11 # kotlin libraries kotlinx_io_version=0.1.2-dev-9 @@ -19,16 +23,15 @@ atomic_fu_version=0.11.12 netty_version=4.1.24.Final netty_tcnative_version=2.0.8.Final jetty_version=9.4.11.v20180605 -jetty_alpn_boot_version=8.1.12.v20180117 jetty_alpn_api_version=1.1.3.v20160715 # utility logback_version=1.2.3 junit_version=4.12 -dokka_version=0.9.16 +dokka_version=0.9.17 jmh_version=1.20 gradle_node_version=1.2.0 -nodejs_version=8.9.3 +nodejs_version=10.14.1 npm_version=6.4.1 # publishing diff --git a/gradle/atomicfu-common.gradle b/gradle/atomicfu-common.gradle deleted file mode 100644 index 0cab338f12..0000000000 --- a/gradle/atomicfu-common.gradle +++ /dev/null @@ -1,4 +0,0 @@ - -dependencies { - compile "org.jetbrains.kotlinx:atomicfu-common:$atomic_fu_version" -} diff --git a/gradle/atomicfu-js.gradle b/gradle/atomicfu-js.gradle deleted file mode 100644 index 8625700d90..0000000000 --- a/gradle/atomicfu-js.gradle +++ /dev/null @@ -1,3 +0,0 @@ -dependencies { - compile "org.jetbrains.kotlinx:atomicfu-js:$atomic_fu_version" -} diff --git a/gradle/atomicfu-jvm.gradle b/gradle/atomicfu-jvm.gradle deleted file mode 100644 index 2ed17a2bc1..0000000000 --- a/gradle/atomicfu-jvm.gradle +++ /dev/null @@ -1,7 +0,0 @@ - -apply plugin: 'kotlinx-atomicfu' - -dependencies { - compileOnly "org.jetbrains.kotlinx:atomicfu:$atomic_fu_version" - testCompile "org.jetbrains.kotlinx:atomicfu:$atomic_fu_version" -} diff --git a/gradle/atomicfu-native.gradle b/gradle/atomicfu-native.gradle deleted file mode 100644 index f9e323d11f..0000000000 --- a/gradle/atomicfu-native.gradle +++ /dev/null @@ -1,5 +0,0 @@ - - -dependencies { - implementation "org.jetbrains.kotlinx:atomicfu-native:$atomic_fu_version" -} diff --git a/gradle/bintray.gradle b/gradle/bintray.gradle deleted file mode 100644 index 48b1dee861..0000000000 --- a/gradle/bintray.gradle +++ /dev/null @@ -1,28 +0,0 @@ -apply plugin: 'com.jfrog.bintray' - -bintray { - user = project.hasProperty('bintrayUser') ? project.property('bintrayUser') : System.getenv('BINTRAY_USER') - key = project.hasProperty('bintrayApiKey') ? project.property('bintrayApiKey') : System.getenv('BINTRAY_API_KEY') - publish = false - override = true - - pkg { - userOrg = 'kotlin' - repo = 'ktor' - name = 'ktor' - - publications = ['mavenProject'] - licenses = ['Apache-2.0'] - vcsUrl = 'https://github.com/ktorio/ktor' - - version { - name = project.version - released = new Date() - vcsTag = project.version - } - } -} - -bintrayUpload.doFirst { - publications = project.publishing.publications -} diff --git a/gradle/common.gradle b/gradle/common.gradle index e972e7dc5d..7ac0d62077 100644 --- a/gradle/common.gradle +++ b/gradle/common.gradle @@ -1,36 +1,17 @@ - -sourceSets { - main { - kotlin.srcDir 'src' - resources.srcDir 'resources' +kotlin.sourceSets { + commonMain.dependencies { + api 'org.jetbrains.kotlin:kotlin-stdlib-common' + api group: 'org.jetbrains.kotlin', name: 'kotlin-stdlib-common', version: kotlin_version + api group: 'org.jetbrains.kotlinx', name: 'kotlinx-coroutines-core-common', version: coroutines_version + api group: 'org.jetbrains.kotlinx', name: 'kotlinx-io', version: kotlinx_io_version + api group: 'org.jetbrains.kotlinx', name: 'atomicfu', version: atomic_fu_version + + api group: 'org.jetbrains.kotlinx', name: 'kotlinx-coroutines-io', version: kotlinx_io_version } - test { - kotlin.srcDir 'test' - resources.srcDir 'test-resources' + commonTest.dependencies { + api "org.jetbrains.kotlin:kotlin-test-common:$kotlin_version" + api "org.jetbrains.kotlin:kotlin-test-annotations-common:$kotlin_version" } } - -compileKotlinCommon { - kotlinOptions.freeCompilerArgs += [ experimentalAnnotations ] -} - -compileTestKotlinCommon { - kotlinOptions.freeCompilerArgs += [ experimentalAnnotations ] -} - -dependencies { - compile group: 'org.jetbrains.kotlin', name: 'kotlin-stdlib-common', version: kotlin_version - compile group: 'org.jetbrains.kotlinx', name: 'kotlinx-coroutines-core-common', version: coroutines_version - - compile(group: 'org.jetbrains.kotlinx', name: 'kotlinx-io', version: kotlinx_io_version) { - exclude(module: 'kotlin-stdlib-common') - } - - compile(group: 'org.jetbrains.kotlinx', name: 'kotlinx-coroutines-io', version: kotlinx_io_version) { - exclude(module: 'kotlin-stdlib-common') - } - - testCompile "org.jetbrains.kotlin:kotlin-test-annotations-common:$kotlin_version" - testCompile "org.jetbrains.kotlin:kotlin-test-common:$kotlin_version" -} +project.ext.set("commonStructure", true) diff --git a/gradle/compatibility.gradle b/gradle/compatibility.gradle index 6a148d210e..a5c574e5e6 100644 --- a/gradle/compatibility.gradle +++ b/gradle/compatibility.gradle @@ -1,13 +1,25 @@ -apply from: rootProject.file('gradle/platform.gradle') - configurations { binaryCompatibility } dependencies { - def excludeList = ['ktor-client-tests', 'ktor-client-features', 'ktor-client-js', 'ktor-client-json-tests'].toSet() + def excludeList = [ + 'ktor-client-tests', + 'ktor-client-js', + 'ktor-client-json-tests', + 'ktor-client-curl', + 'ktor-client-ios', + 'ktor-client', + 'ktor-client-features' + ].toSet() + def projects = [].toSet() - def queue = [project(':ktor-client')] + def queue = [ + project(":ktor-client"), + project(":ktor-http"), + project(":ktor-network"), + project(":ktor-utils") + ] while (!queue.isEmpty()) { def project = queue.remove(queue.size() - 1) as Project @@ -16,37 +28,19 @@ dependencies { } } - binaryCompatibility projects.findAll { - !excludeList.contains(it.name) && - platformOf(it) == 'jvm' - } + binaryCompatibility projects.findAll { !excludeList.contains(it.name) } } def buildList = { - def workQueue = [] - def allModules = new HashSet() - - workQueue += configurations.binaryCompatibility.allDependencies.findAll { it instanceof ProjectDependency } - - while (!workQueue.isEmpty()) { - def p = workQueue.remove(workQueue.size() - 1) - if (p instanceof ProjectDependency && allModules.add(p)) { - p.dependencyProject.configurations.forEach { configuration -> - if (!configuration.name.toLowerCase().contains('test') && configuration.name.toLowerCase().contains("jvm")) { - workQueue += configuration.allDependencies.findAll { it instanceof ProjectDependency } - } else if (configuration.name == 'compile') { - def task = p.dependencyProject.tasks.findByName('compileKotlin') - if (task != null) { - workQueue += configuration.allDependencies.findAll { it instanceof ProjectDependency } - } - } - } - } + def allModules = configurations.binaryCompatibility.allDependencies.findAll { it instanceof ProjectDependency } + + return allModules + .sort { it.name } + .findAll { + def isCommon = it.dependencyProject.file("common").exists() + def isJvm = it.dependencyProject.file("jvm").exists() + isCommon || isJvm ? it.dependencyProject : null } - - return allModules.toList().sort { it.name }.findAll { platformOf(it.dependencyProject) == 'jvm' } } project.ext.buildList = buildList - -// println "List of modules: \n" + modulesForBinaryCompatibility.collect { it.name }.sort().join('\n') diff --git a/gradle/darwin.gradle b/gradle/darwin.gradle new file mode 100644 index 0000000000..c629878bff --- /dev/null +++ b/gradle/darwin.gradle @@ -0,0 +1,38 @@ +apply from: rootProject.file("gradle/ide.gradle") + +kotlin { + targets { + if (project.ext.ideaActive) { + fromPreset(project.ext.ideaPreset, 'darwin') + } else { + fromPreset(presets.iosArm64, 'iosArm64') + fromPreset(presets.iosX64, 'iosX64') + fromPreset(presets.macosX64, 'macosX64') + } + /* fromPreset(presets.iosArm32, 'iosArm32') */ + } + sourceSets { + darwinMain.dependencies { + implementation group: 'org.jetbrains.kotlinx', name: 'kotlinx-coroutines-core-native', version: coroutines_version + implementation group: 'org.jetbrains.kotlinx', name: 'kotlinx-io-native', version: kotlinx_io_version + implementation group: 'org.jetbrains.kotlinx', name: 'kotlinx-coroutines-io-native', version: kotlinx_io_version + + implementation "org.jetbrains.kotlinx:atomicfu:$atomic_fu_version" + } + + darwinMain { dependsOn commonMain } + darwinTest { dependsOn darwinMain } + + if (!project.ext.ideaActive) { + configure([/*iosArm32Main, */ iosArm64Main, iosX64Main, macosX64Main]) { + dependsOn darwinMain + } + + configure([/*iosArm32Test, */ iosArm64Test, iosX64Test, macosX64Test]) { + dependsOn darwinTest + } + } + } +} + +project.ext.set("hasNative", true) diff --git a/gradle/dokka.gradle b/gradle/dokka.gradle index a44e87c36a..3047e0ffba 100644 --- a/gradle/dokka.gradle +++ b/gradle/dokka.gradle @@ -1,21 +1,37 @@ - apply plugin: 'org.jetbrains.dokka' dokka { outputFormat = 'html' outputDirectory = "$buildDir/kdoc" + + kotlinTasks { + defaultKotlinTasks().findAll { it.name.contains("Jvm") } + } + + reportUndocumented = false } task dokkaJavadoc(type: dokka.getClass()) { outputFormat = 'javadoc' outputDirectory = "$buildDir/javadoc" + + kotlinTasks { + defaultKotlinTasks().findAll { it.name.contains("Jvm") } + } + + reportUndocumented = false } task dokkaWebsite(type: dokka.getClass()) { outputFormat = 'kotlin-website' outputDirectory = "${rootProject.projectDir}/apidoc" -} + kotlinTasks { + defaultKotlinTasks().findAll { it.name.contains("Jvm") } + } + + reportUndocumented = false +} task javadocJar(type: Jar, dependsOn: 'dokkaJavadoc') { classifier = 'javadoc' @@ -26,6 +42,3 @@ task dokkaJar(type: Jar, dependsOn: 'dokka') { classifier = 'kdoc' from fileTree(new File(project.buildDir, 'kdoc')) } - -artifacts.archives javadocJar -artifacts.archives dokkaJar diff --git a/gradle/engines.gradle b/gradle/engines.gradle deleted file mode 100644 index dc1299f380..0000000000 --- a/gradle/engines.gradle +++ /dev/null @@ -1,7 +0,0 @@ - -if (project.name != 'ktor-server-core') { - compileKotlin { - kotlinOptions.freeCompilerArgs += ['-Xuse-experimental=kotlin.Experimental,io.ktor.server.engine.EngineAPI'] - } -} - diff --git a/gradle/experimental.gradle b/gradle/experimental.gradle index c9926e6a16..da15cc5d3a 100644 --- a/gradle/experimental.gradle +++ b/gradle/experimental.gradle @@ -1,6 +1,8 @@ -ext.experimentalAnnotations = "-Xuse-experimental=" + - "kotlin.Experimental," + - "io.ktor.util.KtorExperimentalAPI," + - "io.ktor.util.InternalAPI," + - "kotlinx.coroutines.ExperimentalCoroutinesApi," + +ext.experimentalAnnotations = [ + "kotlin.Experimental", + "kotlin.ExperimentalUnsignedTypes", + "io.ktor.util.KtorExperimentalAPI", + "io.ktor.util.InternalAPI", + "kotlinx.coroutines.ExperimentalCoroutinesApi", "kotlinx.io.core.ExperimentalIoApi" +] diff --git a/gradle/ide.gradle b/gradle/ide.gradle new file mode 100644 index 0000000000..85a3aa22f6 --- /dev/null +++ b/gradle/ide.gradle @@ -0,0 +1,17 @@ +task prepareIdeInterop(type: Copy) { + if (project.ext.isLinuxHost) { + from "build/classes/kotlin/linuxX64" + } + if (project.ext.isMacosHost) { + from "build/classes/kotlin/macosX64" + } + if (project.ext.isWinHost) { + from "build/classes/kotlin/mingwX64" + } + + into "build/classes/kotlin/posix" +} + +configure([assemble]) { + doLast { prepareIdeInterop.execute() } +} diff --git a/gradle/js.gradle b/gradle/js.gradle index ecfc82cf70..4f2c9ba5db 100644 --- a/gradle/js.gradle +++ b/gradle/js.gradle @@ -1,87 +1,67 @@ -apply plugin: 'com.moowork.node' +apply from: rootProject.file('gradle/nodejs.gradle') -node { -// version = "$nodejs_version" -// npmVersion = "$npm_version" - download = false - nodeModulesDir = file(buildDir) -} - -dependencies { - compile "org.jetbrains.kotlin:kotlin-stdlib-js:$kotlin_version" - compile "org.jetbrains.kotlin:kotlin-test-js:$kotlin_version" - - compile group: 'org.jetbrains.kotlinx', name: 'kotlinx-coroutines-core-js', version: coroutines_version - compile group: 'org.jetbrains.kotlinx', name: 'kotlinx-io-js', version: kotlinx_io_version - compile group: 'org.jetbrains.kotlinx', name: 'kotlinx-coroutines-io-js', version: kotlinx_io_version -} - -afterEvaluate { - task assembleWeb(type: Sync) { - (configurations.compile).each { File file -> - from(zipTree(file.absolutePath), { - includeEmptyDirs = false - include { fileTreeElement -> - def path = fileTreeElement.path - (path.endsWith(".js") || path.endsWith(".js.map")) && (path.startsWith("META-INF/resources/") || - !path.startsWith("META-INF/")) - } - }) - } - from compileKotlin2Js.destinationDir - into "${projectDir}/build/web" - - dependsOn classes +kotlin { + targets { + fromPreset(presets.js, 'js') } - assemble.dependsOn assembleWeb -} + sourceSets { + jsMain.dependencies { + api "org.jetbrains.kotlin:kotlin-stdlib-js:$kotlin_version" -sourceSets { - main { - kotlin.srcDir 'src' - resources.srcDir 'resources' - } - test { - kotlin.srcDir 'test' - resources.srcDir 'test-resources' + api group: 'org.jetbrains.kotlinx', name: 'kotlinx-coroutines-core-js', version: coroutines_version + api group: 'org.jetbrains.kotlinx', name: 'kotlinx-io-js', version: kotlinx_io_version + api group: 'org.jetbrains.kotlinx', name: 'kotlinx-coroutines-io-js', version: kotlinx_io_version + api group: 'org.jetbrains.kotlinx', name: 'atomicfu-js', version: atomic_fu_version + } + jsTest.dependencies { + api "org.jetbrains.kotlin:kotlin-test-js:$kotlin_version" + } } } -compileKotlin2Js { +compileKotlinJs { kotlinOptions.metaInfo = true kotlinOptions.sourceMap = true kotlinOptions.moduleKind = 'umd' - kotlinOptions.main = "noCall" + kotlinOptions.main = 'noCall' kotlinOptions.sourceMapEmbedSources = 'always' - kotlinOptions.freeCompilerArgs += ['-Xuse-experimental=kotlin.Experimental,io.ktor.util.KtorExperimentalAPI,io.ktor.util.InternalAPI'] } -compileTestKotlin2Js { +compileTestKotlinJs { kotlinOptions.metaInfo = true kotlinOptions.sourceMap = true kotlinOptions.moduleKind = 'umd' - kotlinOptions.main = "call" + kotlinOptions.main = 'call' kotlinOptions.sourceMapEmbedSources = 'always' - kotlinOptions.freeCompilerArgs += ['-Xuse-experimental=kotlin.Experimental,io.ktor.util.KtorExperimentalAPI,io.ktor.util.InternalAPI'] } -task installDependenciesMochaChrome(type: NpmTask, dependsOn: [npmInstall]) { - args = ['install', - "mocha@$mocha_version", - "mocha-headless-chrome@$mocha_headless_chrome_version", - "mocha-teamcity-reporter@$mocha_teamcity_reporter_version", - '--no-save' - ] +task assembleWeb(type: Sync, group: 'build', dependsOn: compileTestKotlinJs) { + from compileKotlinJs.destinationDir + into "$node.nodeModulesDir/node_modules" + + def configuration = configurations.jsTestRuntimeClasspath + from(files { + configuration.collect { File file -> + file.name.endsWith(".jar") ? + zipTree(file.absolutePath).matching { + include '*.js' + include '*.js.map' + } : + files() + } + }.builtBy(configuration)) } def mochaChromeTestPage = file("$buildDir/test-page.html") -task prepareMochaChrome(dependsOn: [compileTestKotlin2Js, installDependenciesMochaChrome]) { +task prepareMocha(dependsOn: installDependenciesMocha) { outputs.file(mochaChromeTestPage) } -prepareMochaChrome.doLast { +prepareMocha.doLast { + def libraryPath = "$buildDir/node_modules" + def reporter = (project.hasProperty("teamcity")) ? "mocha.setup({reporter: 'teamcity'});" : "" mochaChromeTestPage.text = """ @@ -96,36 +76,44 @@ prepareMochaChrome.doLast { - - - - - - - - - - - - - - + + + + + + + + + + + + + + + """ } -task testMochaChrome(type: NodeTask, dependsOn: prepareMochaChrome) { +task testMochaChrome(type: NodeTask, dependsOn: prepareMocha) { script = file("$node.nodeModulesDir/node_modules/mocha-headless-chrome/bin/start") - args = [compileTestKotlin2Js.outputFile, '--file', mochaChromeTestPage, '-a', 'no-sandbox', '-a', 'disable-setuid-sandbox'] - args += ['--reporter', 'mocha-teamcity-reporter'] - if (project.hasProperty("mochaTests")) args += ['--grep', "$mochaTests"] + description = "Run js tests in mocha-headless-chrome" + args = [compileTestKotlinJs.outputFile, '--file', mochaChromeTestPage] + if (project.hasProperty("teamcity")) args += ['--reporter', 'mocha-teamcity-reporter', '--no-sandbox'] +} + +task testMochaNode(type: NodeTask, dependsOn: prepareMocha) { + script = file("$node.nodeModulesDir/node_modules/mocha/bin/mocha") + description = "Run js tests in mocha-nodejs" + args = [compileTestKotlinJs.outputFile, '--require', 'source-map-support/register'] + if (project.hasProperty("teamcity")) args += ['--reporter', 'mocha-teamcity-reporter', '--no-sandbox'] } -if (project.hasProperty("enable-js-tests")) { - test.dependsOn testMochaChrome +npmInstall.dependsOn assembleWeb +//jsTest.dependsOn testMochaNode + +if (!project.hasProperty("teamcity") || project.hasProperty("enable-js-tests")) { + jsTest.dependsOn testMochaChrome } diff --git a/gradle/jvm.gradle b/gradle/jvm.gradle index 6222c41665..9f456a43de 100644 --- a/gradle/jvm.gradle +++ b/gradle/jvm.gradle @@ -1,27 +1,65 @@ -sourceSets { - main { - kotlin.srcDir 'src' - resources.srcDir 'resources' +kotlin { + targets { + fromPreset(presets.jvm, 'jvm') } - test { - kotlin.srcDir 'test' - resources.srcDir 'test-resources' + + task jarTest(type: Jar, dependsOn: jvmTestClasses) { + from targets.jvm.compilations.test.output + classifier 'test' + } + + configure(targets) { + compilations.all { compilation -> + if (compilation.name == "main") { + def compileTask = tasks.getByName(compilation.compileKotlinTaskName) + // dump declarations from main JVM module for binary-compatibility-validator + compileTask.kotlinOptions.freeCompilerArgs += ["-Xdump-declarations-to=${buildDir}/visibilities.json"] + } + } } -} -task jarTest(type: Jar, dependsOn: testClasses) { - from sourceSets.test.output - classifier = 'test' + sourceSets { + jvmMain.dependencies { + api 'org.jetbrains.kotlin:kotlin-stdlib' + api group: 'org.jetbrains.kotlin', name: 'kotlin-reflect', version: kotlin_version + api group: 'org.jetbrains.kotlin', name: 'kotlin-stdlib', version: kotlin_version + api group: 'org.jetbrains.kotlin', name: 'kotlin-stdlib-jdk7', version: kotlin_version + api group: 'org.jetbrains.kotlin', name: 'kotlin-stdlib-jdk8', version: kotlin_version + api group: 'org.jetbrains.kotlinx', name: 'kotlinx-coroutines-core', version: coroutines_version + api group: 'org.jetbrains.kotlinx', name: 'kotlinx-coroutines-jdk8', version: coroutines_version + + api(group: 'org.jetbrains.kotlinx', name: 'kotlinx-io-jvm', version: kotlinx_io_version) + api(group: 'org.jetbrains.kotlinx', name: 'kotlinx-coroutines-io-jvm', version: kotlinx_io_version) + api("org.jetbrains.kotlinx:atomicfu:$atomic_fu_version") + + api group: 'org.slf4j', name: 'slf4j-api', version: '1.7.25' + api group: 'com.typesafe', name: 'config', version: '1.3.1' + } + + jvmTest.dependencies { + api 'org.jetbrains.kotlin:kotlin-test' + api 'org.jetbrains.kotlin:kotlin-test-junit' + api "junit:junit:$junit_version" + + api group: 'org.jetbrains.kotlin', name: 'kotlin-test-junit', version: kotlin_version + api group: 'junit', name: 'junit', version: junit_version + + api "org.jetbrains.kotlinx:atomicfu:$atomic_fu_version" + } + } } -test { +jvmTest { ignoreFailures = true maxHeapSize = "2g" exclude("**/*StressTest*") } -task stressTest(type: Test, dependsOn: testClasses) { +task stressTest(type: Test) { + classpath = files { jvmTest.classpath } + testClassesDirs = files { jvmTest.testClassesDirs } + ignoreFailures = true maxHeapSize = "2g" forkEvery = 1 @@ -29,60 +67,13 @@ task stressTest(type: Test, dependsOn: testClasses) { systemProperty "enable.stress.tests", "true" } -task packageSources(type: Jar) { - classifier = 'sources' - from sourceSets.main.allSource -} - -artifacts.archives packageSources - configurations { testOutput.extendsFrom(testCompile) boot } -sourceCompatibility = 1.8 -targetCompatibility = 1.8 - -tasks.withType(JavaCompile) { - options.encoding = 'UTF-8' -} - -dependencies { - compile group: 'org.jetbrains.kotlin', name: 'kotlin-reflect', version: kotlin_version - compile group: 'org.jetbrains.kotlin', name: 'kotlin-stdlib', version: kotlin_version - compile group: 'org.jetbrains.kotlin', name: 'kotlin-stdlib-jdk7', version: kotlin_version - compile group: 'org.jetbrains.kotlin', name: 'kotlin-stdlib-jdk8', version: kotlin_version - compile group: 'org.jetbrains.kotlinx', name: 'kotlinx-coroutines-core', version: coroutines_version - compile group: 'org.jetbrains.kotlinx', name: 'kotlinx-coroutines-jdk8', version: coroutines_version - - compile(group: 'org.jetbrains.kotlinx', name: 'kotlinx-io-jvm', version: kotlinx_io_version) { - exclude(module: 'kotlin-stdlib-jvm') - } - - compile(group: 'org.jetbrains.kotlinx', name: 'kotlinx-coroutines-io-jvm', version: kotlinx_io_version) { - exclude(module: 'kotlin-stdlib-jvm') - } - - compile group: 'org.slf4j', name: 'slf4j-api', version: '1.7.25' - compile group: 'com.typesafe', name: 'config', version: '1.3.1' - testCompile group: 'org.jetbrains.kotlin', name: 'kotlin-test-junit', version: kotlin_version - testCompile group: 'junit', name: 'junit', version: junit_version -} - -jar { +jvmJar { manifest { attributes("Implementation-Title": project.name, "Implementation-Version": configuredVersion) } } - -compileKotlin { - kotlinOptions.freeCompilerArgs += [ experimentalAnnotations ] - - // dump declarations from main JVM module for binary-compatibility-validator - kotlinOptions.freeCompilerArgs += ["-Xdump-declarations-to=${buildDir}/visibilities.json"] -} - -compileTestKotlin { - kotlinOptions.freeCompilerArgs += [ experimentalAnnotations ] -} diff --git a/gradle/maven.gradle b/gradle/maven.gradle deleted file mode 100644 index a3ab122c17..0000000000 --- a/gradle/maven.gradle +++ /dev/null @@ -1,34 +0,0 @@ -def pomConfig = { - licenses { - license { - name 'The Apache Software License, Version 2.0' - url 'http://www.apache.org/licenses/LICENSE-2.0.txt' - distribution 'repo' - } - } - developers { - developer { - id 'JetBrains' - name 'JetBrains Team' - organization 'JetBrains' - organizationUrl 'http://www.jetbrains.com' - } - } - - scm { - url 'https://github.com/ktorio/ktor.git' - } -} - -def withPom = { pom -> - pom.withXml { - def root = asNode() - root.appendNode('name', project.name) - root.appendNode('description', - 'Framework for quickly creating connected applications in Kotlin with minimal effort') - root.appendNode('url', 'https://github.com/ktorio/ktor') - root.children().last() + pomConfig - } -} - -project.ext.configurePom = withPom diff --git a/gradle/native.gradle b/gradle/native.gradle deleted file mode 100644 index fa808ccb54..0000000000 --- a/gradle/native.gradle +++ /dev/null @@ -1,36 +0,0 @@ - -sourceSets { - main { - kotlin.srcDir 'src' - component { - targets = ['ios_arm64', 'ios_x64', 'macos_x64'] - outputKinds = [KLIBRARY] - extraOpts experimentalAnnotations - - pom { - project.ext.configurePom(it) - } - } - } - test { - kotlin.srcDir 'test' - component { - targets = ['ios_arm64', 'ios_x64', 'macos_x64'] - extraOpts experimentalAnnotations - } - } -} - -dependencies { - implementation group: 'org.jetbrains.kotlinx', name: 'kotlinx-coroutines-core-native', version: coroutines_version - implementation group: 'org.jetbrains.kotlinx', name: 'kotlinx-io-native', version: kotlinx_io_version - implementation group: 'org.jetbrains.kotlinx', name: 'kotlinx-coroutines-io-native', version: kotlinx_io_version -} - -if (project.hasProperty("teamcity")) { - afterEvaluate { - tasks.withType(Class.forName("org.gradle.nativeplatform.test.tasks.RunTestExecutable")) { - args '--ktest_logger=TEAMCITY' - } - } -} diff --git a/gradle/nodejs.gradle b/gradle/nodejs.gradle new file mode 100644 index 0000000000..0f2951907e --- /dev/null +++ b/gradle/nodejs.gradle @@ -0,0 +1,43 @@ +apply plugin: 'com.moowork.node' + +node { + version = "$nodejs_version" + npmVersion = "$npm_version" + + download = true + nodeModulesDir = file(buildDir) +} + +repositories.whenObjectAdded { + if (it instanceof IvyArtifactRepository) { + metadataSources { + artifact() + } + } +} + +task prepareNodePackage(type: Copy) { + from("npm") { + include 'package.json' + expand(project.properties + [kotlinDependency: ""]) + } + from("npm") { + exclude 'package.json' + } + into "$node.nodeModulesDir" +} + +npmInstall.dependsOn prepareNodePackage + +task installDependenciesMocha(type: NpmTask, dependsOn: npmInstall) { + args = [ + 'install', + "mocha@$mocha_version", + "mocha-headless-chrome@$mocha_headless_chrome_version", + "source-map-support@$source_map_support_version", + '--no-save' + ] + if (project.hasProperty("teamcity")) args += [ + "mocha-teamcity-reporter@$mocha_teamcity_reporter_version" + ] +} diff --git a/gradle/platform.gradle b/gradle/platform.gradle deleted file mode 100644 index 61b61110a7..0000000000 --- a/gradle/platform.gradle +++ /dev/null @@ -1,36 +0,0 @@ -def commonModules = [ - 'ktor-client', - 'ktor-client-core', - 'ktor-client-json', - 'ktor-client-mock', - 'ktor-client-logging', - 'ktor-utils', - 'ktor-http' -] - -def nativeModules = [ - 'ktor-client-ios', - 'ktor-http-ios', - 'ktor-utils-ios', - 'ktor-client-core-ios', - 'ktor-client-json-ios', - 'ktor-client-mock-ios', - 'ktor-client-logging-ios' -] - -def jsModules = [ - 'ktor-client-js', - 'ktor-client-core-js', - 'ktor-http-js', - 'ktor-utils-js', - 'ktor-client-json-js', - 'ktor-client-mock-js', - 'ktor-client-logging-js' -] - -ext.platformOf = { Project project -> - if (project.name in commonModules) return 'common' - if (project.name in nativeModules) return 'native' - if (project.name in jsModules) return 'js' - return 'jvm' -} diff --git a/gradle/pom.gradle b/gradle/pom.gradle new file mode 100644 index 0000000000..9549bf9fc5 --- /dev/null +++ b/gradle/pom.gradle @@ -0,0 +1,37 @@ +def pomConfig = { + licenses { + license { + name "The Apache Software License, Version 2.0" + url "http://www.apache.org/licenses/LICENSE-2.0.txt" + distribution "repo" + } + } + developers { + developer { + id "JetBrains" + name "JetBrains Team" + organization "JetBrains" + organizationUrl "http://www.jetbrains.com" + } + } + + scm { + url "https://github.com/ktorio/ktor.git" + } +} + +project.ext.configureMavenCentralMetadata = { pom -> + def root = asNode() + root.appendNode('name', project.name) + root.appendNode('description', 'Ktor is a framework for quickly creating web applications in Kotlin with minimal effort.') + root.appendNode('url', 'https://github.com/ktorio/ktor') + root.children().last() + pomConfig + + def dependenciesNode = asNode().getAt("dependencies")[0] + if (dependenciesNode != null) { + def dependencyNode = dependenciesNode.appendNode('dependency') + dependencyNode.appendNode('groupId', "$group") + dependencyNode.appendNode('artifactId', "$project.name") + dependencyNode.appendNode('version', "$project.version") + } +} diff --git a/gradle/posix.gradle b/gradle/posix.gradle new file mode 100644 index 0000000000..5ed51e74e3 --- /dev/null +++ b/gradle/posix.gradle @@ -0,0 +1,41 @@ +apply from: rootProject.file("gradle/ide.gradle") + +kotlin { + targets { + if (project.ext.ideaActive) { + fromPreset(project.ext.ideaPreset, 'posix') + } else { + fromPreset(presets.linuxX64, 'linuxX64') + fromPreset(presets.iosArm64, 'iosArm64') + fromPreset(presets.iosX64, 'iosX64') + fromPreset(presets.macosX64, 'macosX64') + /* fromPreset(presets.iosArm32, 'iosArm32') */ + fromPreset(presets.mingwX64, 'mingwX64') + } + + + } + sourceSets { + posixMain.dependencies { + implementation group: 'org.jetbrains.kotlinx', name: 'kotlinx-coroutines-core-native', version: coroutines_version + implementation group: 'org.jetbrains.kotlinx', name: 'kotlinx-io-native', version: kotlinx_io_version + implementation group: 'org.jetbrains.kotlinx', name: 'kotlinx-coroutines-io-native', version: kotlinx_io_version + + implementation "org.jetbrains.kotlinx:atomicfu:$atomic_fu_version" + } + + posixTest { dependsOn posixMain} + posixMain { dependsOn commonMain } + + if (!project.ext.ideaActive) { + configure([/*iosArm32Main, */ iosArm64Main, iosX64Main, macosX64Main, linuxX64Main, mingwX64Main]) { + dependsOn posixMain + } + configure([/*iosArm32Test, */ iosArm64Test, iosX64Test, macosX64Test, linuxX64Test, mingwX64Test]) { + dependsOn posixTest + } + } + } +} + +project.ext.set("hasNative", true) diff --git a/gradle/publish.gradle b/gradle/publish.gradle index 2fe62787dd..d687ef35f2 100644 --- a/gradle/publish.gradle +++ b/gradle/publish.gradle @@ -2,14 +2,42 @@ apply plugin: 'maven' apply plugin: 'maven-publish' apply plugin: 'com.jfrog.bintray' -apply from: rootProject.file('gradle/platform.gradle') -apply from: rootProject.file('gradle/maven.gradle') +apply from: project.rootProject.file('gradle/pom.gradle') -def platform = platformOf(project) -def skipDokka = project.path.contains("ktor-samples") || project == rootProject || project.name in dokkaExcludes || platform != 'jvm' +task emptyJar(type: Jar) { +} + +task stubJavadoc(type: Jar) { + classifier 'javadoc' +} + +task stubDokka(type: Jar) { + classifier 'kdoc' +} + +def selectArtifactId(project, type) { + def name = project.name + def OBSOLETE = "$name-$type-obsolete" + def isCommon = project.ext.has("commonStructure") + def commonIsRoot = project.ext.has("commonStructure") && project.ext.commonStructure + def hasNative = project.ext.has("hasNative") && project.ext.hasNative -if (!skipDokka) { - apply from: rootProject.file('gradle/dokka.gradle') + switch (type) { + case 'metadata': + if (!isCommon) return OBSOLETE + return commonIsRoot ? "$name" : "$name-common" + break + case 'kotlinMultiplatform': + if (!hasNative) return OBSOLETE + return isCommon ? "$name-native" : "$name" + break + case 'jvm': + return commonIsRoot ? "$name-jvm" : "$name" + break + default: + return isCommon || hasNative ? "$name-$type" : "$name" + break + } } publishing { @@ -22,34 +50,71 @@ publishing { } } } + publications.all { + pom.withXml(configureMavenCentralMetadata) + def id = selectArtifactId(project, it.name) + it.artifactId = id + if (id.endsWith('native')) { + it.artifact stubJavadoc + it.artifact stubDokka + it.artifact emptyJar + } + } - publications { - mavenProject(MavenPublication) { - if (platform != 'native') { - from components.java - } - groupId project.group - artifactId project.name - version project.version - - artifact sourceJar + kotlin.targets.all { target -> + def publication = publishing.publications.findByName(target.name) - if (!skipDokka) { - artifact javadocJar { - classifier 'javadoc' - } + if (publication != null) { + if (target.platformType.name == 'jvm') { + publication.artifact javadocJar + publication.artifact dokkaJar + } else { + publication.artifact stubJavadoc + publication.artifact stubDokka + } - artifact dokkaJar { - classifier 'kdoc' + if (target.platformType.name != 'native') { + publication.gradleModuleMetadataFile = null + tasks.matching { it.name == "generateMetadataFileFor${name.capitalize()}Publication" }.all { + onlyIf { false } } + } else { + publication.artifact emptyJar } + } + } - configurePom(pom) + publications.removeIf { it.artifactId.endsWith("-obsolete") } +} + +bintray { + user = project.hasProperty('bintrayUser') ? project.property('bintrayUser') : System.getenv('BINTRAY_USER') + key = project.hasProperty('bintrayApiKey') ? project.property('bintrayApiKey') : System.getenv('BINTRAY_API_KEY') + publish = true + override = true + + pkg { + userOrg = 'kotlin' + repo = 'ktor' + name = 'ktor' + licenses = ['Apache-2.0'] + vcsUrl = 'https://github.com/ktorio/ktor' + + version { + name = project.version + released = new Date() + vcsTag = project.version } } } -def skipUpload = project.path.contains("ktor-samples") -if (!skipUpload) { - apply from: rootProject.file("gradle/bintray.gradle") +// TODO :kludge this is required for K/N publishing +bintrayUpload.dependsOn publishToMavenLocal + +// This is for easier debugging of bintray uploading problems +bintrayUpload.doFirst { + publications = project.publishing.publications.findAll { !it.name.contains('-test') }.collect { + println("Uploading artifact '$it.groupId:$it.artifactId:$it.version' from publication '$it.name'") + it + } } diff --git a/gradle/utility.gradle b/gradle/utility.gradle new file mode 100644 index 0000000000..46230f3ed4 --- /dev/null +++ b/gradle/utility.gradle @@ -0,0 +1,34 @@ +project.ext.ideaActive = System.getProperty('idea.active') == 'true' + +kotlin { + targets { + def manager = project.ext.hostManager + def linuxEnabled = manager.isEnabled(presets.linuxX64.konanTarget) + def macosEnabled = manager.isEnabled(presets.macosX64.konanTarget) + def winEnabled = manager.isEnabled(presets.mingwX64.konanTarget) + + project.ext.isLinuxHost = linuxEnabled + project.ext.isMacosHost = macosEnabled + project.ext.isWinHost = winEnabled + + if (project.ext.ideaActive) { + def ideaPreset = presets.linuxX64 + if (macosEnabled) ideaPreset = presets.macosX64 + if (winEnabled) ideaPreset = presets.mingwX64 + + project.ext.ideaPreset = ideaPreset + } + } +} + +def java_version = System.properties["java.version"] + +switch (java_version) { + case '1.8.0_191': + case '1.8.0_192': + project.ext.jetty_alpn_boot_version = "8.1.13.v20181017" + break + default: + project.ext.jetty_alpn_boot_version = "8.1.12.v20180117" + break +} diff --git a/jvm/.gitkeep b/jvm/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ktor-client/build.gradle b/ktor-client/build.gradle index bf7a2fae5e..e704dcecb4 100644 --- a/ktor-client/build.gradle +++ b/ktor-client/build.gradle @@ -1,4 +1,3 @@ - -dependencies { - compile project(':ktor-client:ktor-client-core') -} \ No newline at end of file +kotlin.sourceSets.commonMain.dependencies { + api project(':ktor-client:ktor-client-core') +} diff --git a/ktor-client/jvm/.gitkeep b/ktor-client/jvm/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ktor-client/ktor-client-android/build.gradle b/ktor-client/ktor-client-android/build.gradle index 32f1a33819..b0181d77f7 100644 --- a/ktor-client/ktor-client-android/build.gradle +++ b/ktor-client/ktor-client-android/build.gradle @@ -1,5 +1,9 @@ -dependencies { - compile project(":ktor-client:ktor-client-core:ktor-client-core-jvm") - - testCompile project(":ktor-client:ktor-client-tests") -} \ No newline at end of file +kotlin.sourceSets { + jvmMain.dependencies { + api project(':ktor-client:ktor-client-core') + } + jvmTest.dependencies { + api project(':ktor-client:ktor-client-tests') + api project(':ktor-network:ktor-network-tls') + } +} diff --git a/ktor-client/ktor-client-android/resources/META-INF/services/io.ktor.client.HttpClientEngineContainer b/ktor-client/ktor-client-android/jvm/resources/META-INF/services/io.ktor.client.HttpClientEngineContainer similarity index 100% rename from ktor-client/ktor-client-android/resources/META-INF/services/io.ktor.client.HttpClientEngineContainer rename to ktor-client/ktor-client-android/jvm/resources/META-INF/services/io.ktor.client.HttpClientEngineContainer diff --git a/ktor-client/ktor-client-android/src/io/ktor/client/engine/android/Android.kt b/ktor-client/ktor-client-android/jvm/src/io/ktor/client/engine/android/Android.kt similarity index 100% rename from ktor-client/ktor-client-android/src/io/ktor/client/engine/android/Android.kt rename to ktor-client/ktor-client-android/jvm/src/io/ktor/client/engine/android/Android.kt diff --git a/ktor-client/ktor-client-android/src/io/ktor/client/engine/android/AndroidClientEngine.kt b/ktor-client/ktor-client-android/jvm/src/io/ktor/client/engine/android/AndroidClientEngine.kt similarity index 100% rename from ktor-client/ktor-client-android/src/io/ktor/client/engine/android/AndroidClientEngine.kt rename to ktor-client/ktor-client-android/jvm/src/io/ktor/client/engine/android/AndroidClientEngine.kt diff --git a/ktor-client/ktor-client-android/src/io/ktor/client/engine/android/AndroidEngineConfig.kt b/ktor-client/ktor-client-android/jvm/src/io/ktor/client/engine/android/AndroidEngineConfig.kt similarity index 100% rename from ktor-client/ktor-client-android/src/io/ktor/client/engine/android/AndroidEngineConfig.kt rename to ktor-client/ktor-client-android/jvm/src/io/ktor/client/engine/android/AndroidEngineConfig.kt diff --git a/ktor-client/ktor-client-android/src/io/ktor/client/engine/android/AndroidHttpRequest.kt b/ktor-client/ktor-client-android/jvm/src/io/ktor/client/engine/android/AndroidHttpRequest.kt similarity index 100% rename from ktor-client/ktor-client-android/src/io/ktor/client/engine/android/AndroidHttpRequest.kt rename to ktor-client/ktor-client-android/jvm/src/io/ktor/client/engine/android/AndroidHttpRequest.kt diff --git a/ktor-client/ktor-client-android/src/io/ktor/client/engine/android/AndroidHttpResponse.kt b/ktor-client/ktor-client-android/jvm/src/io/ktor/client/engine/android/AndroidHttpResponse.kt similarity index 100% rename from ktor-client/ktor-client-android/src/io/ktor/client/engine/android/AndroidHttpResponse.kt rename to ktor-client/ktor-client-android/jvm/src/io/ktor/client/engine/android/AndroidHttpResponse.kt diff --git a/ktor-client/ktor-client-android/test/io/ktor/client/engine/android/AndroidHttpsTest.kt b/ktor-client/ktor-client-android/jvm/test/io/ktor/client/engine/android/AndroidHttpsTest.kt similarity index 99% rename from ktor-client/ktor-client-android/test/io/ktor/client/engine/android/AndroidHttpsTest.kt rename to ktor-client/ktor-client-android/jvm/test/io/ktor/client/engine/android/AndroidHttpsTest.kt index d9b7f2e66d..7c040dbfee 100644 --- a/ktor-client/ktor-client-android/test/io/ktor/client/engine/android/AndroidHttpsTest.kt +++ b/ktor-client/ktor-client-android/jvm/test/io/ktor/client/engine/android/AndroidHttpsTest.kt @@ -16,11 +16,11 @@ import io.ktor.server.netty.* import io.ktor.util.* import kotlinx.coroutines.* import org.junit.* -import org.junit.Test import java.io.* import java.security.* import javax.net.ssl.* import kotlin.test.* +import kotlin.test.Test class AndroidHttpsTest : TestWithKtor() { override val server: ApplicationEngine = embeddedServer(Netty, applicationEngineEnvironment { diff --git a/ktor-client/ktor-client-android/test/io/ktor/client/engine/android/AndroidProxyTest.kt b/ktor-client/ktor-client-android/jvm/test/io/ktor/client/engine/android/AndroidProxyTest.kt similarity index 100% rename from ktor-client/ktor-client-android/test/io/ktor/client/engine/android/AndroidProxyTest.kt rename to ktor-client/ktor-client-android/jvm/test/io/ktor/client/engine/android/AndroidProxyTest.kt diff --git a/ktor-client/ktor-client-android/test/io/ktor/client/engine/android/CommonTests.kt b/ktor-client/ktor-client-android/jvm/test/io/ktor/client/engine/android/CommonTests.kt similarity index 100% rename from ktor-client/ktor-client-android/test/io/ktor/client/engine/android/CommonTests.kt rename to ktor-client/ktor-client-android/jvm/test/io/ktor/client/engine/android/CommonTests.kt diff --git a/ktor-client/ktor-client-apache/build.gradle b/ktor-client/ktor-client-apache/build.gradle index 6de1c49b8c..e54bda038b 100644 --- a/ktor-client/ktor-client-apache/build.gradle +++ b/ktor-client/ktor-client-apache/build.gradle @@ -1,8 +1,11 @@ -description = "Apache backend for ktor http client" +description = 'Apache backend for ktor http client' -dependencies { - compile project(":ktor-client:ktor-client-core:ktor-client-core-jvm") - compile group: "org.apache.httpcomponents", "name": "httpasyncclient", version: "4.1.3" - - testCompile project(":ktor-client:ktor-client-tests") +kotlin.sourceSets { + jvmMain.dependencies { + api project(':ktor-client:ktor-client-core') + api group: 'org.apache.httpcomponents', name: 'httpasyncclient', version: '4.1.3' + } + jvmTest.dependencies { + api project(':ktor-client:ktor-client-tests') + } } diff --git a/ktor-client/ktor-client-apache/resources/META-INF/services/io.ktor.client.HttpClientEngineContainer b/ktor-client/ktor-client-apache/jvm/resources/META-INF/services/io.ktor.client.HttpClientEngineContainer similarity index 100% rename from ktor-client/ktor-client-apache/resources/META-INF/services/io.ktor.client.HttpClientEngineContainer rename to ktor-client/ktor-client-apache/jvm/resources/META-INF/services/io.ktor.client.HttpClientEngineContainer diff --git a/ktor-client/ktor-client-apache/src/io/ktor/client/engine/apache/Apache.kt b/ktor-client/ktor-client-apache/jvm/src/io/ktor/client/engine/apache/Apache.kt similarity index 100% rename from ktor-client/ktor-client-apache/src/io/ktor/client/engine/apache/Apache.kt rename to ktor-client/ktor-client-apache/jvm/src/io/ktor/client/engine/apache/Apache.kt diff --git a/ktor-client/ktor-client-apache/src/io/ktor/client/engine/apache/ApacheEngine.kt b/ktor-client/ktor-client-apache/jvm/src/io/ktor/client/engine/apache/ApacheEngine.kt similarity index 100% rename from ktor-client/ktor-client-apache/src/io/ktor/client/engine/apache/ApacheEngine.kt rename to ktor-client/ktor-client-apache/jvm/src/io/ktor/client/engine/apache/ApacheEngine.kt diff --git a/ktor-client/ktor-client-apache/src/io/ktor/client/engine/apache/ApacheEngineConfig.kt b/ktor-client/ktor-client-apache/jvm/src/io/ktor/client/engine/apache/ApacheEngineConfig.kt similarity index 100% rename from ktor-client/ktor-client-apache/src/io/ktor/client/engine/apache/ApacheEngineConfig.kt rename to ktor-client/ktor-client-apache/jvm/src/io/ktor/client/engine/apache/ApacheEngineConfig.kt diff --git a/ktor-client/ktor-client-apache/src/io/ktor/client/engine/apache/ApacheHttpRequest.kt b/ktor-client/ktor-client-apache/jvm/src/io/ktor/client/engine/apache/ApacheHttpRequest.kt similarity index 100% rename from ktor-client/ktor-client-apache/src/io/ktor/client/engine/apache/ApacheHttpRequest.kt rename to ktor-client/ktor-client-apache/jvm/src/io/ktor/client/engine/apache/ApacheHttpRequest.kt diff --git a/ktor-client/ktor-client-apache/src/io/ktor/client/engine/apache/ApacheHttpResponse.kt b/ktor-client/ktor-client-apache/jvm/src/io/ktor/client/engine/apache/ApacheHttpResponse.kt similarity index 100% rename from ktor-client/ktor-client-apache/src/io/ktor/client/engine/apache/ApacheHttpResponse.kt rename to ktor-client/ktor-client-apache/jvm/src/io/ktor/client/engine/apache/ApacheHttpResponse.kt diff --git a/ktor-client/ktor-client-apache/src/io/ktor/client/engine/apache/ApacheRequestProducer.kt b/ktor-client/ktor-client-apache/jvm/src/io/ktor/client/engine/apache/ApacheRequestProducer.kt similarity index 100% rename from ktor-client/ktor-client-apache/src/io/ktor/client/engine/apache/ApacheRequestProducer.kt rename to ktor-client/ktor-client-apache/jvm/src/io/ktor/client/engine/apache/ApacheRequestProducer.kt diff --git a/ktor-client/ktor-client-apache/src/io/ktor/client/engine/apache/ApacheResponseConsumer.kt b/ktor-client/ktor-client-apache/jvm/src/io/ktor/client/engine/apache/ApacheResponseConsumer.kt similarity index 100% rename from ktor-client/ktor-client-apache/src/io/ktor/client/engine/apache/ApacheResponseConsumer.kt rename to ktor-client/ktor-client-apache/jvm/src/io/ktor/client/engine/apache/ApacheResponseConsumer.kt diff --git a/ktor-client/ktor-client-apache/test/io/ktor/client/engine/apache/CommonTests.kt b/ktor-client/ktor-client-apache/jvm/test/io/ktor/client/engine/apache/CommonTests.kt similarity index 100% rename from ktor-client/ktor-client-apache/test/io/ktor/client/engine/apache/CommonTests.kt rename to ktor-client/ktor-client-apache/jvm/test/io/ktor/client/engine/apache/CommonTests.kt diff --git a/ktor-client/ktor-client-cio/build.gradle b/ktor-client/ktor-client-cio/build.gradle index 6a3055c08b..e09276ce49 100644 --- a/ktor-client/ktor-client-cio/build.gradle +++ b/ktor-client/ktor-client-cio/build.gradle @@ -1,9 +1,12 @@ -description = "CIO backend for ktor http client" +description = 'CIO backend for ktor http client' -dependencies { - compile project(":ktor-client:ktor-client-core:ktor-client-core-jvm") - compile project(":ktor-http:ktor-http-cio") - compile project(":ktor-network:ktor-network-tls") - - testCompile project(":ktor-client:ktor-client-tests") -} \ No newline at end of file +kotlin.sourceSets { + jvmMain.dependencies { + api project(':ktor-client:ktor-client-core') + api project(':ktor-http:ktor-http-cio') + api project(':ktor-network:ktor-network-tls') + } + jvmTest.dependencies { + api project(':ktor-client:ktor-client-tests') + } +} diff --git a/ktor-client/ktor-client-cio/resources/META-INF/services/io.ktor.client.HttpClientEngineContainer b/ktor-client/ktor-client-cio/jvm/resources/META-INF/services/io.ktor.client.HttpClientEngineContainer similarity index 100% rename from ktor-client/ktor-client-cio/resources/META-INF/services/io.ktor.client.HttpClientEngineContainer rename to ktor-client/ktor-client-cio/jvm/resources/META-INF/services/io.ktor.client.HttpClientEngineContainer diff --git a/ktor-client/ktor-client-cio/src/io/ktor/client/engine/cio/CIO.kt b/ktor-client/ktor-client-cio/jvm/src/io/ktor/client/engine/cio/CIO.kt similarity index 100% rename from ktor-client/ktor-client-cio/src/io/ktor/client/engine/cio/CIO.kt rename to ktor-client/ktor-client-cio/jvm/src/io/ktor/client/engine/cio/CIO.kt diff --git a/ktor-client/ktor-client-cio/src/io/ktor/client/engine/cio/CIOEngine.kt b/ktor-client/ktor-client-cio/jvm/src/io/ktor/client/engine/cio/CIOEngine.kt similarity index 100% rename from ktor-client/ktor-client-cio/src/io/ktor/client/engine/cio/CIOEngine.kt rename to ktor-client/ktor-client-cio/jvm/src/io/ktor/client/engine/cio/CIOEngine.kt diff --git a/ktor-client/ktor-client-cio/src/io/ktor/client/engine/cio/CIOEngineConfig.kt b/ktor-client/ktor-client-cio/jvm/src/io/ktor/client/engine/cio/CIOEngineConfig.kt similarity index 100% rename from ktor-client/ktor-client-cio/src/io/ktor/client/engine/cio/CIOEngineConfig.kt rename to ktor-client/ktor-client-cio/jvm/src/io/ktor/client/engine/cio/CIOEngineConfig.kt diff --git a/ktor-client/ktor-client-cio/src/io/ktor/client/engine/cio/CIOHttpResponse.kt b/ktor-client/ktor-client-cio/jvm/src/io/ktor/client/engine/cio/CIOHttpResponse.kt similarity index 97% rename from ktor-client/ktor-client-cio/src/io/ktor/client/engine/cio/CIOHttpResponse.kt rename to ktor-client/ktor-client-cio/jvm/src/io/ktor/client/engine/cio/CIOHttpResponse.kt index 3a431b76f8..5bb11c42a9 100644 --- a/ktor-client/ktor-client-cio/src/io/ktor/client/engine/cio/CIOHttpResponse.kt +++ b/ktor-client/ktor-client-cio/jvm/src/io/ktor/client/engine/cio/CIOHttpResponse.kt @@ -6,7 +6,6 @@ import io.ktor.client.response.* import io.ktor.http.* import io.ktor.http.cio.* import io.ktor.util.date.* -import kotlinx.coroutines.* import kotlinx.coroutines.io.* import kotlin.coroutines.* diff --git a/ktor-client/ktor-client-cio/src/io/ktor/client/engine/cio/ConnectionFactory.kt b/ktor-client/ktor-client-cio/jvm/src/io/ktor/client/engine/cio/ConnectionFactory.kt similarity index 100% rename from ktor-client/ktor-client-cio/src/io/ktor/client/engine/cio/ConnectionFactory.kt rename to ktor-client/ktor-client-cio/jvm/src/io/ktor/client/engine/cio/ConnectionFactory.kt diff --git a/ktor-client/ktor-client-cio/src/io/ktor/client/engine/cio/ConnectionPipeline.kt b/ktor-client/ktor-client-cio/jvm/src/io/ktor/client/engine/cio/ConnectionPipeline.kt similarity index 94% rename from ktor-client/ktor-client-cio/src/io/ktor/client/engine/cio/ConnectionPipeline.kt rename to ktor-client/ktor-client-cio/jvm/src/io/ktor/client/engine/cio/ConnectionPipeline.kt index 68951ac104..96a522c539 100644 --- a/ktor-client/ktor-client-cio/src/io/ktor/client/engine/cio/ConnectionPipeline.kt +++ b/ktor-client/ktor-client-cio/jvm/src/io/ktor/client/engine/cio/ConnectionPipeline.kt @@ -93,7 +93,13 @@ internal class ConnectionPipeline( responseChannel?.use { try { - parseHttpBody(contentLength, transferEncoding, connectionType, networkInput, this) + parseHttpBody( + contentLength, + transferEncoding, + connectionType, + networkInput, + this + ) } finally { callContext[Job]?.invokeOnCompletion { rawResponse.release() diff --git a/ktor-client/ktor-client-cio/src/io/ktor/client/engine/cio/Endpoint.kt b/ktor-client/ktor-client-cio/jvm/src/io/ktor/client/engine/cio/Endpoint.kt similarity index 100% rename from ktor-client/ktor-client-cio/src/io/ktor/client/engine/cio/Endpoint.kt rename to ktor-client/ktor-client-cio/jvm/src/io/ktor/client/engine/cio/Endpoint.kt diff --git a/ktor-client/ktor-client-cio/src/io/ktor/client/engine/cio/EngineTasks.kt b/ktor-client/ktor-client-cio/jvm/src/io/ktor/client/engine/cio/EngineTasks.kt similarity index 100% rename from ktor-client/ktor-client-cio/src/io/ktor/client/engine/cio/EngineTasks.kt rename to ktor-client/ktor-client-cio/jvm/src/io/ktor/client/engine/cio/EngineTasks.kt diff --git a/ktor-client/ktor-client-cio/src/io/ktor/client/engine/cio/utils.kt b/ktor-client/ktor-client-cio/jvm/src/io/ktor/client/engine/cio/utils.kt similarity index 100% rename from ktor-client/ktor-client-cio/src/io/ktor/client/engine/cio/utils.kt rename to ktor-client/ktor-client-cio/jvm/src/io/ktor/client/engine/cio/utils.kt diff --git a/ktor-client/ktor-client-cio/test/io/ktor/client/engine/cio/CIOHttpsTest.kt b/ktor-client/ktor-client-cio/jvm/test/io/ktor/client/engine/cio/CIOHttpsTest.kt similarity index 100% rename from ktor-client/ktor-client-cio/test/io/ktor/client/engine/cio/CIOHttpsTest.kt rename to ktor-client/ktor-client-cio/jvm/test/io/ktor/client/engine/cio/CIOHttpsTest.kt diff --git a/ktor-client/ktor-client-cio/test/io/ktor/client/engine/cio/CIORequestTest.kt b/ktor-client/ktor-client-cio/jvm/test/io/ktor/client/engine/cio/CIORequestTest.kt similarity index 100% rename from ktor-client/ktor-client-cio/test/io/ktor/client/engine/cio/CIORequestTest.kt rename to ktor-client/ktor-client-cio/jvm/test/io/ktor/client/engine/cio/CIORequestTest.kt diff --git a/ktor-client/ktor-client-cio/test/io/ktor/client/engine/cio/CommonTests.kt b/ktor-client/ktor-client-cio/jvm/test/io/ktor/client/engine/cio/CommonTests.kt similarity index 100% rename from ktor-client/ktor-client-cio/test/io/ktor/client/engine/cio/CommonTests.kt rename to ktor-client/ktor-client-cio/jvm/test/io/ktor/client/engine/cio/CommonTests.kt diff --git a/ktor-client/ktor-client-core/build.gradle b/ktor-client/ktor-client-core/build.gradle index 83deed6b67..a16e2a29fe 100644 --- a/ktor-client/ktor-client-core/build.gradle +++ b/ktor-client/ktor-client-core/build.gradle @@ -1,8 +1,14 @@ -description = "Ktor http client" +description = 'Ktor http client' -dependencies { - compile project(":ktor-http") - compile project(":ktor-utils") - - testCompile project(":ktor-client:ktor-client-mock") +kotlin.sourceSets { + commonMain.dependencies { + api project(':ktor-http') + } + jvmMain.dependencies { + api project(':ktor-network') + } + jvmTest.dependencies { + api project(':ktor-client:ktor-client-mock') + api project(':ktor-client:ktor-client-tests') + } } diff --git a/ktor-client/ktor-client-core/src/io/ktor/client/HttpClient.kt b/ktor-client/ktor-client-core/common/src/io/ktor/client/HttpClient.kt similarity index 99% rename from ktor-client/ktor-client-core/src/io/ktor/client/HttpClient.kt rename to ktor-client/ktor-client-core/common/src/io/ktor/client/HttpClient.kt index d271e26cec..d199a4ce29 100644 --- a/ktor-client/ktor-client-core/src/io/ktor/client/HttpClient.kt +++ b/ktor-client/ktor-client-core/common/src/io/ktor/client/HttpClient.kt @@ -45,7 +45,7 @@ fun HttpClient( @HttpClientDsl fun HttpClient( engine: HttpClientEngine, - block: HttpClientConfig<*>.()->Unit + block: HttpClientConfig<*>.() -> Unit ): HttpClient = HttpClient(engine, HttpClientConfig().apply(block)) /** diff --git a/ktor-client/ktor-client-core/src/io/ktor/client/HttpClientConfig.kt b/ktor-client/ktor-client-core/common/src/io/ktor/client/HttpClientConfig.kt similarity index 98% rename from ktor-client/ktor-client-core/src/io/ktor/client/HttpClientConfig.kt rename to ktor-client/ktor-client-core/common/src/io/ktor/client/HttpClientConfig.kt index b0dada3ace..7ab5796819 100644 --- a/ktor-client/ktor-client-core/src/io/ktor/client/HttpClientConfig.kt +++ b/ktor-client/ktor-client-core/common/src/io/ktor/client/HttpClientConfig.kt @@ -13,7 +13,7 @@ class HttpClientConfig { private val features = mutableMapOf, (HttpClient) -> Unit>() private val customInterceptors = mutableMapOf Unit>() - internal var engineConfig: T.()->Unit = {} + internal var engineConfig: T.() -> Unit = {} /** * Configure engine parameters. diff --git a/ktor-client/ktor-client-core/src/io/ktor/client/call/HttpClientCall.kt b/ktor-client/ktor-client-core/common/src/io/ktor/client/call/HttpClientCall.kt similarity index 100% rename from ktor-client/ktor-client-core/src/io/ktor/client/call/HttpClientCall.kt rename to ktor-client/ktor-client-core/common/src/io/ktor/client/call/HttpClientCall.kt diff --git a/ktor-client/ktor-client-core/src/io/ktor/client/call/TypeInfo.kt b/ktor-client/ktor-client-core/common/src/io/ktor/client/call/TypeInfo.kt similarity index 100% rename from ktor-client/ktor-client-core/src/io/ktor/client/call/TypeInfo.kt rename to ktor-client/ktor-client-core/common/src/io/ktor/client/call/TypeInfo.kt diff --git a/ktor-client/ktor-client-core/src/io/ktor/client/call/utils.kt b/ktor-client/ktor-client-core/common/src/io/ktor/client/call/utils.kt similarity index 72% rename from ktor-client/ktor-client-core/src/io/ktor/client/call/utils.kt rename to ktor-client/ktor-client-core/common/src/io/ktor/client/call/utils.kt index 8fde465201..05a328c883 100644 --- a/ktor-client/ktor-client-core/src/io/ktor/client/call/utils.kt +++ b/ktor-client/ktor-client-core/common/src/io/ktor/client/call/utils.kt @@ -26,3 +26,15 @@ suspend fun HttpClient.call( url.takeFrom(urlString) block() } + +/** + * Constructs a [HttpClientCall] from this [HttpClient], + * an [url] and an optional [block] configuring a [HttpRequestBuilder]. + */ +suspend fun HttpClient.call( + url: Url, + block: suspend HttpRequestBuilder.() -> Unit = {} +): HttpClientCall = call { + this.url.takeFrom(url) + block() +} diff --git a/ktor-client/ktor-client-core/src/io/ktor/client/engine/HttpClientEngine.kt b/ktor-client/ktor-client-core/common/src/io/ktor/client/engine/HttpClientEngine.kt similarity index 100% rename from ktor-client/ktor-client-core/src/io/ktor/client/engine/HttpClientEngine.kt rename to ktor-client/ktor-client-core/common/src/io/ktor/client/engine/HttpClientEngine.kt diff --git a/ktor-client/ktor-client-core/src/io/ktor/client/engine/HttpClientEngineConfig.kt b/ktor-client/ktor-client-core/common/src/io/ktor/client/engine/HttpClientEngineConfig.kt similarity index 100% rename from ktor-client/ktor-client-core/src/io/ktor/client/engine/HttpClientEngineConfig.kt rename to ktor-client/ktor-client-core/common/src/io/ktor/client/engine/HttpClientEngineConfig.kt diff --git a/ktor-client/ktor-client-core/src/io/ktor/client/engine/Utils.kt b/ktor-client/ktor-client-core/common/src/io/ktor/client/engine/Utils.kt similarity index 100% rename from ktor-client/ktor-client-core/src/io/ktor/client/engine/Utils.kt rename to ktor-client/ktor-client-core/common/src/io/ktor/client/engine/Utils.kt diff --git a/ktor-client/ktor-client-core/src/io/ktor/client/features/DefaultRequest.kt b/ktor-client/ktor-client-core/common/src/io/ktor/client/features/DefaultRequest.kt similarity index 100% rename from ktor-client/ktor-client-core/src/io/ktor/client/features/DefaultRequest.kt rename to ktor-client/ktor-client-core/common/src/io/ktor/client/features/DefaultRequest.kt diff --git a/ktor-client/ktor-client-core/src/io/ktor/client/features/DefaultTransform.kt b/ktor-client/ktor-client-core/common/src/io/ktor/client/features/DefaultTransform.kt similarity index 100% rename from ktor-client/ktor-client-core/src/io/ktor/client/features/DefaultTransform.kt rename to ktor-client/ktor-client-core/common/src/io/ktor/client/features/DefaultTransform.kt diff --git a/ktor-client/ktor-client-core/src/io/ktor/client/features/ExpectSuccess.kt b/ktor-client/ktor-client-core/common/src/io/ktor/client/features/ExpectSuccess.kt similarity index 100% rename from ktor-client/ktor-client-core/src/io/ktor/client/features/ExpectSuccess.kt rename to ktor-client/ktor-client-core/common/src/io/ktor/client/features/ExpectSuccess.kt diff --git a/ktor-client/ktor-client-core/src/io/ktor/client/features/HttpClientFeature.kt b/ktor-client/ktor-client-core/common/src/io/ktor/client/features/HttpClientFeature.kt similarity index 100% rename from ktor-client/ktor-client-core/src/io/ktor/client/features/HttpClientFeature.kt rename to ktor-client/ktor-client-core/common/src/io/ktor/client/features/HttpClientFeature.kt diff --git a/ktor-client/ktor-client-core/src/io/ktor/client/features/HttpPlainText.kt b/ktor-client/ktor-client-core/common/src/io/ktor/client/features/HttpPlainText.kt similarity index 88% rename from ktor-client/ktor-client-core/src/io/ktor/client/features/HttpPlainText.kt rename to ktor-client/ktor-client-core/common/src/io/ktor/client/features/HttpPlainText.kt index 6ccb737c46..c0b7a3b30e 100644 --- a/ktor-client/ktor-client-core/src/io/ktor/client/features/HttpPlainText.kt +++ b/ktor-client/ktor-client-core/common/src/io/ktor/client/features/HttpPlainText.kt @@ -44,7 +44,12 @@ class HttpPlainText(var defaultCharset: Charset) { scope.responsePipeline.intercept(HttpResponsePipeline.Parse) { (info, response) -> if (info.type != String::class || response !is HttpResponse) return@intercept - proceedWith(HttpResponseContainer(info, feature.read(response))) + try { + val content = feature.read(response) + proceedWith(HttpResponseContainer(info, content)) + } finally { + response.close() + } } } } diff --git a/ktor-client/ktor-client-core/src/io/ktor/client/features/HttpRedirect.kt b/ktor-client/ktor-client-core/common/src/io/ktor/client/features/HttpRedirect.kt similarity index 100% rename from ktor-client/ktor-client-core/src/io/ktor/client/features/HttpRedirect.kt rename to ktor-client/ktor-client-core/common/src/io/ktor/client/features/HttpRedirect.kt diff --git a/ktor-client/ktor-client-core/src/io/ktor/client/features/HttpSend.kt b/ktor-client/ktor-client-core/common/src/io/ktor/client/features/HttpSend.kt similarity index 100% rename from ktor-client/ktor-client-core/src/io/ktor/client/features/HttpSend.kt rename to ktor-client/ktor-client-core/common/src/io/ktor/client/features/HttpSend.kt diff --git a/ktor-client/ktor-client-core/src/io/ktor/client/features/UserAgent.kt b/ktor-client/ktor-client-core/common/src/io/ktor/client/features/UserAgent.kt similarity index 100% rename from ktor-client/ktor-client-core/src/io/ktor/client/features/UserAgent.kt rename to ktor-client/ktor-client-core/common/src/io/ktor/client/features/UserAgent.kt diff --git a/ktor-client/ktor-client-core/src/io/ktor/client/features/cookies/AcceptAllCookiesStorage.kt b/ktor-client/ktor-client-core/common/src/io/ktor/client/features/cookies/AcceptAllCookiesStorage.kt similarity index 100% rename from ktor-client/ktor-client-core/src/io/ktor/client/features/cookies/AcceptAllCookiesStorage.kt rename to ktor-client/ktor-client-core/common/src/io/ktor/client/features/cookies/AcceptAllCookiesStorage.kt diff --git a/ktor-client/ktor-client-core/src/io/ktor/client/features/cookies/ConstantCookiesStorage.kt b/ktor-client/ktor-client-core/common/src/io/ktor/client/features/cookies/ConstantCookiesStorage.kt similarity index 100% rename from ktor-client/ktor-client-core/src/io/ktor/client/features/cookies/ConstantCookiesStorage.kt rename to ktor-client/ktor-client-core/common/src/io/ktor/client/features/cookies/ConstantCookiesStorage.kt diff --git a/ktor-client/ktor-client-core/src/io/ktor/client/features/cookies/CookiesStorage.kt b/ktor-client/ktor-client-core/common/src/io/ktor/client/features/cookies/CookiesStorage.kt similarity index 100% rename from ktor-client/ktor-client-core/src/io/ktor/client/features/cookies/CookiesStorage.kt rename to ktor-client/ktor-client-core/common/src/io/ktor/client/features/cookies/CookiesStorage.kt diff --git a/ktor-client/ktor-client-core/src/io/ktor/client/features/cookies/HttpCookies.kt b/ktor-client/ktor-client-core/common/src/io/ktor/client/features/cookies/HttpCookies.kt similarity index 100% rename from ktor-client/ktor-client-core/src/io/ktor/client/features/cookies/HttpCookies.kt rename to ktor-client/ktor-client-core/common/src/io/ktor/client/features/cookies/HttpCookies.kt diff --git a/ktor-client/ktor-client-core/src/io/ktor/client/features/observer/DelegatedCall.kt b/ktor-client/ktor-client-core/common/src/io/ktor/client/features/observer/DelegatedCall.kt similarity index 100% rename from ktor-client/ktor-client-core/src/io/ktor/client/features/observer/DelegatedCall.kt rename to ktor-client/ktor-client-core/common/src/io/ktor/client/features/observer/DelegatedCall.kt diff --git a/ktor-client/ktor-client-core/src/io/ktor/client/features/observer/ResponseObserver.kt b/ktor-client/ktor-client-core/common/src/io/ktor/client/features/observer/ResponseObserver.kt similarity index 100% rename from ktor-client/ktor-client-core/src/io/ktor/client/features/observer/ResponseObserver.kt rename to ktor-client/ktor-client-core/common/src/io/ktor/client/features/observer/ResponseObserver.kt diff --git a/ktor-client/ktor-client-core/src/io/ktor/client/request/Content.kt b/ktor-client/ktor-client-core/common/src/io/ktor/client/request/Content.kt similarity index 100% rename from ktor-client/ktor-client-core/src/io/ktor/client/request/Content.kt rename to ktor-client/ktor-client-core/common/src/io/ktor/client/request/Content.kt diff --git a/ktor-client/ktor-client-core/src/io/ktor/client/request/HttpRequest.kt b/ktor-client/ktor-client-core/common/src/io/ktor/client/request/HttpRequest.kt similarity index 99% rename from ktor-client/ktor-client-core/src/io/ktor/client/request/HttpRequest.kt rename to ktor-client/ktor-client-core/common/src/io/ktor/client/request/HttpRequest.kt index 9ee3645cf7..7a3a0f44b2 100644 --- a/ktor-client/ktor-client-core/src/io/ktor/client/request/HttpRequest.kt +++ b/ktor-client/ktor-client-core/common/src/io/ktor/client/request/HttpRequest.kt @@ -53,6 +53,9 @@ interface HttpRequest : HttpMessage, CoroutineScope { } +/** + * Default [HttpRequest] implementation. + */ open class DefaultHttpRequest(override val call: HttpClientCall, data: HttpRequestData) : HttpRequest { override val coroutineContext: CoroutineContext get() = call.coroutineContext diff --git a/ktor-client/ktor-client-core/src/io/ktor/client/request/HttpRequestPipeline.kt b/ktor-client/ktor-client-core/common/src/io/ktor/client/request/HttpRequestPipeline.kt similarity index 100% rename from ktor-client/ktor-client-core/src/io/ktor/client/request/HttpRequestPipeline.kt rename to ktor-client/ktor-client-core/common/src/io/ktor/client/request/HttpRequestPipeline.kt diff --git a/ktor-client/ktor-client-core/src/io/ktor/client/request/builders.kt b/ktor-client/ktor-client-core/common/src/io/ktor/client/request/builders.kt similarity index 93% rename from ktor-client/ktor-client-core/src/io/ktor/client/request/builders.kt rename to ktor-client/ktor-client-core/common/src/io/ktor/client/request/builders.kt index 7b49e6cfba..369e9cd8c6 100644 --- a/ktor-client/ktor-client-core/src/io/ktor/client/request/builders.kt +++ b/ktor-client/ktor-client-core/common/src/io/ktor/client/request/builders.kt @@ -20,6 +20,28 @@ suspend inline fun HttpClient.request( suspend inline fun HttpClient.request(block: HttpRequestBuilder.() -> Unit): T = request(HttpRequestBuilder().apply(block)) +/** + * Executes a [HttpClient] request, with the [urlString] and the information configured in builder [block] + * and tries to receive a specific type [T], if fails, an exception is thrown. + */ +suspend inline fun HttpClient.request( + urlString: String, block: HttpRequestBuilder.() -> Unit +): T = request(HttpRequestBuilder().apply { + url(urlString) + block() +}) + +/** + * Executes a [HttpClient] request, with the [url] and the information configured in builder [block] + * and tries to receive a specific type [T], if fails, an exception is thrown. + */ +suspend inline fun HttpClient.request( + url: Url, block: HttpRequestBuilder.() -> Unit +): T = request(HttpRequestBuilder().apply { + url(url) + block() +}) + /** * Executes a [HttpClient] GET request, with the information from the [builder] * and tries to receive a specific type [T], if fails, an exception is thrown. diff --git a/ktor-client/ktor-client-core/common/src/io/ktor/client/request/buildersWithUrl.kt b/ktor-client/ktor-client-core/common/src/io/ktor/client/request/buildersWithUrl.kt new file mode 100644 index 0000000000..b462c154a4 --- /dev/null +++ b/ktor-client/ktor-client-core/common/src/io/ktor/client/request/buildersWithUrl.kt @@ -0,0 +1,109 @@ +package io.ktor.client.request + +import io.ktor.client.* +import io.ktor.http.* + +/** + * Executes a [HttpClient] GET request, with the specified [url] as Url and + * an optional [block] receiving an [HttpRequestBuilder] for further configuring the request. + * + * Tries to receive a specific type [T], if fails, an exception is thrown. + */ +suspend inline fun HttpClient.get( + url: Url, + block: HttpRequestBuilder.() -> Unit = {} +): T = get { + this.url.takeFrom(url) + block() +} + +/** + * Executes a [HttpClient] POST request, with the specified [url] as Url and + * an optional [block] receiving an [HttpRequestBuilder] for further configuring the request. + * + * Tries to receive a specific type [T], if fails, an exception is thrown. + */ +suspend inline fun HttpClient.post( + url: Url, + block: HttpRequestBuilder.() -> Unit = {} +): T = post { + this.url.takeFrom(url) + block() +} + +/** + * Executes a [HttpClient] PUT request, with the specified [url] as Url and + * an optional [block] receiving an [HttpRequestBuilder] for further configuring the request. + * + * Tries to receive a specific type [T], if fails, an exception is thrown. + */ +suspend inline fun HttpClient.put( + url: Url, + block: HttpRequestBuilder.() -> Unit = {} +): T = put { + this.url.takeFrom(url) + block() +} + +/** + * Executes a [HttpClient] PATCH request, with the specified [url] as Url and + * an optional [block] receiving an [HttpRequestBuilder] for further configuring the request. + * + * Tries to receive a specific type [T], if fails, an exception is thrown. + */ +suspend inline fun HttpClient.patch( + url: Url, + block: HttpRequestBuilder.() -> Unit = {} +): T = patch { + this.url.takeFrom(url) + block() +} + +/** + * Executes a [HttpClient] OPTIONS request, with the specified [url] as Url and + * an optional [block] receiving an [HttpRequestBuilder] for further configuring the request. + * + * Tries to receive a specific type [T], if fails, an exception is thrown. + */ +suspend inline fun HttpClient.options( + url: Url, + block: HttpRequestBuilder.() -> Unit = {} +): T = options { + this.url.takeFrom(url) + block() +} + +/** + * Executes a [HttpClient] HEAD request, with the specified [url] as Url and + * an optional [block] receiving an [HttpRequestBuilder] for further configuring the request. + * + * Tries to receive a specific type [T], if fails, an exception is thrown. + */ +suspend inline fun HttpClient.head( + url: Url, + block: HttpRequestBuilder.() -> Unit = {} +): T = head { + this.url.takeFrom(url) + block() +} + +/** + * Executes a [HttpClient] HEAD request, with the specified [url] as Url and + * an optional [block] receiving an [HttpRequestBuilder] for further configuring the request. + * + * Tries to receive a specific type [T], if fails, an exception is thrown. + */ +suspend inline fun HttpClient.delete( + url: Url, + block: HttpRequestBuilder.() -> Unit = {} +): T = delete { + this.url.takeFrom(url) + block() +} + +/** + * Sets the [HttpRequestBuilder.url] from [url]. + */ +fun HttpRequestBuilder.url(url: Url): Unit { + this.url.takeFrom(url) +} diff --git a/ktor-client/ktor-client-core/src/io/ktor/client/request/forms/FormDataContent.kt b/ktor-client/ktor-client-core/common/src/io/ktor/client/request/forms/FormDataContent.kt similarity index 100% rename from ktor-client/ktor-client-core/src/io/ktor/client/request/forms/FormDataContent.kt rename to ktor-client/ktor-client-core/common/src/io/ktor/client/request/forms/FormDataContent.kt diff --git a/ktor-client/ktor-client-core/src/io/ktor/client/request/forms/formBuilders.kt b/ktor-client/ktor-client-core/common/src/io/ktor/client/request/forms/formBuilders.kt similarity index 100% rename from ktor-client/ktor-client-core/src/io/ktor/client/request/forms/formBuilders.kt rename to ktor-client/ktor-client-core/common/src/io/ktor/client/request/forms/formBuilders.kt diff --git a/ktor-client/ktor-client-core/src/io/ktor/client/request/forms/formDsl.kt b/ktor-client/ktor-client-core/common/src/io/ktor/client/request/forms/formDsl.kt similarity index 100% rename from ktor-client/ktor-client-core/src/io/ktor/client/request/forms/formDsl.kt rename to ktor-client/ktor-client-core/common/src/io/ktor/client/request/forms/formDsl.kt diff --git a/ktor-client/ktor-client-core/src/io/ktor/client/request/utils.kt b/ktor-client/ktor-client-core/common/src/io/ktor/client/request/utils.kt similarity index 100% rename from ktor-client/ktor-client-core/src/io/ktor/client/request/utils.kt rename to ktor-client/ktor-client-core/common/src/io/ktor/client/request/utils.kt diff --git a/ktor-client/ktor-client-core/src/io/ktor/client/response/HttpResponse.kt b/ktor-client/ktor-client-core/common/src/io/ktor/client/response/HttpResponse.kt similarity index 100% rename from ktor-client/ktor-client-core/src/io/ktor/client/response/HttpResponse.kt rename to ktor-client/ktor-client-core/common/src/io/ktor/client/response/HttpResponse.kt diff --git a/ktor-client/ktor-client-core/src/io/ktor/client/response/HttpResponseConfig.kt b/ktor-client/ktor-client-core/common/src/io/ktor/client/response/HttpResponseConfig.kt similarity index 100% rename from ktor-client/ktor-client-core/src/io/ktor/client/response/HttpResponseConfig.kt rename to ktor-client/ktor-client-core/common/src/io/ktor/client/response/HttpResponseConfig.kt diff --git a/ktor-client/ktor-client-core/src/io/ktor/client/response/HttpResponsePipeline.kt b/ktor-client/ktor-client-core/common/src/io/ktor/client/response/HttpResponsePipeline.kt similarity index 100% rename from ktor-client/ktor-client-core/src/io/ktor/client/response/HttpResponsePipeline.kt rename to ktor-client/ktor-client-core/common/src/io/ktor/client/response/HttpResponsePipeline.kt diff --git a/ktor-client/ktor-client-core/src/io/ktor/client/response/readers.kt b/ktor-client/ktor-client-core/common/src/io/ktor/client/response/readers.kt similarity index 100% rename from ktor-client/ktor-client-core/src/io/ktor/client/response/readers.kt rename to ktor-client/ktor-client-core/common/src/io/ktor/client/response/readers.kt diff --git a/ktor-client/ktor-client-core/src/io/ktor/client/utils/CIO.kt b/ktor-client/ktor-client-core/common/src/io/ktor/client/utils/CIO.kt similarity index 100% rename from ktor-client/ktor-client-core/src/io/ktor/client/utils/CIO.kt rename to ktor-client/ktor-client-core/common/src/io/ktor/client/utils/CIO.kt diff --git a/ktor-client/ktor-client-core/src/io/ktor/client/utils/Content.kt b/ktor-client/ktor-client-core/common/src/io/ktor/client/utils/Content.kt similarity index 100% rename from ktor-client/ktor-client-core/src/io/ktor/client/utils/Content.kt rename to ktor-client/ktor-client-core/common/src/io/ktor/client/utils/Content.kt diff --git a/ktor-client/ktor-client-core/src/io/ktor/client/utils/HttpCacheControl.kt b/ktor-client/ktor-client-core/common/src/io/ktor/client/utils/HttpCacheControl.kt similarity index 100% rename from ktor-client/ktor-client-core/src/io/ktor/client/utils/HttpCacheControl.kt rename to ktor-client/ktor-client-core/common/src/io/ktor/client/utils/HttpCacheControl.kt diff --git a/ktor-client/ktor-client-core/src/io/ktor/client/utils/headers.kt b/ktor-client/ktor-client-core/common/src/io/ktor/client/utils/headers.kt similarity index 100% rename from ktor-client/ktor-client-core/src/io/ktor/client/utils/headers.kt rename to ktor-client/ktor-client-core/common/src/io/ktor/client/utils/headers.kt diff --git a/ktor-client/ktor-client-core/test/TypeInfoTest.kt b/ktor-client/ktor-client-core/common/test/TypeInfoTest.kt similarity index 100% rename from ktor-client/ktor-client-core/test/TypeInfoTest.kt rename to ktor-client/ktor-client-core/common/test/TypeInfoTest.kt diff --git a/ktor-client/ktor-client-core/js/src/io/ktor/client/HttpClientJs.kt b/ktor-client/ktor-client-core/js/src/io/ktor/client/HttpClientJs.kt new file mode 100644 index 0000000000..8d067c1df3 --- /dev/null +++ b/ktor-client/ktor-client-core/js/src/io/ktor/client/HttpClientJs.kt @@ -0,0 +1,13 @@ +package io.ktor.client + +import io.ktor.client.engine.js.* + +/** + * Constructs an asynchronous [HttpClient] using optional [block] for configuring this client. + * + * The [HttpClientEngine] is selected from the dependencies. + * https://ktor.io/clients/http-client/engines.html + */ +actual fun HttpClient( + block: HttpClientConfig<*>.() -> Unit +): HttpClient = HttpClient(JsClient(), block) diff --git a/ktor-client/ktor-client-core/ktor-client-core-js/src/io/ktor/client/call/TypeInfoJs.kt b/ktor-client/ktor-client-core/js/src/io/ktor/client/call/TypeInfoJs.kt similarity index 100% rename from ktor-client/ktor-client-core/ktor-client-core-js/src/io/ktor/client/call/TypeInfoJs.kt rename to ktor-client/ktor-client-core/js/src/io/ktor/client/call/TypeInfoJs.kt diff --git a/ktor-client/ktor-client-core/ktor-client-core-js/src/io/ktor/client/engine/js/Js.kt b/ktor-client/ktor-client-core/js/src/io/ktor/client/engine/js/Js.kt similarity index 100% rename from ktor-client/ktor-client-core/ktor-client-core-js/src/io/ktor/client/engine/js/Js.kt rename to ktor-client/ktor-client-core/js/src/io/ktor/client/engine/js/Js.kt diff --git a/ktor-client/ktor-client-core/ktor-client-core-js/src/io/ktor/client/engine/js/JsClientEngine.kt b/ktor-client/ktor-client-core/js/src/io/ktor/client/engine/js/JsClientEngine.kt similarity index 100% rename from ktor-client/ktor-client-core/ktor-client-core-js/src/io/ktor/client/engine/js/JsClientEngine.kt rename to ktor-client/ktor-client-core/js/src/io/ktor/client/engine/js/JsClientEngine.kt diff --git a/ktor-client/ktor-client-core/ktor-client-core-js/src/io/ktor/client/engine/js/JsHttpResponse.kt b/ktor-client/ktor-client-core/js/src/io/ktor/client/engine/js/JsHttpResponse.kt similarity index 100% rename from ktor-client/ktor-client-core/ktor-client-core-js/src/io/ktor/client/engine/js/JsHttpResponse.kt rename to ktor-client/ktor-client-core/js/src/io/ktor/client/engine/js/JsHttpResponse.kt diff --git a/ktor-client/ktor-client-core/ktor-client-core-js/src/io/ktor/client/engine/js/JsUtils.kt b/ktor-client/ktor-client-core/js/src/io/ktor/client/engine/js/JsUtils.kt similarity index 100% rename from ktor-client/ktor-client-core/ktor-client-core-js/src/io/ktor/client/engine/js/JsUtils.kt rename to ktor-client/ktor-client-core/js/src/io/ktor/client/engine/js/JsUtils.kt diff --git a/ktor-client/ktor-client-core/ktor-client-core-js/src/io/ktor/client/engine/js/ReadableStream.kt b/ktor-client/ktor-client-core/js/src/io/ktor/client/engine/js/ReadableStream.kt similarity index 100% rename from ktor-client/ktor-client-core/ktor-client-core-js/src/io/ktor/client/engine/js/ReadableStream.kt rename to ktor-client/ktor-client-core/js/src/io/ktor/client/engine/js/ReadableStream.kt diff --git a/ktor-client/ktor-client-core/ktor-client-core-js/src/io/ktor/client/engine/js/compatible/Utils.kt b/ktor-client/ktor-client-core/js/src/io/ktor/client/engine/js/compatible/Utils.kt similarity index 100% rename from ktor-client/ktor-client-core/ktor-client-core-js/src/io/ktor/client/engine/js/compatible/Utils.kt rename to ktor-client/ktor-client-core/js/src/io/ktor/client/engine/js/compatible/Utils.kt diff --git a/ktor-client/ktor-client-core/ktor-client-core-js/src/io/ktor/client/engine/js/compatible/browser/BrowserUtils.kt b/ktor-client/ktor-client-core/js/src/io/ktor/client/engine/js/compatible/browser/BrowserUtils.kt similarity index 100% rename from ktor-client/ktor-client-core/ktor-client-core-js/src/io/ktor/client/engine/js/compatible/browser/BrowserUtils.kt rename to ktor-client/ktor-client-core/js/src/io/ktor/client/engine/js/compatible/browser/BrowserUtils.kt diff --git a/ktor-client/ktor-client-core/ktor-client-core-js/src/io/ktor/client/engine/js/compatible/node/NodeUtils.kt b/ktor-client/ktor-client-core/js/src/io/ktor/client/engine/js/compatible/node/NodeUtils.kt similarity index 100% rename from ktor-client/ktor-client-core/ktor-client-core-js/src/io/ktor/client/engine/js/compatible/node/NodeUtils.kt rename to ktor-client/ktor-client-core/js/src/io/ktor/client/engine/js/compatible/node/NodeUtils.kt diff --git a/ktor-client/ktor-client-core/ktor-client-core-js/src/io/ktor/client/features/DefaultTransformJs.kt b/ktor-client/ktor-client-core/js/src/io/ktor/client/features/DefaultTransformJs.kt similarity index 100% rename from ktor-client/ktor-client-core/ktor-client-core-js/src/io/ktor/client/features/DefaultTransformJs.kt rename to ktor-client/ktor-client-core/js/src/io/ktor/client/features/DefaultTransformJs.kt diff --git a/ktor-client/ktor-client-core/ktor-client-core-jvm/src/io/ktor/client/HttpClientJvm.kt b/ktor-client/ktor-client-core/jvm/src/io/ktor/client/HttpClientJvm.kt similarity index 71% rename from ktor-client/ktor-client-core/ktor-client-core-jvm/src/io/ktor/client/HttpClientJvm.kt rename to ktor-client/ktor-client-core/jvm/src/io/ktor/client/HttpClientJvm.kt index 5f56b8db3f..5e2cbf71fe 100644 --- a/ktor-client/ktor-client-core/ktor-client-core-jvm/src/io/ktor/client/HttpClientJvm.kt +++ b/ktor-client/ktor-client-core/jvm/src/io/ktor/client/HttpClientJvm.kt @@ -3,7 +3,12 @@ package io.ktor.client import io.ktor.client.engine.* import java.util.* - +/** + * Constructs an asynchronous [HttpClient] using optional [block] for configuring this client. + * + * The [HttpClientEngine] is selected from the dependencies. + * https://ktor.io/clients/http-client/engines.html + */ actual fun HttpClient( block: HttpClientConfig<*>.() -> Unit ): HttpClient = HttpClient(FACTORY, block) @@ -20,4 +25,4 @@ private val engines: List = HttpClientEngineContainer } private val FACTORY = engines.firstOrNull()?.factory - ?: error("Failed to find HttpClientEngineContainer in classpath via ServiceLoader") \ No newline at end of file + ?: error("Failed to find HttpClientEngineContainer in classpath via ServiceLoader") diff --git a/ktor-client/ktor-client-core/ktor-client-core-jvm/src/io/ktor/client/call/TypeInfoJvm.kt b/ktor-client/ktor-client-core/jvm/src/io/ktor/client/call/TypeInfoJvm.kt similarity index 100% rename from ktor-client/ktor-client-core/ktor-client-core-jvm/src/io/ktor/client/call/TypeInfoJvm.kt rename to ktor-client/ktor-client-core/jvm/src/io/ktor/client/call/TypeInfoJvm.kt diff --git a/ktor-client/ktor-client-core/ktor-client-core-jvm/src/io/ktor/client/call/utilsJvm.kt b/ktor-client/ktor-client-core/jvm/src/io/ktor/client/call/utilsJvm.kt similarity index 100% rename from ktor-client/ktor-client-core/ktor-client-core-jvm/src/io/ktor/client/call/utilsJvm.kt rename to ktor-client/ktor-client-core/jvm/src/io/ktor/client/call/utilsJvm.kt diff --git a/ktor-client/ktor-client-core/ktor-client-core-jvm/src/io/ktor/client/engine/HttpClientJvmEngine.kt b/ktor-client/ktor-client-core/jvm/src/io/ktor/client/engine/HttpClientJvmEngine.kt similarity index 100% rename from ktor-client/ktor-client-core/ktor-client-core-jvm/src/io/ktor/client/engine/HttpClientJvmEngine.kt rename to ktor-client/ktor-client-core/jvm/src/io/ktor/client/engine/HttpClientJvmEngine.kt diff --git a/ktor-client/ktor-client-core/ktor-client-core-jvm/src/io/ktor/client/features/DefaultTransformersJvm.kt b/ktor-client/ktor-client-core/jvm/src/io/ktor/client/features/DefaultTransformersJvm.kt similarity index 100% rename from ktor-client/ktor-client-core/ktor-client-core-jvm/src/io/ktor/client/features/DefaultTransformersJvm.kt rename to ktor-client/ktor-client-core/jvm/src/io/ktor/client/features/DefaultTransformersJvm.kt diff --git a/ktor-client/ktor-client-core/ktor-client-core-jvm/src/io/ktor/client/request/HttpRequestJvm.kt b/ktor-client/ktor-client-core/jvm/src/io/ktor/client/request/HttpRequestJvm.kt similarity index 100% rename from ktor-client/ktor-client-core/ktor-client-core-jvm/src/io/ktor/client/request/HttpRequestJvm.kt rename to ktor-client/ktor-client-core/jvm/src/io/ktor/client/request/HttpRequestJvm.kt diff --git a/ktor-client/ktor-client-core/ktor-client-core-jvm/src/io/ktor/client/request/buildersJvm.kt b/ktor-client/ktor-client-core/jvm/src/io/ktor/client/request/buildersJvm.kt similarity index 100% rename from ktor-client/ktor-client-core/ktor-client-core-jvm/src/io/ktor/client/request/buildersJvm.kt rename to ktor-client/ktor-client-core/jvm/src/io/ktor/client/request/buildersJvm.kt diff --git a/ktor-client/ktor-client-core/ktor-client-core-jvm/src/io/ktor/client/utils/CIOJvm.kt b/ktor-client/ktor-client-core/jvm/src/io/ktor/client/utils/CIOJvm.kt similarity index 100% rename from ktor-client/ktor-client-core/ktor-client-core-jvm/src/io/ktor/client/utils/CIOJvm.kt rename to ktor-client/ktor-client-core/jvm/src/io/ktor/client/utils/CIOJvm.kt diff --git a/ktor-client/ktor-client-core/ktor-client-core-jvm/test/CookiesTest.kt b/ktor-client/ktor-client-core/jvm/test/CookiesTest.kt similarity index 100% rename from ktor-client/ktor-client-core/ktor-client-core-jvm/test/CookiesTest.kt rename to ktor-client/ktor-client-core/jvm/test/CookiesTest.kt diff --git a/ktor-client/ktor-client-core/ktor-client-core-jvm/test/TypeInfoTestJvm.kt b/ktor-client/ktor-client-core/jvm/test/TypeInfoTestJvm.kt similarity index 100% rename from ktor-client/ktor-client-core/ktor-client-core-jvm/test/TypeInfoTestJvm.kt rename to ktor-client/ktor-client-core/jvm/test/TypeInfoTestJvm.kt diff --git a/ktor-client/ktor-client-core/ktor-client-core-jvm/test/UserAgentTest.kt b/ktor-client/ktor-client-core/jvm/test/UserAgentTest.kt similarity index 100% rename from ktor-client/ktor-client-core/ktor-client-core-jvm/test/UserAgentTest.kt rename to ktor-client/ktor-client-core/jvm/test/UserAgentTest.kt diff --git a/ktor-client/ktor-client-core/ktor-client-core-ios/build.gradle b/ktor-client/ktor-client-core/ktor-client-core-ios/build.gradle deleted file mode 100644 index f63623b9cb..0000000000 --- a/ktor-client/ktor-client-core/ktor-client-core-ios/build.gradle +++ /dev/null @@ -1,6 +0,0 @@ - -dependencies { - expectedBy project(':ktor-client:ktor-client-core') - - implementation project(':ktor-http:ktor-http-ios') -} diff --git a/ktor-client/ktor-client-core/ktor-client-core-ios/src/io/ktor/client/HttpClientIos.kt b/ktor-client/ktor-client-core/ktor-client-core-ios/src/io/ktor/client/HttpClientIos.kt deleted file mode 100644 index 359e06c174..0000000000 --- a/ktor-client/ktor-client-core/ktor-client-core-ios/src/io/ktor/client/HttpClientIos.kt +++ /dev/null @@ -1,7 +0,0 @@ -package io.ktor.client - -import io.ktor.client.engine.ios.* - -actual fun HttpClient( - block: HttpClientConfig<*>.() -> Unit -): HttpClient = HttpClient(IosClient(), block) diff --git a/ktor-client/ktor-client-core/ktor-client-core-ios/src/io/ktor/client/engine/ios/Ios.kt b/ktor-client/ktor-client-core/ktor-client-core-ios/src/io/ktor/client/engine/ios/Ios.kt deleted file mode 100644 index 22d436254b..0000000000 --- a/ktor-client/ktor-client-core/ktor-client-core-ios/src/io/ktor/client/engine/ios/Ios.kt +++ /dev/null @@ -1,5 +0,0 @@ -package io.ktor.client.engine.ios - -import io.ktor.client.engine.* - -external fun IosClient(): HttpClientEngineFactory diff --git a/ktor-client/ktor-client-core/ktor-client-core-js/build.gradle b/ktor-client/ktor-client-core/ktor-client-core-js/build.gradle deleted file mode 100644 index 030af72177..0000000000 --- a/ktor-client/ktor-client-core/ktor-client-core-js/build.gradle +++ /dev/null @@ -1,9 +0,0 @@ - -apply plugin: 'kotlinx-serialization' - -dependencies { - expectedBy project(':ktor-client:ktor-client-core') - - compile project(':ktor-http:ktor-http-js') - compile project(":ktor-utils:ktor-utils-js") -} diff --git a/ktor-client/ktor-client-core/ktor-client-core-js/src/io/ktor/client/HttpClientJs.kt b/ktor-client/ktor-client-core/ktor-client-core-js/src/io/ktor/client/HttpClientJs.kt deleted file mode 100644 index 1d44a0b8cd..0000000000 --- a/ktor-client/ktor-client-core/ktor-client-core-js/src/io/ktor/client/HttpClientJs.kt +++ /dev/null @@ -1,7 +0,0 @@ -package io.ktor.client - -import io.ktor.client.engine.js.* - -actual fun HttpClient( - block: HttpClientConfig<*>.() -> Unit -): HttpClient = HttpClient(JsClient(), block) diff --git a/ktor-client/ktor-client-core/ktor-client-core-jvm/build.gradle b/ktor-client/ktor-client-core/ktor-client-core-jvm/build.gradle deleted file mode 100644 index f333fa795e..0000000000 --- a/ktor-client/ktor-client-core/ktor-client-core-jvm/build.gradle +++ /dev/null @@ -1,11 +0,0 @@ - -dependencies { - expectedBy project(":ktor-client:ktor-client-core") - - compile project(":ktor-http:ktor-http-cio") - compile project(":ktor-http:ktor-http-jvm") - compile project(":ktor-utils:ktor-utils-jvm") - - testCompile project(":ktor-client:ktor-client-mock:ktor-client-mock-jvm") - testCompile project(":ktor-client:ktor-client-tests") -} diff --git a/ktor-client/ktor-client-core/posix/src/io/ktor/client/HttpClient.kt b/ktor-client/ktor-client-core/posix/src/io/ktor/client/HttpClient.kt new file mode 100644 index 0000000000..946ca2e456 --- /dev/null +++ b/ktor-client/ktor-client-core/posix/src/io/ktor/client/HttpClient.kt @@ -0,0 +1,17 @@ +package io.ktor.client + +import io.ktor.client.engine.* + +/** + * Constructs an asynchronous [HttpClient] using optional [block] for configuring this client. + * + * The [HttpClientEngine] is selected from the dependencies. + * https://ktor.io/clients/http-client/engines.html + */ +@HttpClientDsl +actual fun HttpClient( + block: HttpClientConfig<*>.() -> Unit +): HttpClient = engines.firstOrNull()?.let { HttpClient(it, block) } + ?: error( + "Failed to find HttpClientEngineContainer. Consider adding [HttpClientEngine] implementation in dependencies." + ) diff --git a/ktor-client/ktor-client-core/ktor-client-core-ios/src/io/ktor/client/call/TypeInfoIos.kt b/ktor-client/ktor-client-core/posix/src/io/ktor/client/call/TypeInfoIos.kt similarity index 100% rename from ktor-client/ktor-client-core/ktor-client-core-ios/src/io/ktor/client/call/TypeInfoIos.kt rename to ktor-client/ktor-client-core/posix/src/io/ktor/client/call/TypeInfoIos.kt diff --git a/ktor-client/ktor-client-core/posix/src/io/ktor/client/engine/Loader.kt b/ktor-client/ktor-client-core/posix/src/io/ktor/client/engine/Loader.kt new file mode 100644 index 0000000000..1c43b51d64 --- /dev/null +++ b/ktor-client/ktor-client-core/posix/src/io/ktor/client/engine/Loader.kt @@ -0,0 +1,10 @@ +package io.ktor.client.engine + +import io.ktor.util.* + +@InternalAPI +@Suppress("KDocMissingDocumentation") +@ThreadLocal +val engines: MutableList> by lazy { + mutableListOf>() +} diff --git a/ktor-client/ktor-client-core/ktor-client-core-ios/src/io/ktor/client/features/DefaultTransformIos.kt b/ktor-client/ktor-client-core/posix/src/io/ktor/client/features/DefaultTransformIos.kt similarity index 100% rename from ktor-client/ktor-client-core/ktor-client-core-ios/src/io/ktor/client/features/DefaultTransformIos.kt rename to ktor-client/ktor-client-core/posix/src/io/ktor/client/features/DefaultTransformIos.kt diff --git a/ktor-client/ktor-client-features/build.gradle b/ktor-client/ktor-client-features/build.gradle index 377f95a96e..85c33d6af2 100644 --- a/ktor-client/ktor-client-features/build.gradle +++ b/ktor-client/ktor-client-features/build.gradle @@ -1,7 +1,5 @@ -description = "Ktor client features" +description = 'Ktor client features' -apply plugin: 'kotlinx-serialization' - -dependencies { - compile project(":ktor-client:ktor-client-core:ktor-client-core-jvm") +kotlin.sourceSets.commonMain.dependencies { + api project(':ktor-client:ktor-client-core') } diff --git a/ktor-client/ktor-client-features/jvm/.gitkeep b/ktor-client/ktor-client-features/jvm/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ktor-client/ktor-client-features/ktor-client-auth-basic/build.gradle b/ktor-client/ktor-client-features/ktor-client-auth-basic/build.gradle index 80785633be..6694353c9d 100644 --- a/ktor-client/ktor-client-features/ktor-client-auth-basic/build.gradle +++ b/ktor-client/ktor-client-features/ktor-client-auth-basic/build.gradle @@ -1,8 +1,13 @@ -description = "Ktor client Basic Auth support" +description = 'Ktor client Basic Auth support' -dependencies { - compile project(':ktor-client:ktor-client-core:ktor-client-core-jvm') +project.ext.set("commonStructure", false) - testCompile project(':ktor-client:ktor-client-cio') - testCompile project(':ktor-client:ktor-client-tests') -} \ No newline at end of file +kotlin.sourceSets { + commonMain.dependencies { + api project(':ktor-client:ktor-client-core') + } + jvmTest.dependencies { + api project(':ktor-client:ktor-client-cio') + api project(':ktor-client:ktor-client-tests') + } +} diff --git a/ktor-client/ktor-client-features/ktor-client-auth-basic/src/io/ktor/client/features/auth/basic/BasicAuth.kt b/ktor-client/ktor-client-features/ktor-client-auth-basic/common/src/io/ktor/client/features/auth/basic/BasicAuth.kt similarity index 91% rename from ktor-client/ktor-client-features/ktor-client-auth-basic/src/io/ktor/client/features/auth/basic/BasicAuth.kt rename to ktor-client/ktor-client-features/ktor-client-auth-basic/common/src/io/ktor/client/features/auth/basic/BasicAuth.kt index 9922d4f129..02a8b32433 100644 --- a/ktor-client/ktor-client-features/ktor-client-auth-basic/src/io/ktor/client/features/auth/basic/BasicAuth.kt +++ b/ktor-client/ktor-client-features/ktor-client-auth-basic/common/src/io/ktor/client/features/auth/basic/BasicAuth.kt @@ -12,8 +12,6 @@ import io.ktor.util.* * * https://www.ietf.org/rfc/rfc2617.txt */ - -@Deprecated("Use `ktor-client-auth` basic auth provider instead") class BasicAuth(val username: String, val password: String) { class Configuration { @@ -45,7 +43,7 @@ class BasicAuth(val username: String, val password: String) { fun constructBasicAuthValue(username: String, password: String): String { val authString = "$username:$password" - val authBuf = encodeBase64(authString.toByteArray(Charsets.ISO_8859_1)) + val authBuf = authString.encodeBase64() return "Basic $authBuf" } diff --git a/ktor-client/ktor-client-features/ktor-client-auth-basic/test/io/ktor/client/features/auth/basic/BasicAuthTest.kt b/ktor-client/ktor-client-features/ktor-client-auth-basic/common/test/io/ktor/client/features/auth/basic/BasicAuthTest.kt similarity index 87% rename from ktor-client/ktor-client-features/ktor-client-auth-basic/test/io/ktor/client/features/auth/basic/BasicAuthTest.kt rename to ktor-client/ktor-client-features/ktor-client-auth-basic/common/test/io/ktor/client/features/auth/basic/BasicAuthTest.kt index 7da964cae9..17100a6699 100644 --- a/ktor-client/ktor-client-features/ktor-client-auth-basic/test/io/ktor/client/features/auth/basic/BasicAuthTest.kt +++ b/ktor-client/ktor-client-features/ktor-client-auth-basic/common/test/io/ktor/client/features/auth/basic/BasicAuthTest.kt @@ -1,6 +1,5 @@ package io.ktor.client.features.auth.basic -import org.junit.Test import kotlin.test.* class BasicAuthTest { @@ -18,7 +17,7 @@ class BasicAuthTest { ) assertEquals( - "Basic VW1sYXV0ZcT89jphJlNlY3JldCUhMjM=", + "Basic VW1sYXV0ZcOEw7zDtjphJlNlY3JldCUhMjM=", BasicAuth.constructBasicAuthValue("UmlauteÄüö", "a&Secret%!23") ) } diff --git a/ktor-client/ktor-client-features/ktor-client-auth-basic/test/io/ktor/client/features/auth/basic/BasicAuthTestWithServer.kt b/ktor-client/ktor-client-features/ktor-client-auth-basic/jvm/test/BasicAuthTestWithServer.kt similarity index 100% rename from ktor-client/ktor-client-features/ktor-client-auth-basic/test/io/ktor/client/features/auth/basic/BasicAuthTestWithServer.kt rename to ktor-client/ktor-client-features/ktor-client-auth-basic/jvm/test/BasicAuthTestWithServer.kt diff --git a/ktor-client/ktor-client-features/ktor-client-auth/build.gradle b/ktor-client/ktor-client-features/ktor-client-auth/build.gradle index 6286edc673..4df7edcabe 100644 --- a/ktor-client/ktor-client-features/ktor-client-auth/build.gradle +++ b/ktor-client/ktor-client-features/ktor-client-auth/build.gradle @@ -1,10 +1,13 @@ description = "Ktor client Basic Auth support" -dependencies { - compile project(':ktor-client:ktor-client-core:ktor-client-core-jvm') - - testCompile project(':ktor-features:ktor-auth') - testCompile project(':ktor-client:ktor-client-cio') - testCompile project(':ktor-client:ktor-client-tests') - testCompile project(':ktor-server:ktor-server-cio') +kotlin.sourceSets { + commonMain.dependencies { + api project(':ktor-client:ktor-client-core') + } + jvmTest.dependencies { + api project(':ktor-features:ktor-auth') + api project(':ktor-client:ktor-client-cio') + api project(':ktor-client:ktor-client-tests') + api project(':ktor-server:ktor-server-cio') + } } diff --git a/ktor-client/ktor-client-features/ktor-client-auth/src/io/ktor/client/features/auth/Auth.kt b/ktor-client/ktor-client-features/ktor-client-auth/jvm/src/io/ktor/client/features/auth/Auth.kt similarity index 100% rename from ktor-client/ktor-client-features/ktor-client-auth/src/io/ktor/client/features/auth/Auth.kt rename to ktor-client/ktor-client-features/ktor-client-auth/jvm/src/io/ktor/client/features/auth/Auth.kt diff --git a/ktor-client/ktor-client-features/ktor-client-auth/src/io/ktor/client/features/auth/providers/BasicAuthProvider.kt b/ktor-client/ktor-client-features/ktor-client-auth/jvm/src/io/ktor/client/features/auth/providers/BasicAuthProvider.kt similarity index 100% rename from ktor-client/ktor-client-features/ktor-client-auth/src/io/ktor/client/features/auth/providers/BasicAuthProvider.kt rename to ktor-client/ktor-client-features/ktor-client-auth/jvm/src/io/ktor/client/features/auth/providers/BasicAuthProvider.kt diff --git a/ktor-client/ktor-client-features/ktor-client-auth/src/io/ktor/client/features/auth/providers/DigestAuthProvider.kt b/ktor-client/ktor-client-features/ktor-client-auth/jvm/src/io/ktor/client/features/auth/providers/DigestAuthProvider.kt similarity index 96% rename from ktor-client/ktor-client-features/ktor-client-auth/src/io/ktor/client/features/auth/providers/DigestAuthProvider.kt rename to ktor-client/ktor-client-features/ktor-client-auth/jvm/src/io/ktor/client/features/auth/providers/DigestAuthProvider.kt index 67112371d2..bbee717410 100644 --- a/ktor-client/ktor-client-features/ktor-client-auth/src/io/ktor/client/features/auth/providers/DigestAuthProvider.kt +++ b/ktor-client/ktor-client-features/ktor-client-auth/jvm/src/io/ktor/client/features/auth/providers/DigestAuthProvider.kt @@ -6,6 +6,8 @@ import io.ktor.http.* import io.ktor.http.auth.* import io.ktor.util.* import kotlinx.atomicfu.* +import kotlinx.io.charsets.* +import kotlinx.io.core.* /** * Install client [DigestAuthProvider]. @@ -97,6 +99,6 @@ class DigestAuthProvider( private val lock = Lock() private suspend fun makeDigest(data: String): ByteArray = lock.use { digest.reset() - return@use digest.build(data.toByteArray(Charsets.ISO_8859_1)) + return@use digest.build(data.toByteArray(Charsets.UTF_8)) } } diff --git a/ktor-client/ktor-client-features/ktor-client-auth/test/DigestTest.kt b/ktor-client/ktor-client-features/ktor-client-auth/jvm/test/DigestTest.kt similarity index 100% rename from ktor-client/ktor-client-features/ktor-client-auth/test/DigestTest.kt rename to ktor-client/ktor-client-features/ktor-client-auth/jvm/test/DigestTest.kt diff --git a/ktor-client/ktor-client-features/ktor-client-json/build.gradle b/ktor-client/ktor-client-features/ktor-client-json/build.gradle index ff600fd285..fedae4172d 100644 --- a/ktor-client/ktor-client-features/ktor-client-json/build.gradle +++ b/ktor-client/ktor-client-features/ktor-client-json/build.gradle @@ -1,9 +1,25 @@ description = "Ktor client JSON support" -apply plugin: 'kotlinx-serialization' +apply plugin: "kotlinx-serialization" -dependencies { - compile "org.jetbrains.kotlinx:kotlinx-serialization-runtime-common:$serialization_version" - - compile project(':ktor-client:ktor-client-core') +kotlin { + sourceSets { + commonMain.dependencies { + api "org.jetbrains.kotlinx:kotlinx-serialization-runtime-common:$serialization_version" + api project(':ktor-client:ktor-client-core') + } + jvmMain.dependencies { + api project(':ktor-client:ktor-client-tests') + api "org.jetbrains.kotlinx:kotlinx-serialization-runtime:$serialization_version" + } + jsMain.dependencies { + api "org.jetbrains.kotlinx:kotlinx-serialization-runtime-js:$serialization_version" + } + jsTest.dependencies { + api project(":ktor-client:ktor-client-js") + } + posixMain.dependencies { + api "org.jetbrains.kotlinx:kotlinx-serialization-runtime-native:$serialization_version" + } + } } diff --git a/ktor-client/ktor-client-features/ktor-client-json/src/io/ktor/client/features/json/JsonFeature.kt b/ktor-client/ktor-client-features/ktor-client-json/common/src/io/ktor/client/features/json/JsonFeature.kt similarity index 100% rename from ktor-client/ktor-client-features/ktor-client-json/src/io/ktor/client/features/json/JsonFeature.kt rename to ktor-client/ktor-client-features/ktor-client-json/common/src/io/ktor/client/features/json/JsonFeature.kt diff --git a/ktor-client/ktor-client-features/ktor-client-json/src/io/ktor/client/features/json/JsonSerializer.kt b/ktor-client/ktor-client-features/ktor-client-json/common/src/io/ktor/client/features/json/JsonSerializer.kt similarity index 100% rename from ktor-client/ktor-client-features/ktor-client-json/src/io/ktor/client/features/json/JsonSerializer.kt rename to ktor-client/ktor-client-features/ktor-client-json/common/src/io/ktor/client/features/json/JsonSerializer.kt diff --git a/ktor-client/ktor-client-features/ktor-client-json/src/io/ktor/client/features/json/serializer/KotlinxSerializer.kt b/ktor-client/ktor-client-features/ktor-client-json/common/src/io/ktor/client/features/json/serializer/KotlinxSerializer.kt similarity index 100% rename from ktor-client/ktor-client-features/ktor-client-json/src/io/ktor/client/features/json/serializer/KotlinxSerializer.kt rename to ktor-client/ktor-client-features/ktor-client-json/common/src/io/ktor/client/features/json/serializer/KotlinxSerializer.kt diff --git a/ktor-client/ktor-client-features/ktor-client-json/test/KotlinxSerializerTest.kt b/ktor-client/ktor-client-features/ktor-client-json/common/test/KotlinxSerializerTest.kt similarity index 100% rename from ktor-client/ktor-client-features/ktor-client-json/test/KotlinxSerializerTest.kt rename to ktor-client/ktor-client-features/ktor-client-json/common/test/KotlinxSerializerTest.kt diff --git a/ktor-client/ktor-client-features/ktor-client-json/ktor-client-json-js/src/io/ktor/client/features/json/defaultSerializer.kt b/ktor-client/ktor-client-features/ktor-client-json/js/src/io/ktor/client/features/json/DefaultJs.kt similarity index 59% rename from ktor-client/ktor-client-features/ktor-client-json/ktor-client-json-js/src/io/ktor/client/features/json/defaultSerializer.kt rename to ktor-client/ktor-client-features/ktor-client-json/js/src/io/ktor/client/features/json/DefaultJs.kt index c3528f2519..73480c62ca 100644 --- a/ktor-client/ktor-client-features/ktor-client-json/ktor-client-json-js/src/io/ktor/client/features/json/defaultSerializer.kt +++ b/ktor-client/ktor-client-features/ktor-client-json/js/src/io/ktor/client/features/json/DefaultJs.kt @@ -2,12 +2,8 @@ package io.ktor.client.features.json import io.ktor.client.features.json.serializer.* + /** * Platform default serializer. - * - * Uses service loader on jvm. - * Consider to add one of the following dependencies: - * - ktor-client-gson - * - ktor-client-json */ actual fun defaultSerializer(): JsonSerializer = KotlinxSerializer() diff --git a/ktor-client/ktor-client-js/test/io/ktor/client/engine/js/test/JsClientTests.kt b/ktor-client/ktor-client-features/ktor-client-json/js/test/JsSerializerTest.kt similarity index 100% rename from ktor-client/ktor-client-js/test/io/ktor/client/engine/js/test/JsClientTests.kt rename to ktor-client/ktor-client-features/ktor-client-json/js/test/JsSerializerTest.kt diff --git a/ktor-client/ktor-client-features/ktor-client-json/jvm/resources/META-INF/services/io.ktor.client.features.json.JsonSerializer b/ktor-client/ktor-client-features/ktor-client-json/jvm/resources/META-INF/services/io.ktor.client.features.json.JsonSerializer new file mode 100644 index 0000000000..d654efdf9e --- /dev/null +++ b/ktor-client/ktor-client-features/ktor-client-json/jvm/resources/META-INF/services/io.ktor.client.features.json.JsonSerializer @@ -0,0 +1 @@ +io.ktor.client.features.json.serializer.KotlinxSerializer diff --git a/ktor-client/ktor-client-features/ktor-client-json/ktor-client-json-jvm/src/io/ktor/client/features/json/DefaultJvm.kt b/ktor-client/ktor-client-features/ktor-client-json/jvm/src/io/ktor/client/features/json/DefaultJvm.kt similarity index 72% rename from ktor-client/ktor-client-features/ktor-client-json/ktor-client-json-jvm/src/io/ktor/client/features/json/DefaultJvm.kt rename to ktor-client/ktor-client-features/ktor-client-json/jvm/src/io/ktor/client/features/json/DefaultJvm.kt index 527eb57077..969ac947cd 100644 --- a/ktor-client/ktor-client-features/ktor-client-json/ktor-client-json-jvm/src/io/ktor/client/features/json/DefaultJvm.kt +++ b/ktor-client/ktor-client-features/ktor-client-json/jvm/src/io/ktor/client/features/json/DefaultJvm.kt @@ -3,11 +3,14 @@ package io.ktor.client.features.json import java.util.* actual fun defaultSerializer(): JsonSerializer { - val serializers = ServiceLoader.load(JsonSerializer::class.java).toList() + val serializers = ServiceLoader.load(JsonSerializer::class.java) + .toList() + .sortedBy { it.javaClass.name } + if (serializers.isEmpty()) error( "Fail to find serializer. Consider to add one of the following dependencies: \n" + - " - ktor-client-gson\n" + - " - ktor-client-json" + " - ktor-client-gson\n" + + " - ktor-client-json" ) return serializers.maxBy { it::class.simpleName!! }!! diff --git a/ktor-client/ktor-client-features/ktor-client-json/ktor-client-gson/build.gradle b/ktor-client/ktor-client-features/ktor-client-json/ktor-client-gson/build.gradle index 4e699636cd..e8246a5b19 100644 --- a/ktor-client/ktor-client-features/ktor-client-json/ktor-client-gson/build.gradle +++ b/ktor-client/ktor-client-features/ktor-client-json/ktor-client-gson/build.gradle @@ -1,9 +1,11 @@ -dependencies { - compile project(":ktor-client:ktor-client-features:ktor-client-json:ktor-client-json-jvm") - - compile group: 'com.google.code.gson', name: 'gson', version: gson_version - - testCompile project(':ktor-client:ktor-client-cio') - testCompile project(':ktor-client:ktor-client-features:ktor-client-json:ktor-client-json-tests') - testCompile project(':ktor-features:ktor-gson') +kotlin.sourceSets { + jvmMain.dependencies { + api project(':ktor-client:ktor-client-features:ktor-client-json') + api group: 'com.google.code.gson', name: 'gson', version: gson_version + } + jvmTest.dependencies { + api project(':ktor-client:ktor-client-cio') + api project(':ktor-client:ktor-client-features:ktor-client-json:ktor-client-json-tests') + api project(':ktor-features:ktor-gson') + } } diff --git a/ktor-client/ktor-client-features/ktor-client-json/ktor-client-gson/resources/META-INF/services/io.ktor.client.features.json.JsonSerializer b/ktor-client/ktor-client-features/ktor-client-json/ktor-client-gson/jvm/resources/META-INF/services/io.ktor.client.features.json.JsonSerializer similarity index 100% rename from ktor-client/ktor-client-features/ktor-client-json/ktor-client-gson/resources/META-INF/services/io.ktor.client.features.json.JsonSerializer rename to ktor-client/ktor-client-features/ktor-client-json/ktor-client-gson/jvm/resources/META-INF/services/io.ktor.client.features.json.JsonSerializer diff --git a/ktor-client/ktor-client-features/ktor-client-json/ktor-client-gson/src/io/ktor/client/features/json/GsonSerializer.kt b/ktor-client/ktor-client-features/ktor-client-json/ktor-client-gson/jvm/src/io/ktor/client/features/json/GsonSerializer.kt similarity index 100% rename from ktor-client/ktor-client-features/ktor-client-json/ktor-client-gson/src/io/ktor/client/features/json/GsonSerializer.kt rename to ktor-client/ktor-client-features/ktor-client-json/ktor-client-gson/jvm/src/io/ktor/client/features/json/GsonSerializer.kt diff --git a/ktor-client/ktor-client-features/ktor-client-json/ktor-client-gson/test/io/ktor/client/features/json/tests/GsonTest.kt b/ktor-client/ktor-client-features/ktor-client-json/ktor-client-gson/jvm/test/io/ktor/client/features/json/tests/GsonTest.kt similarity index 100% rename from ktor-client/ktor-client-features/ktor-client-json/ktor-client-gson/test/io/ktor/client/features/json/tests/GsonTest.kt rename to ktor-client/ktor-client-features/ktor-client-json/ktor-client-gson/jvm/test/io/ktor/client/features/json/tests/GsonTest.kt diff --git a/ktor-client/ktor-client-features/ktor-client-json/ktor-client-jackson/build.gradle b/ktor-client/ktor-client-features/ktor-client-json/ktor-client-jackson/build.gradle index 37fd736bf7..e9ccaec025 100644 --- a/ktor-client/ktor-client-features/ktor-client-json/ktor-client-jackson/build.gradle +++ b/ktor-client/ktor-client-features/ktor-client-json/ktor-client-jackson/build.gradle @@ -1,9 +1,12 @@ -dependencies { - compile group: 'com.fasterxml.jackson.module', name: 'jackson-module-kotlin', version: '2.9.2' - - compile project(":ktor-client:ktor-client-features:ktor-client-json:ktor-client-json-jvm") - - testCompile project(':ktor-client:ktor-client-cio') - testCompile project(':ktor-client:ktor-client-features:ktor-client-json:ktor-client-json-tests') - testCompile project(':ktor-features:ktor-gson') +kotlin.sourceSets { + jvmMain.dependencies { + api project(':ktor-client:ktor-client-features:ktor-client-json') + api group: 'com.fasterxml.jackson.module', name: 'jackson-module-kotlin', version: '2.9.2' + } + jvmTest.dependencies { + api project(':ktor-client:ktor-client-cio') + api project(':ktor-client:ktor-client-features:ktor-client-json:ktor-client-json-tests') + api project(':ktor-features:ktor-gson') + } } + diff --git a/ktor-client/ktor-client-features/ktor-client-json/ktor-client-jackson/resources/META-INF/services/io.ktor.client.features.json.JsonSerializer b/ktor-client/ktor-client-features/ktor-client-json/ktor-client-jackson/jvm/resources/META-INF/services/io.ktor.client.features.json.JsonSerializer similarity index 100% rename from ktor-client/ktor-client-features/ktor-client-json/ktor-client-jackson/resources/META-INF/services/io.ktor.client.features.json.JsonSerializer rename to ktor-client/ktor-client-features/ktor-client-json/ktor-client-jackson/jvm/resources/META-INF/services/io.ktor.client.features.json.JsonSerializer diff --git a/ktor-client/ktor-client-features/ktor-client-json/ktor-client-jackson/src/io/ktor/client/features/json/JacksonSerializer.kt b/ktor-client/ktor-client-features/ktor-client-json/ktor-client-jackson/jvm/src/io/ktor/client/features/json/JacksonSerializer.kt similarity index 100% rename from ktor-client/ktor-client-features/ktor-client-json/ktor-client-jackson/src/io/ktor/client/features/json/JacksonSerializer.kt rename to ktor-client/ktor-client-features/ktor-client-json/ktor-client-jackson/jvm/src/io/ktor/client/features/json/JacksonSerializer.kt diff --git a/ktor-client/ktor-client-features/ktor-client-json/ktor-client-jackson/test/io/ktor/client/features/json/tests/JacksonTest.kt b/ktor-client/ktor-client-features/ktor-client-json/ktor-client-jackson/jvm/test/io/ktor/client/features/json/tests/JacksonTest.kt similarity index 100% rename from ktor-client/ktor-client-features/ktor-client-json/ktor-client-jackson/test/io/ktor/client/features/json/tests/JacksonTest.kt rename to ktor-client/ktor-client-features/ktor-client-json/ktor-client-jackson/jvm/test/io/ktor/client/features/json/tests/JacksonTest.kt diff --git a/ktor-client/ktor-client-features/ktor-client-json/ktor-client-json-ios/build.gradle b/ktor-client/ktor-client-features/ktor-client-json/ktor-client-json-ios/build.gradle deleted file mode 100644 index 877f973bd5..0000000000 --- a/ktor-client/ktor-client-features/ktor-client-json/ktor-client-json-ios/build.gradle +++ /dev/null @@ -1,8 +0,0 @@ -apply plugin: 'kotlinx-serialization-native' - -dependencies { - expectedBy project(':ktor-client:ktor-client-features:ktor-client-json') - implementation project(':ktor-client:ktor-client-core:ktor-client-core-ios') - - implementation "org.jetbrains.kotlinx:kotlinx-serialization-runtime-native:$serialization_version" -} diff --git a/ktor-client/ktor-client-features/ktor-client-json/ktor-client-json-js/build.gradle b/ktor-client/ktor-client-features/ktor-client-json/ktor-client-json-js/build.gradle deleted file mode 100644 index ce95f7d47a..0000000000 --- a/ktor-client/ktor-client-features/ktor-client-json/ktor-client-json-js/build.gradle +++ /dev/null @@ -1,8 +0,0 @@ -apply plugin: 'kotlinx-serialization' - -dependencies { - expectedBy project(':ktor-client:ktor-client-features:ktor-client-json') - - compile project(':ktor-client:ktor-client-core:ktor-client-core-js') - compile "org.jetbrains.kotlinx:kotlinx-serialization-runtime-js:$serialization_version" -} diff --git a/ktor-client/ktor-client-features/ktor-client-json/ktor-client-json-jvm/build.gradle b/ktor-client/ktor-client-features/ktor-client-json/ktor-client-json-jvm/build.gradle deleted file mode 100644 index e7627f0dd5..0000000000 --- a/ktor-client/ktor-client-features/ktor-client-json/ktor-client-json-jvm/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ - -apply plugin: 'kotlinx-serialization' - -dependencies { - expectedBy project(':ktor-client:ktor-client-features:ktor-client-json') - - compile "org.jetbrains.kotlinx:kotlinx-serialization-runtime:$serialization_version" - - compile project(':ktor-client:ktor-client-core:ktor-client-core-jvm') - compile project(":ktor-client:ktor-client-core") - - testCompile project(':ktor-client:ktor-client-cio') - testCompile project(':ktor-client:ktor-client-features:ktor-client-json:ktor-client-json-tests') - testCompile project(':ktor-features:ktor-gson') - - testCompile project(':ktor-client:ktor-client-features:ktor-client-json:ktor-client-gson') - testCompile project(':ktor-client:ktor-client-features:ktor-client-json:ktor-client-jackson') -} diff --git a/ktor-client/ktor-client-features/ktor-client-json/ktor-client-json-jvm/test/io/ktor/client/features/json/tests/KotlinxJsonTest.kt b/ktor-client/ktor-client-features/ktor-client-json/ktor-client-json-jvm/test/io/ktor/client/features/json/tests/KotlinxJsonTest.kt deleted file mode 100644 index 40d17e620e..0000000000 --- a/ktor-client/ktor-client-features/ktor-client-json/ktor-client-json-jvm/test/io/ktor/client/features/json/tests/KotlinxJsonTest.kt +++ /dev/null @@ -1,12 +0,0 @@ -package io.ktor.client.features.json.tests - -import io.ktor.client.features.json.serializer.* -import kotlinx.serialization.internal.* - -class KotlinxJsonTest : JsonTest() { - override val serializerImpl = KotlinxSerializer().apply { - register(Response.serializer(ArrayListSerializer(User.serializer()))) - register() - register() - } -} diff --git a/ktor-client/ktor-client-features/ktor-client-json/ktor-client-json-tests/build.gradle b/ktor-client/ktor-client-features/ktor-client-json/ktor-client-json-tests/build.gradle index 1abd0be3c2..8f1e4ac138 100644 --- a/ktor-client/ktor-client-features/ktor-client-json/ktor-client-json-tests/build.gradle +++ b/ktor-client/ktor-client-features/ktor-client-json/ktor-client-json-tests/build.gradle @@ -1,22 +1,10 @@ -buildscript { - repositories { - maven { url "https://kotlin.bintray.com/kotlin-eap" } - maven { url "https://kotlin.bintray.com/kotlin-dev" } - } - - dependencies { - classpath "org.jetbrains.kotlin:kotlin-serialization:$kotlin_version" - } -} - -apply plugin: 'kotlinx-serialization' - description = 'Common tests for client-json' -dependencies { - compile project(":ktor-client:ktor-client-features:ktor-client-json:ktor-client-json-jvm") +apply plugin: 'kotlinx-serialization' - compile project(':ktor-client:ktor-client-cio') - compile project(':ktor-client:ktor-client-tests') - compile project(':ktor-features:ktor-gson') +kotlin.sourceSets.jvmMain.dependencies { + api project(":ktor-client:ktor-client-features:ktor-client-json:ktor-client-gson") + api project(':ktor-client:ktor-client-cio') + api project(':ktor-client:ktor-client-tests') + api project(':ktor-features:ktor-gson') } diff --git a/ktor-client/ktor-client-features/ktor-client-json/ktor-client-json-tests/src/io/ktor/client/features/json/tests/JsonTest.kt b/ktor-client/ktor-client-features/ktor-client-json/ktor-client-json-tests/jvm/src/io/ktor/client/features/json/tests/JsonTest.kt similarity index 94% rename from ktor-client/ktor-client-features/ktor-client-json/ktor-client-json-tests/src/io/ktor/client/features/json/tests/JsonTest.kt rename to ktor-client/ktor-client-features/ktor-client-json/ktor-client-json-tests/jvm/src/io/ktor/client/features/json/tests/JsonTest.kt index c81b4932c1..4fd3c33b65 100644 --- a/ktor-client/ktor-client-features/ktor-client-json/ktor-client-json-tests/src/io/ktor/client/features/json/tests/JsonTest.kt +++ b/ktor-client/ktor-client-features/ktor-client-json/ktor-client-json-tests/jvm/src/io/ktor/client/features/json/tests/JsonTest.kt @@ -17,13 +17,13 @@ import kotlinx.serialization.* import kotlin.test.* /** Base class for JSON tests. */ -abstract class JsonTest: TestWithKtor() { +abstract class JsonTest : TestWithKtor() { val widget = Widget("Foo", 1000, listOf("bar", "baz", "qux")) val users = listOf( User("vasya", 10), User("foo", 45) ) - + override val server: ApplicationEngine = embeddedServer(Jetty, serverPort) { install(ContentNegotiation) { gson() @@ -32,7 +32,7 @@ abstract class JsonTest: TestWithKtor() { createRoutes(this) } } - + protected open fun createRoutes(routing: Routing): Unit = with(routing) { post("/widget") { val received = call.receive() @@ -43,9 +43,9 @@ abstract class JsonTest: TestWithKtor() { call.respond(Response(true, users)) } } - + protected abstract val serializerImpl: JsonSerializer? - + protected fun TestClientBuilder<*>.configClient() { config { install(JsonFeature) { @@ -53,46 +53,46 @@ abstract class JsonTest: TestWithKtor() { } } } - + @Test fun testSerializeSimple() = clientTest(CIO) { configClient() - + test { client -> val result = client.post(body = widget, path = "/widget", port = serverPort) { contentType(ContentType.Application.Json) } - + assertEquals(widget, result) } } - + @Test fun testSerializeNested() = clientTest(CIO) { configClient() - + test { client -> val result = client.get>>(path = "/users", port = serverPort) - + assertTrue(result.ok) assertNotNull(result.result) assertEquals(users, result.result) } } - + @Serializable data class Response( val ok: Boolean, val result: T? ) - + @Serializable data class Widget( val name: String, val value: Int, val tags: List = emptyList() ) - + @Serializable data class User( val name: String, diff --git a/ktor-client/ktor-client-features/ktor-client-json/ktor-client-json-jvm/test/io/ktor/client/features/json/tests/DefaultSerializerJsonTest.kt b/ktor-client/ktor-client-features/ktor-client-json/ktor-client-json-tests/jvm/test/DefaultSerializerJsonTest.kt similarity index 54% rename from ktor-client/ktor-client-features/ktor-client-json/ktor-client-json-jvm/test/io/ktor/client/features/json/tests/DefaultSerializerJsonTest.kt rename to ktor-client/ktor-client-features/ktor-client-json/ktor-client-json-tests/jvm/test/DefaultSerializerJsonTest.kt index b17874bcd3..5abdac5381 100644 --- a/ktor-client/ktor-client-features/ktor-client-json/ktor-client-json-jvm/test/io/ktor/client/features/json/tests/DefaultSerializerJsonTest.kt +++ b/ktor-client/ktor-client-features/ktor-client-json/ktor-client-json-tests/jvm/test/DefaultSerializerJsonTest.kt @@ -2,7 +2,7 @@ package io.ktor.client.features.json.tests import io.ktor.client.features.json.* -class DefaultSerializerJsonTest: JsonTest() { +class DefaultSerializerJsonTest : JsonTest() { // Force JsonFeature to use defaultSerializer() - override val serializerImpl: JsonSerializer? = null + override val serializerImpl: JsonSerializer = GsonSerializer() } diff --git a/ktor-client/ktor-client-features/ktor-client-json/ktor-client-json-ios/src/io/ktor/client/features/json/DefaultIos.kt b/ktor-client/ktor-client-features/ktor-client-json/posix/src/io/ktor/client/features/json/DefaultPosix.kt similarity index 100% rename from ktor-client/ktor-client-features/ktor-client-json/ktor-client-json-ios/src/io/ktor/client/features/json/DefaultIos.kt rename to ktor-client/ktor-client-features/ktor-client-json/posix/src/io/ktor/client/features/json/DefaultPosix.kt diff --git a/ktor-client/ktor-client-features/ktor-client-logging/build.gradle b/ktor-client/ktor-client-features/ktor-client-logging/build.gradle new file mode 100644 index 0000000000..7245ba994b --- /dev/null +++ b/ktor-client/ktor-client-features/ktor-client-logging/build.gradle @@ -0,0 +1,13 @@ +kotlin.sourceSets { + commonMain.dependencies { + api project(":ktor-client:ktor-client-core") + } + + jvmMain.dependencies { + implementation("org.slf4j:slf4j-simple:1.6.1") + } + jvmTest.dependencies { + implementation project(":ktor-client:ktor-client-tests") + implementation project(":ktor-client:ktor-client-cio") + } +} diff --git a/ktor-client/ktor-client-features/ktor-client-logging/build.gradle.kts b/ktor-client/ktor-client-features/ktor-client-logging/build.gradle.kts deleted file mode 100644 index eb71d1c5a7..0000000000 --- a/ktor-client/ktor-client-features/ktor-client-logging/build.gradle.kts +++ /dev/null @@ -1,4 +0,0 @@ - -dependencies { - compile(project(":ktor-client:ktor-client-core")) -} diff --git a/ktor-client/ktor-client-features/ktor-client-logging/src/io/ktor/client/features/logging/LogLevel.kt b/ktor-client/ktor-client-features/ktor-client-logging/common/src/io/ktor/client/features/logging/LogLevel.kt similarity index 100% rename from ktor-client/ktor-client-features/ktor-client-logging/src/io/ktor/client/features/logging/LogLevel.kt rename to ktor-client/ktor-client-features/ktor-client-logging/common/src/io/ktor/client/features/logging/LogLevel.kt diff --git a/ktor-client/ktor-client-features/ktor-client-logging/src/io/ktor/client/features/logging/Logger.kt b/ktor-client/ktor-client-features/ktor-client-logging/common/src/io/ktor/client/features/logging/Logger.kt similarity index 100% rename from ktor-client/ktor-client-features/ktor-client-logging/src/io/ktor/client/features/logging/Logger.kt rename to ktor-client/ktor-client-features/ktor-client-logging/common/src/io/ktor/client/features/logging/Logger.kt diff --git a/ktor-client/ktor-client-features/ktor-client-logging/src/io/ktor/client/features/logging/Logging.kt b/ktor-client/ktor-client-features/ktor-client-logging/common/src/io/ktor/client/features/logging/Logging.kt similarity index 91% rename from ktor-client/ktor-client-features/ktor-client-logging/src/io/ktor/client/features/logging/Logging.kt rename to ktor-client/ktor-client-features/ktor-client-logging/common/src/io/ktor/client/features/logging/Logging.kt index cb0bdc4c6c..7313fe49ad 100644 --- a/ktor-client/ktor-client-features/ktor-client-logging/src/io/ktor/client/features/logging/Logging.kt +++ b/ktor-client/ktor-client-features/ktor-client-logging/common/src/io/ktor/client/features/logging/Logging.kt @@ -47,8 +47,8 @@ class Logging( private suspend fun logResponse(response: HttpResponse) { if (level == LogLevel.NONE) return - logger.log("RESPONSE: ${response.status}\n") - logger.log("METHOD: ${response.call.request.method}\n") + logger.log("RESPONSE: ${response.status}") + logger.log("METHOD: ${response.call.request.method}") logger.log("FROM: ${response.call.request.url}") if (level.headers) logHeaders(response.headers.entries()) @@ -73,7 +73,8 @@ class Logging( with(logger) { log("BODY Content-Type: $contentType") log("BODY START") - log(content.readText(contentType?.charset() ?: Charsets.UTF_8)) + val message = content.readText(contentType?.charset() ?: Charsets.UTF_8) + log(message) log("BODY END") } } @@ -127,5 +128,7 @@ class Logging( } } -private suspend inline fun ByteReadChannel.readText(charset: Charset): String = - readRemaining().readText(charset = charset) +private suspend inline fun ByteReadChannel.readText(charset: Charset): String { + val packet = readRemaining(Long.MAX_VALUE, 0) + return packet.readText(charset = charset) +} diff --git a/ktor-client/ktor-client-features/ktor-client-logging/ktor-client-logging-js/src/io/ktor/client/features/logging/LoggerJs.kt b/ktor-client/ktor-client-features/ktor-client-logging/js/src/io/ktor/client/features/logging/LoggerJs.kt similarity index 100% rename from ktor-client/ktor-client-features/ktor-client-logging/ktor-client-logging-js/src/io/ktor/client/features/logging/LoggerJs.kt rename to ktor-client/ktor-client-features/ktor-client-logging/js/src/io/ktor/client/features/logging/LoggerJs.kt diff --git a/ktor-client/ktor-client-features/ktor-client-logging/ktor-client-logging-jvm/src/io/ktor/client/features/logging/LoggerJvm.kt b/ktor-client/ktor-client-features/ktor-client-logging/jvm/src/io/ktor/client/features/logging/LoggerJvm.kt similarity index 100% rename from ktor-client/ktor-client-features/ktor-client-logging/ktor-client-logging-jvm/src/io/ktor/client/features/logging/LoggerJvm.kt rename to ktor-client/ktor-client-features/ktor-client-logging/jvm/src/io/ktor/client/features/logging/LoggerJvm.kt diff --git a/ktor-client/ktor-client-features/ktor-client-logging/ktor-client-logging-jvm/test/io/ktor/client/features/logging/LoggingTest.kt b/ktor-client/ktor-client-features/ktor-client-logging/jvm/test/io/ktor/client/features/logging/LoggingTest.kt similarity index 100% rename from ktor-client/ktor-client-features/ktor-client-logging/ktor-client-logging-jvm/test/io/ktor/client/features/logging/LoggingTest.kt rename to ktor-client/ktor-client-features/ktor-client-logging/jvm/test/io/ktor/client/features/logging/LoggingTest.kt diff --git a/ktor-client/ktor-client-features/ktor-client-logging/ktor-client-logging-ios/build.gradle.kts b/ktor-client/ktor-client-features/ktor-client-logging/ktor-client-logging-ios/build.gradle.kts deleted file mode 100644 index 019f2c8d39..0000000000 --- a/ktor-client/ktor-client-features/ktor-client-logging/ktor-client-logging-ios/build.gradle.kts +++ /dev/null @@ -1,6 +0,0 @@ - -dependencies { - expectedBy(project(":ktor-client:ktor-client-features:ktor-client-logging")) - - implementation(project(":ktor-client:ktor-client-core:ktor-client-core-ios")) -} diff --git a/ktor-client/ktor-client-features/ktor-client-logging/ktor-client-logging-js/build.gradle.kts b/ktor-client/ktor-client-features/ktor-client-logging/ktor-client-logging-js/build.gradle.kts deleted file mode 100644 index 3625d41896..0000000000 --- a/ktor-client/ktor-client-features/ktor-client-logging/ktor-client-logging-js/build.gradle.kts +++ /dev/null @@ -1,6 +0,0 @@ - -dependencies { - expectedBy(project(":ktor-client:ktor-client-features:ktor-client-logging")) - - compile(project(":ktor-client:ktor-client-core:ktor-client-core-js")) -} diff --git a/ktor-client/ktor-client-features/ktor-client-logging/ktor-client-logging-jvm/build.gradle.kts b/ktor-client/ktor-client-features/ktor-client-logging/ktor-client-logging-jvm/build.gradle.kts deleted file mode 100644 index 540796366b..0000000000 --- a/ktor-client/ktor-client-features/ktor-client-logging/ktor-client-logging-jvm/build.gradle.kts +++ /dev/null @@ -1,10 +0,0 @@ - -dependencies { - expectedBy(project(":ktor-client:ktor-client-features:ktor-client-logging")) - - implementation("org.slf4j:slf4j-api:1.7.25") - compile(project(":ktor-client:ktor-client-core:ktor-client-core-jvm")) - - testCompile(project(":ktor-client:ktor-client-tests")) - testCompile(project(":ktor-client:ktor-client-cio")) -} diff --git a/ktor-client/ktor-client-features/ktor-client-logging/ktor-client-logging-ios/src/io/ktor/client/features/logging/LoggerIos.kt b/ktor-client/ktor-client-features/ktor-client-logging/posix/src/io/ktor/client/features/logging/LoggerIos.kt similarity index 100% rename from ktor-client/ktor-client-features/ktor-client-logging/ktor-client-logging-ios/src/io/ktor/client/features/logging/LoggerIos.kt rename to ktor-client/ktor-client-features/ktor-client-logging/posix/src/io/ktor/client/features/logging/LoggerIos.kt diff --git a/ktor-client/ktor-client-features/ktor-client-websocket/build.gradle b/ktor-client/ktor-client-features/ktor-client-websocket/build.gradle index d0ed2af5cc..015e9bb407 100644 --- a/ktor-client/ktor-client-features/ktor-client-websocket/build.gradle +++ b/ktor-client/ktor-client-features/ktor-client-websocket/build.gradle @@ -1,9 +1,13 @@ description = "Ktor websocket support" -dependencies { - compile project(":ktor-client:ktor-client-core:ktor-client-core-jvm") - - testCompile project(":ktor-client:ktor-client-cio") - testCompile project(":ktor-features:ktor-websockets") - testCompile project(":ktor-client:ktor-client-tests") +kotlin.sourceSets { + jvmMain.dependencies { + api project(':ktor-client:ktor-client-core') + api project(':ktor-http:ktor-http-cio') + } + jvmTest.dependencies { + api project(':ktor-client:ktor-client-cio') + api project(':ktor-features:ktor-websockets') + api project(':ktor-client:ktor-client-tests') + } } diff --git a/ktor-client/ktor-client-features/ktor-client-websocket/src/io/ktor/client/features/websocket/ClientSessions.kt b/ktor-client/ktor-client-features/ktor-client-websocket/jvm/src/io/ktor/client/features/websocket/ClientSessions.kt similarity index 100% rename from ktor-client/ktor-client-features/ktor-client-websocket/src/io/ktor/client/features/websocket/ClientSessions.kt rename to ktor-client/ktor-client-features/ktor-client-websocket/jvm/src/io/ktor/client/features/websocket/ClientSessions.kt diff --git a/ktor-client/ktor-client-features/ktor-client-websocket/src/io/ktor/client/features/websocket/WebSocketContent.kt b/ktor-client/ktor-client-features/ktor-client-websocket/jvm/src/io/ktor/client/features/websocket/WebSocketContent.kt similarity index 100% rename from ktor-client/ktor-client-features/ktor-client-websocket/src/io/ktor/client/features/websocket/WebSocketContent.kt rename to ktor-client/ktor-client-features/ktor-client-websocket/jvm/src/io/ktor/client/features/websocket/WebSocketContent.kt diff --git a/ktor-client/ktor-client-features/ktor-client-websocket/src/io/ktor/client/features/websocket/WebSockets.kt b/ktor-client/ktor-client-features/ktor-client-websocket/jvm/src/io/ktor/client/features/websocket/WebSockets.kt similarity index 100% rename from ktor-client/ktor-client-features/ktor-client-websocket/src/io/ktor/client/features/websocket/WebSockets.kt rename to ktor-client/ktor-client-features/ktor-client-websocket/jvm/src/io/ktor/client/features/websocket/WebSockets.kt diff --git a/ktor-client/ktor-client-features/ktor-client-websocket/src/io/ktor/client/features/websocket/builders.kt b/ktor-client/ktor-client-features/ktor-client-websocket/jvm/src/io/ktor/client/features/websocket/builders.kt similarity index 100% rename from ktor-client/ktor-client-features/ktor-client-websocket/src/io/ktor/client/features/websocket/builders.kt rename to ktor-client/ktor-client-features/ktor-client-websocket/jvm/src/io/ktor/client/features/websocket/builders.kt diff --git a/ktor-client/ktor-client-features/ktor-client-websocket/test/io/ktor/client/features/websocket/WebSocketTest.kt b/ktor-client/ktor-client-features/ktor-client-websocket/jvm/test/io/ktor/client/features/websocket/WebSocketTest.kt similarity index 100% rename from ktor-client/ktor-client-features/ktor-client-websocket/test/io/ktor/client/features/websocket/WebSocketTest.kt rename to ktor-client/ktor-client-features/ktor-client-websocket/jvm/test/io/ktor/client/features/websocket/WebSocketTest.kt diff --git a/ktor-client/ktor-client-ios/build.gradle b/ktor-client/ktor-client-ios/build.gradle index 20165ce73c..355aebc7da 100644 --- a/ktor-client/ktor-client-ios/build.gradle +++ b/ktor-client/ktor-client-ios/build.gradle @@ -1,4 +1,12 @@ +apply plugin: "kotlinx-serialization" -dependencies { - implementation project(':ktor-client:ktor-client-core:ktor-client-core-ios') +kotlin.sourceSets { + darwinMain.dependencies { + api project(':ktor-client:ktor-client-core') + } + darwinTest.dependencies { + api project(':ktor-client:ktor-client-features:ktor-client-logging') + api project(':ktor-client:ktor-client-features:ktor-client-json') + api "org.jetbrains.kotlinx:kotlinx-serialization-runtime-native:$serialization_version" + } } diff --git a/ktor-client/ktor-client-ios/darwin/src/io/ktor/client/engine/ios/Ios.kt b/ktor-client/ktor-client-ios/darwin/src/io/ktor/client/engine/ios/Ios.kt new file mode 100644 index 0000000000..77029e52ec --- /dev/null +++ b/ktor-client/ktor-client-ios/darwin/src/io/ktor/client/engine/ios/Ios.kt @@ -0,0 +1,16 @@ +package io.ktor.client.engine.ios + +import io.ktor.client.engine.* + +@ThreadLocal +private val initHook = Ios + +object Ios : HttpClientEngineFactory { + + init { + engines.add(this) + } + + override fun create(block: IosClientEngineConfig.() -> Unit): HttpClientEngine = + IosClientEngine(IosClientEngineConfig().apply(block)) +} diff --git a/ktor-client/ktor-client-ios/src/io/ktor/client/engine/ios/IosClientEngine.kt b/ktor-client/ktor-client-ios/darwin/src/io/ktor/client/engine/ios/IosClientEngine.kt similarity index 96% rename from ktor-client/ktor-client-ios/src/io/ktor/client/engine/ios/IosClientEngine.kt rename to ktor-client/ktor-client-ios/darwin/src/io/ktor/client/engine/ios/IosClientEngine.kt index 765d87e3cb..a69c996b30 100644 --- a/ktor-client/ktor-client-ios/src/io/ktor/client/engine/ios/IosClientEngine.kt +++ b/ktor-client/ktor-client-ios/darwin/src/io/ktor/client/engine/ios/IosClientEngine.kt @@ -6,19 +6,16 @@ import io.ktor.client.request.* import io.ktor.client.utils.* import io.ktor.http.* import io.ktor.http.content.* -import io.ktor.util.* import io.ktor.util.date.* -import kotlin.coroutines.* import kotlinx.coroutines.* import kotlinx.coroutines.channels.* import kotlinx.coroutines.io.* import kotlinx.io.core.* import platform.Foundation.* import platform.darwin.* +import kotlin.coroutines.* -class IosClientEngine(override val config: HttpClientEngineConfig) : HttpClientEngine { - private val context: Job = Job() - +class IosClientEngine(override val config: IosClientEngineConfig) : HttpClientEngine { // TODO: replace with UI dispatcher override val dispatcher: CoroutineDispatcher = Dispatchers.Unconfined diff --git a/ktor-client/ktor-client-ios/src/io/ktor/client/engine/ios/IosClientEngineConfig.kt b/ktor-client/ktor-client-ios/darwin/src/io/ktor/client/engine/ios/IosClientEngineConfig.kt similarity index 72% rename from ktor-client/ktor-client-ios/src/io/ktor/client/engine/ios/IosClientEngineConfig.kt rename to ktor-client/ktor-client-ios/darwin/src/io/ktor/client/engine/ios/IosClientEngineConfig.kt index 8884f96f7e..d7e794d697 100644 --- a/ktor-client/ktor-client-ios/src/io/ktor/client/engine/ios/IosClientEngineConfig.kt +++ b/ktor-client/ktor-client-ios/darwin/src/io/ktor/client/engine/ios/IosClientEngineConfig.kt @@ -3,16 +3,21 @@ package io.ktor.client.engine.ios import io.ktor.client.engine.* import platform.Foundation.* +/** + * Custom [IosClientEngine] config. + */ class IosClientEngineConfig : HttpClientEngineConfig() { - private var configuration: NSMutableURLRequest.() -> Unit = {} + /** + * Provide [NSMutableURLRequest] configuration. + */ fun configureRequest(block: NSMutableURLRequest.() -> Unit) { val old = configuration - configuration = { + configuration = { old() block() } } -} \ No newline at end of file +} diff --git a/ktor-client/ktor-client-ios/src/io/ktor/client/engine/ios/IosHttpResponse.kt b/ktor-client/ktor-client-ios/darwin/src/io/ktor/client/engine/ios/IosHttpResponse.kt similarity index 100% rename from ktor-client/ktor-client-ios/src/io/ktor/client/engine/ios/IosHttpResponse.kt rename to ktor-client/ktor-client-ios/darwin/src/io/ktor/client/engine/ios/IosHttpResponse.kt diff --git a/ktor-client/ktor-client-ios/src/io/ktor/client/engine/ios/Utils.kt b/ktor-client/ktor-client-ios/darwin/src/io/ktor/client/engine/ios/Utils.kt similarity index 100% rename from ktor-client/ktor-client-ios/src/io/ktor/client/engine/ios/Utils.kt rename to ktor-client/ktor-client-ios/darwin/src/io/ktor/client/engine/ios/Utils.kt diff --git a/ktor-client/ktor-client-ios/darwin/test/IosEnginesTest.kt b/ktor-client/ktor-client-ios/darwin/test/IosEnginesTest.kt new file mode 100644 index 0000000000..94f9a9653b --- /dev/null +++ b/ktor-client/ktor-client-ios/darwin/test/IosEnginesTest.kt @@ -0,0 +1,42 @@ +package io.ktor.client.test + +import io.ktor.client.* +import io.ktor.client.engine.* +import io.ktor.client.engine.ios.* +import io.ktor.client.features.json.* +import io.ktor.client.features.json.serializer.* +import io.ktor.client.request.* +import kotlinx.io.core.* +import kotlinx.serialization.* +import kotlin.test.* + +@Serializable +data class HttpBinResponse( + val url: String, + val args: Map, + val headers: Map, + val origin: String +) + +class IosEnginesTest { + + @Test + fun getTest(): Unit = clientTest { client -> + val response = client.get("http://httpbin.org/get") + println(response) + } + + @Test + fun postTest() { + } + + private fun clientTest(block: suspend (HttpClient) -> Unit): Unit = help { + HttpClient(Ios) { + install(JsonFeature) { + serializer = KotlinxSerializer().apply { + register(HttpBinResponse.serializer()) + } + } + }.use { block(it) } + } +} diff --git a/ktor-client/ktor-client-ios/darwin/test/utils.kt b/ktor-client/ktor-client-ios/darwin/test/utils.kt new file mode 100644 index 0000000000..d500d0fd93 --- /dev/null +++ b/ktor-client/ktor-client-ios/darwin/test/utils.kt @@ -0,0 +1,75 @@ +package io.ktor.client.test + +import kotlinx.coroutines.* +import platform.Foundation.* +import kotlin.coroutines.* + +internal class TestDispatcher : CoroutineDispatcher() { + private val tasks = mutableSetOf() + + override fun dispatch(context: CoroutineContext, block: Runnable) { + tasks += block + } + + fun schedule(block: suspend () -> Unit, onDone: (Throwable?) -> Unit) { + block.startCoroutine(TestContinuation(this, onDone)) + } + + fun isEmpty() = tasks.isEmpty() + + fun runSingleTask() { + if (tasks.isEmpty()) { + help() + return + } + + val task = tasks.iterator().next() + try { + task.run() + } catch (cause: Throwable) { + cause.printStackTrace() + } finally { + tasks.remove(task) + } + } + + private fun help() { + val date = NSDate().addTimeInterval(1.0) as NSDate + NSRunLoop.mainRunLoop.runUntilDate(date) + } +} + +internal class TestContinuation( + override val context: CoroutineContext, + private val onDone: (Throwable?) -> Unit +) : Continuation { + override fun resumeWith(result: Result) { + onDone(result.exceptionOrNull()) + } +} + +internal fun help(block: suspend CoroutineDispatcher.() -> Unit) { + val dispatcher = TestDispatcher() + var done = false + var cause: Throwable? = null + dispatcher.schedule({ dispatcher.block() }) { + done = true + cause = it + } + + while (!done) { + dispatcher.runSingleTask() + cause?.let { + it.printStackTrace() + cause = null + } + } + + while (!dispatcher.isEmpty()) { + dispatcher.runSingleTask() + cause?.let { + it.printStackTrace() + cause = null + } + } +} diff --git a/ktor-client/ktor-client-ios/src/io/ktor/client/engine/ios/Ios.kt b/ktor-client/ktor-client-ios/src/io/ktor/client/engine/ios/Ios.kt deleted file mode 100644 index 22b9717ea3..0000000000 --- a/ktor-client/ktor-client-ios/src/io/ktor/client/engine/ios/Ios.kt +++ /dev/null @@ -1,10 +0,0 @@ -package io.ktor.client.engine.ios - -import io.ktor.client.engine.* - -object Ios : HttpClientEngineFactory { - override fun create(block: HttpClientEngineConfig.() -> Unit): HttpClientEngine = - IosClientEngine(HttpClientEngineConfig().apply(block)) -} - -fun IosClient(): HttpClientEngineFactory = Ios diff --git a/ktor-client/ktor-client-jetty/build.gradle b/ktor-client/ktor-client-jetty/build.gradle index 592eb54cd9..64d20e1b8e 100644 --- a/ktor-client/ktor-client-jetty/build.gradle +++ b/ktor-client/ktor-client-jetty/build.gradle @@ -1,7 +1,9 @@ description = '' -dependencies { - compile project(':ktor-client:ktor-client-core:ktor-client-core-jvm') - compile group: 'org.eclipse.jetty.http2', name: 'http2-client', version: jetty_version - compile group: 'org.eclipse.jetty', name: 'jetty-alpn-openjdk8-client', version: jetty_version - compile group: 'org.eclipse.jetty', name: 'jetty-alpn-java-client', version: jetty_version + +kotlin.sourceSets.jvmMain.dependencies { + api project(':ktor-client:ktor-client-core') + + api group: 'org.eclipse.jetty.http2', name: 'http2-client', version: jetty_version + api group: 'org.eclipse.jetty', name: 'jetty-alpn-openjdk8-client', version: jetty_version + api group: 'org.eclipse.jetty', name: 'jetty-alpn-java-client', version: jetty_version } diff --git a/ktor-client/ktor-client-jetty/src/io/ktor/client/engine/jetty/Jetty.kt b/ktor-client/ktor-client-jetty/jvm/src/io/ktor/client/engine/jetty/Jetty.kt similarity index 100% rename from ktor-client/ktor-client-jetty/src/io/ktor/client/engine/jetty/Jetty.kt rename to ktor-client/ktor-client-jetty/jvm/src/io/ktor/client/engine/jetty/Jetty.kt diff --git a/ktor-client/ktor-client-jetty/src/io/ktor/client/engine/jetty/JettyEngineConfig.kt b/ktor-client/ktor-client-jetty/jvm/src/io/ktor/client/engine/jetty/JettyEngineConfig.kt similarity index 100% rename from ktor-client/ktor-client-jetty/src/io/ktor/client/engine/jetty/JettyEngineConfig.kt rename to ktor-client/ktor-client-jetty/jvm/src/io/ktor/client/engine/jetty/JettyEngineConfig.kt diff --git a/ktor-client/ktor-client-jetty/src/io/ktor/client/engine/jetty/JettyHttp2Engine.kt b/ktor-client/ktor-client-jetty/jvm/src/io/ktor/client/engine/jetty/JettyHttp2Engine.kt similarity index 100% rename from ktor-client/ktor-client-jetty/src/io/ktor/client/engine/jetty/JettyHttp2Engine.kt rename to ktor-client/ktor-client-jetty/jvm/src/io/ktor/client/engine/jetty/JettyHttp2Engine.kt diff --git a/ktor-client/ktor-client-jetty/src/io/ktor/client/engine/jetty/JettyHttp2Request.kt b/ktor-client/ktor-client-jetty/jvm/src/io/ktor/client/engine/jetty/JettyHttp2Request.kt similarity index 100% rename from ktor-client/ktor-client-jetty/src/io/ktor/client/engine/jetty/JettyHttp2Request.kt rename to ktor-client/ktor-client-jetty/jvm/src/io/ktor/client/engine/jetty/JettyHttp2Request.kt diff --git a/ktor-client/ktor-client-jetty/src/io/ktor/client/engine/jetty/JettyHttpRequest.kt b/ktor-client/ktor-client-jetty/jvm/src/io/ktor/client/engine/jetty/JettyHttpRequest.kt similarity index 100% rename from ktor-client/ktor-client-jetty/src/io/ktor/client/engine/jetty/JettyHttpRequest.kt rename to ktor-client/ktor-client-jetty/jvm/src/io/ktor/client/engine/jetty/JettyHttpRequest.kt diff --git a/ktor-client/ktor-client-jetty/src/io/ktor/client/engine/jetty/JettyHttpResponse.kt b/ktor-client/ktor-client-jetty/jvm/src/io/ktor/client/engine/jetty/JettyHttpResponse.kt similarity index 100% rename from ktor-client/ktor-client-jetty/src/io/ktor/client/engine/jetty/JettyHttpResponse.kt rename to ktor-client/ktor-client-jetty/jvm/src/io/ktor/client/engine/jetty/JettyHttpResponse.kt diff --git a/ktor-client/ktor-client-jetty/src/io/ktor/client/engine/jetty/JettyResponseListener.kt b/ktor-client/ktor-client-jetty/jvm/src/io/ktor/client/engine/jetty/JettyResponseListener.kt similarity index 100% rename from ktor-client/ktor-client-jetty/src/io/ktor/client/engine/jetty/JettyResponseListener.kt rename to ktor-client/ktor-client-jetty/jvm/src/io/ktor/client/engine/jetty/JettyResponseListener.kt diff --git a/ktor-client/ktor-client-jetty/src/io/ktor/client/engine/jetty/utils.kt b/ktor-client/ktor-client-jetty/jvm/src/io/ktor/client/engine/jetty/utils.kt similarity index 100% rename from ktor-client/ktor-client-jetty/src/io/ktor/client/engine/jetty/utils.kt rename to ktor-client/ktor-client-jetty/jvm/src/io/ktor/client/engine/jetty/utils.kt diff --git a/ktor-client/ktor-client-js/build.gradle b/ktor-client/ktor-client-js/build.gradle index 6c835aa96f..b24c0c251a 100644 --- a/ktor-client/ktor-client-js/build.gradle +++ b/ktor-client/ktor-client-js/build.gradle @@ -1,8 +1,3 @@ - -apply plugin: 'kotlinx-serialization' - -dependencies { - compile project(':ktor-client:ktor-client-core:ktor-client-core-js') - - compile project(':ktor-client:ktor-client-features:ktor-client-json:ktor-client-json-js') +kotlin.sourceSets.jsMain.dependencies { + api project(':ktor-client:ktor-client-core') } diff --git a/ktor-client/ktor-client-js/src/Js.kt b/ktor-client/ktor-client-js/js/src/Js.kt similarity index 100% rename from ktor-client/ktor-client-js/src/Js.kt rename to ktor-client/ktor-client-js/js/src/Js.kt diff --git a/ktor-client/ktor-client-mock/build.gradle b/ktor-client/ktor-client-mock/build.gradle index d07fc8a33c..6ecd394b4a 100644 --- a/ktor-client/ktor-client-mock/build.gradle +++ b/ktor-client/ktor-client-mock/build.gradle @@ -1,4 +1,4 @@ - -dependencies { - compile project(":ktor-client:ktor-client-core") +kotlin.sourceSets.commonMain.dependencies { + api project(':ktor-http') + api project(':ktor-client:ktor-client-core') } diff --git a/ktor-client/ktor-client-mock/src/io/ktor/client/engine/mock/MockEngine.kt b/ktor-client/ktor-client-mock/common/src/io/ktor/client/engine/mock/MockEngine.kt similarity index 93% rename from ktor-client/ktor-client-mock/src/io/ktor/client/engine/mock/MockEngine.kt rename to ktor-client/ktor-client-mock/common/src/io/ktor/client/engine/mock/MockEngine.kt index 36eed20896..45a0a5d6fb 100644 --- a/ktor-client/ktor-client-mock/src/io/ktor/client/engine/mock/MockEngine.kt +++ b/ktor-client/ktor-client-mock/common/src/io/ktor/client/engine/mock/MockEngine.kt @@ -6,11 +6,13 @@ import io.ktor.client.request.* import kotlinx.coroutines.* import kotlin.coroutines.* - /** * [HttpClientEngine] for writing tests without network. */ -class MockEngine(override val config: MockEngineConfig) : HttpClientEngine { +class MockEngine( + override val config: MockEngineConfig +) : HttpClientEngine { + override val dispatcher: CoroutineDispatcher = Dispatchers.Unconfined override val coroutineContext: CoroutineContext = dispatcher + CompletableDeferred() diff --git a/ktor-client/ktor-client-mock/src/io/ktor/client/engine/mock/MockEngineConfig.kt b/ktor-client/ktor-client-mock/common/src/io/ktor/client/engine/mock/MockEngineConfig.kt similarity index 100% rename from ktor-client/ktor-client-mock/src/io/ktor/client/engine/mock/MockEngineConfig.kt rename to ktor-client/ktor-client-mock/common/src/io/ktor/client/engine/mock/MockEngineConfig.kt diff --git a/ktor-client/ktor-client-mock/src/io/ktor/client/engine/mock/MockHttpRequest.kt b/ktor-client/ktor-client-mock/common/src/io/ktor/client/engine/mock/MockHttpRequest.kt similarity index 100% rename from ktor-client/ktor-client-mock/src/io/ktor/client/engine/mock/MockHttpRequest.kt rename to ktor-client/ktor-client-mock/common/src/io/ktor/client/engine/mock/MockHttpRequest.kt diff --git a/ktor-client/ktor-client-mock/src/io/ktor/client/engine/mock/MockHttpResponse.kt b/ktor-client/ktor-client-mock/common/src/io/ktor/client/engine/mock/MockHttpResponse.kt similarity index 100% rename from ktor-client/ktor-client-mock/src/io/ktor/client/engine/mock/MockHttpResponse.kt rename to ktor-client/ktor-client-mock/common/src/io/ktor/client/engine/mock/MockHttpResponse.kt diff --git a/ktor-client/ktor-client-mock/ktor-client-mock-jvm/test/MockEngineTests.kt b/ktor-client/ktor-client-mock/jvm/test/io/ktor/client/tests/mock/MockEngineTests.kt similarity index 97% rename from ktor-client/ktor-client-mock/ktor-client-mock-jvm/test/MockEngineTests.kt rename to ktor-client/ktor-client-mock/jvm/test/io/ktor/client/tests/mock/MockEngineTests.kt index 646e92178a..99f71e2a16 100644 --- a/ktor-client/ktor-client-mock/ktor-client-mock-jvm/test/MockEngineTests.kt +++ b/ktor-client/ktor-client-mock/jvm/test/io/ktor/client/tests/mock/MockEngineTests.kt @@ -1,3 +1,5 @@ +package io.ktor.client.tests.mock + import io.ktor.client.* import io.ktor.client.call.* import io.ktor.client.engine.mock.* @@ -30,6 +32,8 @@ class MockEngineTests { assertEquals(byteArrayOf(1, 2, 3).toList(), client.get("/").toList()) assertEquals("MyValue", client.call("/").response.headers["X-MyHeader"]) assertEquals("Not Found other/path", client.get("/other/path")) + + Unit } @Test diff --git a/ktor-client/ktor-client-mock/ktor-client-mock-ios/build.gradle b/ktor-client/ktor-client-mock/ktor-client-mock-ios/build.gradle deleted file mode 100644 index a93f4c80b0..0000000000 --- a/ktor-client/ktor-client-mock/ktor-client-mock-ios/build.gradle +++ /dev/null @@ -1,6 +0,0 @@ - -dependencies { - expectedBy project(':ktor-client:ktor-client-mock') - - implementation project(":ktor-client:ktor-client-core:ktor-client-core-ios") -} diff --git a/ktor-client/ktor-client-mock/ktor-client-mock-js/build.gradle b/ktor-client/ktor-client-mock/ktor-client-mock-js/build.gradle deleted file mode 100644 index df6d670935..0000000000 --- a/ktor-client/ktor-client-mock/ktor-client-mock-js/build.gradle +++ /dev/null @@ -1,6 +0,0 @@ - -dependencies { - expectedBy project(':ktor-client:ktor-client-mock') - - compile project(":ktor-client:ktor-client-core:ktor-client-core-js") -} diff --git a/ktor-client/ktor-client-mock/ktor-client-mock-jvm/build.gradle b/ktor-client/ktor-client-mock/ktor-client-mock-jvm/build.gradle deleted file mode 100644 index a758fdf337..0000000000 --- a/ktor-client/ktor-client-mock/ktor-client-mock-jvm/build.gradle +++ /dev/null @@ -1,6 +0,0 @@ - -dependencies { - expectedBy project(':ktor-client:ktor-client-mock') - - compile project(":ktor-client:ktor-client-core:ktor-client-core-jvm") -} diff --git a/ktor-client/ktor-client-okhttp/build.gradle b/ktor-client/ktor-client-okhttp/build.gradle index 7edb4f92a4..4f85229809 100644 --- a/ktor-client/ktor-client-okhttp/build.gradle +++ b/ktor-client/ktor-client-okhttp/build.gradle @@ -1,8 +1,9 @@ - -dependencies { - compile project(':ktor-client:ktor-client-core:ktor-client-core-jvm') - - implementation 'com.squareup.okhttp3:okhttp:3.11.0' - - testImplementation project(':ktor-client:ktor-client-tests') +kotlin.sourceSets { + jvmMain.dependencies { + api project(':ktor-client:ktor-client-core') + api 'com.squareup.okhttp3:okhttp:3.11.0' + } + jvmTest.dependencies { + api project(':ktor-client:ktor-client-tests') + } } diff --git a/ktor-client/ktor-client-okhttp/resources/META-INF/services/io.ktor.client.HttpClientEngineContainer b/ktor-client/ktor-client-okhttp/jvm/resources/META-INF/services/io.ktor.client.HttpClientEngineContainer similarity index 100% rename from ktor-client/ktor-client-okhttp/resources/META-INF/services/io.ktor.client.HttpClientEngineContainer rename to ktor-client/ktor-client-okhttp/jvm/resources/META-INF/services/io.ktor.client.HttpClientEngineContainer diff --git a/ktor-client/ktor-client-okhttp/src/io/ktor/client/engine/okhttp/OkHttp.kt b/ktor-client/ktor-client-okhttp/jvm/src/io/ktor/client/engine/okhttp/OkHttp.kt similarity index 100% rename from ktor-client/ktor-client-okhttp/src/io/ktor/client/engine/okhttp/OkHttp.kt rename to ktor-client/ktor-client-okhttp/jvm/src/io/ktor/client/engine/okhttp/OkHttp.kt diff --git a/ktor-client/ktor-client-okhttp/src/io/ktor/client/engine/okhttp/OkHttpConfig.kt b/ktor-client/ktor-client-okhttp/jvm/src/io/ktor/client/engine/okhttp/OkHttpConfig.kt similarity index 100% rename from ktor-client/ktor-client-okhttp/src/io/ktor/client/engine/okhttp/OkHttpConfig.kt rename to ktor-client/ktor-client-okhttp/jvm/src/io/ktor/client/engine/okhttp/OkHttpConfig.kt diff --git a/ktor-client/ktor-client-okhttp/src/io/ktor/client/engine/okhttp/OkHttpEngine.kt b/ktor-client/ktor-client-okhttp/jvm/src/io/ktor/client/engine/okhttp/OkHttpEngine.kt similarity index 100% rename from ktor-client/ktor-client-okhttp/src/io/ktor/client/engine/okhttp/OkHttpEngine.kt rename to ktor-client/ktor-client-okhttp/jvm/src/io/ktor/client/engine/okhttp/OkHttpEngine.kt diff --git a/ktor-client/ktor-client-okhttp/src/io/ktor/client/engine/okhttp/OkHttpResponse.kt b/ktor-client/ktor-client-okhttp/jvm/src/io/ktor/client/engine/okhttp/OkHttpResponse.kt similarity index 100% rename from ktor-client/ktor-client-okhttp/src/io/ktor/client/engine/okhttp/OkHttpResponse.kt rename to ktor-client/ktor-client-okhttp/jvm/src/io/ktor/client/engine/okhttp/OkHttpResponse.kt diff --git a/ktor-client/ktor-client-okhttp/src/io/ktor/client/engine/okhttp/OkUtils.kt b/ktor-client/ktor-client-okhttp/jvm/src/io/ktor/client/engine/okhttp/OkUtils.kt similarity index 100% rename from ktor-client/ktor-client-okhttp/src/io/ktor/client/engine/okhttp/OkUtils.kt rename to ktor-client/ktor-client-okhttp/jvm/src/io/ktor/client/engine/okhttp/OkUtils.kt diff --git a/ktor-client/ktor-client-okhttp/src/io/ktor/client/engine/okhttp/StreamRequestBody.kt b/ktor-client/ktor-client-okhttp/jvm/src/io/ktor/client/engine/okhttp/StreamRequestBody.kt similarity index 100% rename from ktor-client/ktor-client-okhttp/src/io/ktor/client/engine/okhttp/StreamRequestBody.kt rename to ktor-client/ktor-client-okhttp/jvm/src/io/ktor/client/engine/okhttp/StreamRequestBody.kt diff --git a/ktor-client/ktor-client-okhttp/test/io/ktor/client/engine/okhttp/CommonTests.kt b/ktor-client/ktor-client-okhttp/jvm/test/io/ktor/client/engine/okhttp/CommonTests.kt similarity index 100% rename from ktor-client/ktor-client-okhttp/test/io/ktor/client/engine/okhttp/CommonTests.kt rename to ktor-client/ktor-client-okhttp/jvm/test/io/ktor/client/engine/okhttp/CommonTests.kt diff --git a/ktor-client/ktor-client-okhttp/test/io/ktor/client/engine/okhttp/RequestTests.kt b/ktor-client/ktor-client-okhttp/jvm/test/io/ktor/client/engine/okhttp/RequestTests.kt similarity index 100% rename from ktor-client/ktor-client-okhttp/test/io/ktor/client/engine/okhttp/RequestTests.kt rename to ktor-client/ktor-client-okhttp/jvm/test/io/ktor/client/engine/okhttp/RequestTests.kt diff --git a/ktor-client/ktor-client-tests/build.gradle b/ktor-client/ktor-client-tests/build.gradle index 680591a5cb..f08f7e829e 100644 --- a/ktor-client/ktor-client-tests/build.gradle +++ b/ktor-client/ktor-client-tests/build.gradle @@ -1,14 +1,19 @@ -description = "Common tests for client" +description = 'Common tests for client' -dependencies { - compile project(":ktor-client:ktor-client-core:ktor-client-core-jvm") - compile project(":ktor-server:ktor-server-jetty") - compile project(":ktor-server:ktor-server-netty") +apply plugin: "kotlinx-serialization" - runtime project(":ktor-client:ktor-client-apache") - runtime project(":ktor-client:ktor-client-cio") - - compile group: 'ch.qos.logback', name: 'logback-classic', version: logback_version - compile group: 'junit', name: 'junit', version: junit_version - compile group: 'org.jetbrains.kotlin', name: 'kotlin-test-junit', version: kotlin_version +kotlin.sourceSets { + jvmMain.dependencies { + api project(':ktor-client:ktor-client-core') + api project(':ktor-server:ktor-server-jetty') + api project(':ktor-server:ktor-server-netty') + api group: 'ch.qos.logback', name: 'logback-classic', version: logback_version + api group: 'junit', name: 'junit', version: junit_version + api group: 'org.jetbrains.kotlin', name: 'kotlin-test-junit', version: kotlin_version + } + jvmTest.dependencies { + runtimeOnly project(':ktor-client:ktor-client-apache') + runtimeOnly project(':ktor-client:ktor-client-cio') + } } + diff --git a/ktor-client/ktor-client-tests/src/io/ktor/client/tests/AttributesTest.kt b/ktor-client/ktor-client-tests/jvm/src/io/ktor/client/tests/AttributesTest.kt similarity index 100% rename from ktor-client/ktor-client-tests/src/io/ktor/client/tests/AttributesTest.kt rename to ktor-client/ktor-client-tests/jvm/src/io/ktor/client/tests/AttributesTest.kt diff --git a/ktor-client/ktor-client-tests/src/io/ktor/client/tests/BuildersTest.kt b/ktor-client/ktor-client-tests/jvm/src/io/ktor/client/tests/BuildersTest.kt similarity index 100% rename from ktor-client/ktor-client-tests/src/io/ktor/client/tests/BuildersTest.kt rename to ktor-client/ktor-client-tests/jvm/src/io/ktor/client/tests/BuildersTest.kt diff --git a/ktor-client/ktor-client-tests/src/io/ktor/client/tests/CacheTest.kt b/ktor-client/ktor-client-tests/jvm/src/io/ktor/client/tests/CacheTest.kt similarity index 100% rename from ktor-client/ktor-client-tests/src/io/ktor/client/tests/CacheTest.kt rename to ktor-client/ktor-client-tests/jvm/src/io/ktor/client/tests/CacheTest.kt diff --git a/ktor-client/ktor-client-tests/src/io/ktor/client/tests/ConnectionTest.kt b/ktor-client/ktor-client-tests/jvm/src/io/ktor/client/tests/ConnectionTest.kt similarity index 100% rename from ktor-client/ktor-client-tests/src/io/ktor/client/tests/ConnectionTest.kt rename to ktor-client/ktor-client-tests/jvm/src/io/ktor/client/tests/ConnectionTest.kt diff --git a/ktor-client/ktor-client-tests/src/io/ktor/client/tests/ContentTest.kt b/ktor-client/ktor-client-tests/jvm/src/io/ktor/client/tests/ContentTest.kt similarity index 100% rename from ktor-client/ktor-client-tests/src/io/ktor/client/tests/ContentTest.kt rename to ktor-client/ktor-client-tests/jvm/src/io/ktor/client/tests/ContentTest.kt diff --git a/ktor-client/ktor-client-tests/src/io/ktor/client/tests/CookiesTest.kt b/ktor-client/ktor-client-tests/jvm/src/io/ktor/client/tests/CookiesTest.kt similarity index 100% rename from ktor-client/ktor-client-tests/src/io/ktor/client/tests/CookiesTest.kt rename to ktor-client/ktor-client-tests/jvm/src/io/ktor/client/tests/CookiesTest.kt diff --git a/ktor-client/ktor-client-tests/src/io/ktor/client/tests/FeaturesTest.kt b/ktor-client/ktor-client-tests/jvm/src/io/ktor/client/tests/FeaturesTest.kt similarity index 100% rename from ktor-client/ktor-client-tests/src/io/ktor/client/tests/FeaturesTest.kt rename to ktor-client/ktor-client-tests/jvm/src/io/ktor/client/tests/FeaturesTest.kt diff --git a/ktor-client/ktor-client-tests/src/io/ktor/client/tests/FullFormTest.kt b/ktor-client/ktor-client-tests/jvm/src/io/ktor/client/tests/FullFormTest.kt similarity index 100% rename from ktor-client/ktor-client-tests/src/io/ktor/client/tests/FullFormTest.kt rename to ktor-client/ktor-client-tests/jvm/src/io/ktor/client/tests/FullFormTest.kt diff --git a/ktor-client/ktor-client-tests/src/io/ktor/client/tests/HttpClientTest.kt b/ktor-client/ktor-client-tests/jvm/src/io/ktor/client/tests/HttpClientTest.kt similarity index 100% rename from ktor-client/ktor-client-tests/src/io/ktor/client/tests/HttpClientTest.kt rename to ktor-client/ktor-client-tests/jvm/src/io/ktor/client/tests/HttpClientTest.kt diff --git a/ktor-client/ktor-client-tests/src/io/ktor/client/tests/HttpRedirectTest.kt b/ktor-client/ktor-client-tests/jvm/src/io/ktor/client/tests/HttpRedirectTest.kt similarity index 100% rename from ktor-client/ktor-client-tests/src/io/ktor/client/tests/HttpRedirectTest.kt rename to ktor-client/ktor-client-tests/jvm/src/io/ktor/client/tests/HttpRedirectTest.kt diff --git a/ktor-client/ktor-client-tests/src/io/ktor/client/tests/MultithreadedTest.kt b/ktor-client/ktor-client-tests/jvm/src/io/ktor/client/tests/MultithreadedTest.kt similarity index 100% rename from ktor-client/ktor-client-tests/src/io/ktor/client/tests/MultithreadedTest.kt rename to ktor-client/ktor-client-tests/jvm/src/io/ktor/client/tests/MultithreadedTest.kt diff --git a/ktor-client/ktor-client-tests/src/io/ktor/client/tests/PostTest.kt b/ktor-client/ktor-client-tests/jvm/src/io/ktor/client/tests/PostTest.kt similarity index 100% rename from ktor-client/ktor-client-tests/src/io/ktor/client/tests/PostTest.kt rename to ktor-client/ktor-client-tests/jvm/src/io/ktor/client/tests/PostTest.kt diff --git a/ktor-client/ktor-client-tests/src/io/ktor/client/tests/cio/SemaphoreTest.kt b/ktor-client/ktor-client-tests/jvm/src/io/ktor/client/tests/cio/SemaphoreTest.kt similarity index 100% rename from ktor-client/ktor-client-tests/src/io/ktor/client/tests/cio/SemaphoreTest.kt rename to ktor-client/ktor-client-tests/jvm/src/io/ktor/client/tests/cio/SemaphoreTest.kt diff --git a/ktor-client/ktor-client-tests/src/io/ktor/client/tests/utils/ClientTestUtils.kt b/ktor-client/ktor-client-tests/jvm/src/io/ktor/client/tests/utils/ClientTestUtils.kt similarity index 100% rename from ktor-client/ktor-client-tests/src/io/ktor/client/tests/utils/ClientTestUtils.kt rename to ktor-client/ktor-client-tests/jvm/src/io/ktor/client/tests/utils/ClientTestUtils.kt diff --git a/ktor-client/ktor-client-tests/src/io/ktor/client/tests/utils/TestWithKtor.kt b/ktor-client/ktor-client-tests/jvm/src/io/ktor/client/tests/utils/TestWithKtor.kt similarity index 100% rename from ktor-client/ktor-client-tests/src/io/ktor/client/tests/utils/TestWithKtor.kt rename to ktor-client/ktor-client-tests/jvm/src/io/ktor/client/tests/utils/TestWithKtor.kt diff --git a/ktor-client/ktor-client-tests/src/io/ktor/client/tests/utils/generators.kt b/ktor-client/ktor-client-tests/jvm/src/io/ktor/client/tests/utils/generators.kt similarity index 100% rename from ktor-client/ktor-client-tests/src/io/ktor/client/tests/utils/generators.kt rename to ktor-client/ktor-client-tests/jvm/src/io/ktor/client/tests/utils/generators.kt diff --git a/ktor-client/ktor-client-tests/test/io/ktor/client/tests/DefaultEngineTest.kt b/ktor-client/ktor-client-tests/jvm/test/io/ktor/client/tests/DefaultEngineTest.kt similarity index 100% rename from ktor-client/ktor-client-tests/test/io/ktor/client/tests/DefaultEngineTest.kt rename to ktor-client/ktor-client-tests/jvm/test/io/ktor/client/tests/DefaultEngineTest.kt diff --git a/ktor-features/build.gradle b/ktor-features/build.gradle index 2a768deff2..65d236276d 100644 --- a/ktor-features/build.gradle +++ b/ktor-features/build.gradle @@ -1,8 +1,16 @@ subprojects { - - dependencies { - compile project(':ktor-server:ktor-server-core') - testCompile project(":ktor-server:ktor-server-test-host") + kotlin { + sourceSets { + commonMain { + dependencies { + api project(':ktor-server:ktor-server-core') + } + } + commonTest { + dependencies { + api project(":ktor-server:ktor-server-test-host") + } + } + } } - } diff --git a/ktor-features/jvm/.gitkeep b/ktor-features/jvm/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ktor-features/ktor-auth-jwt/build.gradle b/ktor-features/ktor-auth-jwt/build.gradle index 6c837ba48d..195afb14e0 100644 --- a/ktor-features/ktor-auth-jwt/build.gradle +++ b/ktor-features/ktor-auth-jwt/build.gradle @@ -1,8 +1,14 @@ description = '' -dependencies { - compile project(':ktor-features:ktor-auth') - compile group: 'com.googlecode.json-simple', name: 'json-simple', version: '1.1.1' - compile group: 'com.auth0', name: 'java-jwt', version: '3.4.0' - compile group: 'com.auth0', name: 'jwks-rsa', version: '0.5.0' - testCompile "com.nhaarman:mockito-kotlin:1.6.0" -} \ No newline at end of file + +kotlin.sourceSets { + jvmMain.dependencies { + api project(':ktor-features:ktor-auth') + api group: 'com.googlecode.json-simple', name: 'json-simple', version: '1.1.1' + api group: 'com.auth0', name: 'java-jwt', version: '3.4.0' + api group: 'com.auth0', name: 'jwks-rsa', version: '0.5.0' + } + jvmTest.dependencies { + api 'com.nhaarman:mockito-kotlin:1.6.0' + } +} + diff --git a/ktor-features/ktor-auth-jwt/src/io/ktor/auth/jwt/JWTAuth.kt b/ktor-features/ktor-auth-jwt/jvm/src/io/ktor/auth/jwt/JWTAuth.kt similarity index 100% rename from ktor-features/ktor-auth-jwt/src/io/ktor/auth/jwt/JWTAuth.kt rename to ktor-features/ktor-auth-jwt/jvm/src/io/ktor/auth/jwt/JWTAuth.kt diff --git a/ktor-features/ktor-auth-jwt/test/io/ktor/auth/jwt/JWTAuthTest.kt b/ktor-features/ktor-auth-jwt/jvm/test/io/ktor/auth/jwt/JWTAuthTest.kt similarity index 100% rename from ktor-features/ktor-auth-jwt/test/io/ktor/auth/jwt/JWTAuthTest.kt rename to ktor-features/ktor-auth-jwt/jvm/test/io/ktor/auth/jwt/JWTAuthTest.kt diff --git a/ktor-features/ktor-auth-ldap/build.gradle b/ktor-features/ktor-auth-ldap/build.gradle index 87f1a44af7..1ec34498f3 100644 --- a/ktor-features/ktor-auth-ldap/build.gradle +++ b/ktor-features/ktor-auth-ldap/build.gradle @@ -1,6 +1,11 @@ description = '' -dependencies { - compile project(':ktor-features:ktor-auth') - testCompile group: 'org.apache.directory.server', name: 'apacheds-server-integ', version: '2.0.0-M24' - testCompile group: 'org.apache.directory.server', name: 'apacheds-core-integ', version: '2.0.0-M24' + +kotlin.sourceSets { + jvmMain.dependencies { + api project(':ktor-features:ktor-auth') + } + jvmTest.dependencies { + api group: 'org.apache.directory.server', name: 'apacheds-server-integ', version: '2.0.0-M24' + api group: 'org.apache.directory.server', name: 'apacheds-core-integ', version: '2.0.0-M24' + } } diff --git a/ktor-features/ktor-auth-ldap/src/io/ktor/auth/ldap/Ldap.kt b/ktor-features/ktor-auth-ldap/jvm/src/io/ktor/auth/ldap/Ldap.kt similarity index 100% rename from ktor-features/ktor-auth-ldap/src/io/ktor/auth/ldap/Ldap.kt rename to ktor-features/ktor-auth-ldap/jvm/src/io/ktor/auth/ldap/Ldap.kt diff --git a/ktor-features/ktor-auth-ldap/test/io/ktor/tests/auth/ldap/LdapAuthTest.kt b/ktor-features/ktor-auth-ldap/jvm/test/io/ktor/tests/auth/ldap/LdapAuthTest.kt similarity index 100% rename from ktor-features/ktor-auth-ldap/test/io/ktor/tests/auth/ldap/LdapAuthTest.kt rename to ktor-features/ktor-auth-ldap/jvm/test/io/ktor/tests/auth/ldap/LdapAuthTest.kt diff --git a/ktor-features/ktor-auth/build.gradle b/ktor-features/ktor-auth/build.gradle index ec07749c8e..efb5a43953 100644 --- a/ktor-features/ktor-auth/build.gradle +++ b/ktor-features/ktor-auth/build.gradle @@ -1,7 +1,14 @@ description = '' -dependencies { - compile project(':ktor-client:ktor-client-core:ktor-client-core-jvm') - compile group: 'com.googlecode.json-simple', name: 'json-simple', version: '1.1.1' - testCompile project(':ktor-client:ktor-client-cio') - testCompile project(':ktor-server:ktor-server-test-host') + +kotlin { + sourceSets { + jvmMain.dependencies { + api project(':ktor-client:ktor-client-core') + api group: 'com.googlecode.json-simple', name: 'json-simple', version: '1.1.1' + } + jvmTest.dependencies { + api project(':ktor-client:ktor-client-cio') + api project(':ktor-server:ktor-server-test-host') + } + } } diff --git a/ktor-features/ktor-auth/src/io/ktor/auth/Authentication.kt b/ktor-features/ktor-auth/jvm/src/io/ktor/auth/Authentication.kt similarity index 100% rename from ktor-features/ktor-auth/src/io/ktor/auth/Authentication.kt rename to ktor-features/ktor-auth/jvm/src/io/ktor/auth/Authentication.kt diff --git a/ktor-features/ktor-auth/src/io/ktor/auth/AuthenticationContext.kt b/ktor-features/ktor-auth/jvm/src/io/ktor/auth/AuthenticationContext.kt similarity index 100% rename from ktor-features/ktor-auth/src/io/ktor/auth/AuthenticationContext.kt rename to ktor-features/ktor-auth/jvm/src/io/ktor/auth/AuthenticationContext.kt diff --git a/ktor-features/ktor-auth/src/io/ktor/auth/AuthenticationFailedCause.kt b/ktor-features/ktor-auth/jvm/src/io/ktor/auth/AuthenticationFailedCause.kt similarity index 100% rename from ktor-features/ktor-auth/src/io/ktor/auth/AuthenticationFailedCause.kt rename to ktor-features/ktor-auth/jvm/src/io/ktor/auth/AuthenticationFailedCause.kt diff --git a/ktor-features/ktor-auth/src/io/ktor/auth/AuthenticationPipeline.kt b/ktor-features/ktor-auth/jvm/src/io/ktor/auth/AuthenticationPipeline.kt similarity index 100% rename from ktor-features/ktor-auth/src/io/ktor/auth/AuthenticationPipeline.kt rename to ktor-features/ktor-auth/jvm/src/io/ktor/auth/AuthenticationPipeline.kt diff --git a/ktor-features/ktor-auth/src/io/ktor/auth/AuthenticationProcedureChallenge.kt b/ktor-features/ktor-auth/jvm/src/io/ktor/auth/AuthenticationProcedureChallenge.kt similarity index 100% rename from ktor-features/ktor-auth/src/io/ktor/auth/AuthenticationProcedureChallenge.kt rename to ktor-features/ktor-auth/jvm/src/io/ktor/auth/AuthenticationProcedureChallenge.kt diff --git a/ktor-features/ktor-auth/src/io/ktor/auth/AuthenticationProvider.kt b/ktor-features/ktor-auth/jvm/src/io/ktor/auth/AuthenticationProvider.kt similarity index 100% rename from ktor-features/ktor-auth/src/io/ktor/auth/AuthenticationProvider.kt rename to ktor-features/ktor-auth/jvm/src/io/ktor/auth/AuthenticationProvider.kt diff --git a/ktor-features/ktor-auth/src/io/ktor/auth/BasicAuth.kt b/ktor-features/ktor-auth/jvm/src/io/ktor/auth/BasicAuth.kt similarity index 100% rename from ktor-features/ktor-auth/src/io/ktor/auth/BasicAuth.kt rename to ktor-features/ktor-auth/jvm/src/io/ktor/auth/BasicAuth.kt diff --git a/ktor-features/ktor-auth/src/io/ktor/auth/DigestAuth.kt b/ktor-features/ktor-auth/jvm/src/io/ktor/auth/DigestAuth.kt similarity index 100% rename from ktor-features/ktor-auth/src/io/ktor/auth/DigestAuth.kt rename to ktor-features/ktor-auth/jvm/src/io/ktor/auth/DigestAuth.kt diff --git a/ktor-features/ktor-auth/src/io/ktor/auth/FormAuth.kt b/ktor-features/ktor-auth/jvm/src/io/ktor/auth/FormAuth.kt similarity index 100% rename from ktor-features/ktor-auth/src/io/ktor/auth/FormAuth.kt rename to ktor-features/ktor-auth/jvm/src/io/ktor/auth/FormAuth.kt diff --git a/ktor-features/ktor-auth/src/io/ktor/auth/Headers.kt b/ktor-features/ktor-auth/jvm/src/io/ktor/auth/Headers.kt similarity index 100% rename from ktor-features/ktor-auth/src/io/ktor/auth/Headers.kt rename to ktor-features/ktor-auth/jvm/src/io/ktor/auth/Headers.kt diff --git a/ktor-features/ktor-auth/src/io/ktor/auth/OAuth.kt b/ktor-features/ktor-auth/jvm/src/io/ktor/auth/OAuth.kt similarity index 100% rename from ktor-features/ktor-auth/src/io/ktor/auth/OAuth.kt rename to ktor-features/ktor-auth/jvm/src/io/ktor/auth/OAuth.kt diff --git a/ktor-features/ktor-auth/src/io/ktor/auth/OAuth1a.kt b/ktor-features/ktor-auth/jvm/src/io/ktor/auth/OAuth1a.kt similarity index 100% rename from ktor-features/ktor-auth/src/io/ktor/auth/OAuth1a.kt rename to ktor-features/ktor-auth/jvm/src/io/ktor/auth/OAuth1a.kt diff --git a/ktor-features/ktor-auth/src/io/ktor/auth/OAuth2.kt b/ktor-features/ktor-auth/jvm/src/io/ktor/auth/OAuth2.kt similarity index 100% rename from ktor-features/ktor-auth/src/io/ktor/auth/OAuth2.kt rename to ktor-features/ktor-auth/jvm/src/io/ktor/auth/OAuth2.kt diff --git a/ktor-features/ktor-auth/src/io/ktor/auth/OAuthProcedure.kt b/ktor-features/ktor-auth/jvm/src/io/ktor/auth/OAuthProcedure.kt similarity index 100% rename from ktor-features/ktor-auth/src/io/ktor/auth/OAuthProcedure.kt rename to ktor-features/ktor-auth/jvm/src/io/ktor/auth/OAuthProcedure.kt diff --git a/ktor-features/ktor-auth/src/io/ktor/auth/Principal.kt b/ktor-features/ktor-auth/jvm/src/io/ktor/auth/Principal.kt similarity index 100% rename from ktor-features/ktor-auth/src/io/ktor/auth/Principal.kt rename to ktor-features/ktor-auth/jvm/src/io/ktor/auth/Principal.kt diff --git a/ktor-features/ktor-auth/src/io/ktor/auth/SessionAuth.kt b/ktor-features/ktor-auth/jvm/src/io/ktor/auth/SessionAuth.kt similarity index 100% rename from ktor-features/ktor-auth/src/io/ktor/auth/SessionAuth.kt rename to ktor-features/ktor-auth/jvm/src/io/ktor/auth/SessionAuth.kt diff --git a/ktor-features/ktor-auth/src/io/ktor/auth/SimpleAuth.kt b/ktor-features/ktor-auth/jvm/src/io/ktor/auth/SimpleAuth.kt similarity index 100% rename from ktor-features/ktor-auth/src/io/ktor/auth/SimpleAuth.kt rename to ktor-features/ktor-auth/jvm/src/io/ktor/auth/SimpleAuth.kt diff --git a/ktor-features/ktor-auth/src/io/ktor/auth/UnauthorizedResponse.kt b/ktor-features/ktor-auth/jvm/src/io/ktor/auth/UnauthorizedResponse.kt similarity index 100% rename from ktor-features/ktor-auth/src/io/ktor/auth/UnauthorizedResponse.kt rename to ktor-features/ktor-auth/jvm/src/io/ktor/auth/UnauthorizedResponse.kt diff --git a/ktor-features/ktor-auth/test/io/ktor/tests/auth/AuthBuildersTest.kt b/ktor-features/ktor-auth/jvm/test/io/ktor/tests/auth/AuthBuildersTest.kt similarity index 100% rename from ktor-features/ktor-auth/test/io/ktor/tests/auth/AuthBuildersTest.kt rename to ktor-features/ktor-auth/jvm/test/io/ktor/tests/auth/AuthBuildersTest.kt diff --git a/ktor-features/ktor-auth/test/io/ktor/tests/auth/AuthHeadersTest.kt b/ktor-features/ktor-auth/jvm/test/io/ktor/tests/auth/AuthHeadersTest.kt similarity index 100% rename from ktor-features/ktor-auth/test/io/ktor/tests/auth/AuthHeadersTest.kt rename to ktor-features/ktor-auth/jvm/test/io/ktor/tests/auth/AuthHeadersTest.kt diff --git a/ktor-features/ktor-auth/test/io/ktor/tests/auth/AuthTests.kt b/ktor-features/ktor-auth/jvm/test/io/ktor/tests/auth/AuthTests.kt similarity index 100% rename from ktor-features/ktor-auth/test/io/ktor/tests/auth/AuthTests.kt rename to ktor-features/ktor-auth/jvm/test/io/ktor/tests/auth/AuthTests.kt diff --git a/ktor-features/ktor-auth/test/io/ktor/tests/auth/BasicAuthTest.kt b/ktor-features/ktor-auth/jvm/test/io/ktor/tests/auth/BasicAuthTest.kt similarity index 100% rename from ktor-features/ktor-auth/test/io/ktor/tests/auth/BasicAuthTest.kt rename to ktor-features/ktor-auth/jvm/test/io/ktor/tests/auth/BasicAuthTest.kt diff --git a/ktor-features/ktor-auth/test/io/ktor/tests/auth/CryptoTest.kt b/ktor-features/ktor-auth/jvm/test/io/ktor/tests/auth/CryptoTest.kt similarity index 100% rename from ktor-features/ktor-auth/test/io/ktor/tests/auth/CryptoTest.kt rename to ktor-features/ktor-auth/jvm/test/io/ktor/tests/auth/CryptoTest.kt diff --git a/ktor-features/ktor-auth/test/io/ktor/tests/auth/DigestTest.kt b/ktor-features/ktor-auth/jvm/test/io/ktor/tests/auth/DigestTest.kt similarity index 100% rename from ktor-features/ktor-auth/test/io/ktor/tests/auth/DigestTest.kt rename to ktor-features/ktor-auth/jvm/test/io/ktor/tests/auth/DigestTest.kt diff --git a/ktor-features/ktor-auth/test/io/ktor/tests/auth/HttpClientTest.kt b/ktor-features/ktor-auth/jvm/test/io/ktor/tests/auth/HttpClientTest.kt similarity index 100% rename from ktor-features/ktor-auth/test/io/ktor/tests/auth/HttpClientTest.kt rename to ktor-features/ktor-auth/jvm/test/io/ktor/tests/auth/HttpClientTest.kt diff --git a/ktor-features/ktor-auth/test/io/ktor/tests/auth/OAuth1a.kt b/ktor-features/ktor-auth/jvm/test/io/ktor/tests/auth/OAuth1a.kt similarity index 100% rename from ktor-features/ktor-auth/test/io/ktor/tests/auth/OAuth1a.kt rename to ktor-features/ktor-auth/jvm/test/io/ktor/tests/auth/OAuth1a.kt diff --git a/ktor-features/ktor-auth/test/io/ktor/tests/auth/OAuth2.kt b/ktor-features/ktor-auth/jvm/test/io/ktor/tests/auth/OAuth2.kt similarity index 100% rename from ktor-features/ktor-auth/test/io/ktor/tests/auth/OAuth2.kt rename to ktor-features/ktor-auth/jvm/test/io/ktor/tests/auth/OAuth2.kt diff --git a/ktor-features/ktor-auth/test/io/ktor/tests/auth/SessionAuthTest.kt b/ktor-features/ktor-auth/jvm/test/io/ktor/tests/auth/SessionAuthTest.kt similarity index 100% rename from ktor-features/ktor-auth/test/io/ktor/tests/auth/SessionAuthTest.kt rename to ktor-features/ktor-auth/jvm/test/io/ktor/tests/auth/SessionAuthTest.kt diff --git a/ktor-features/ktor-auth/test/io/ktor/tests/auth/UserHashedTableAuthTest.kt b/ktor-features/ktor-auth/jvm/test/io/ktor/tests/auth/UserHashedTableAuthTest.kt similarity index 100% rename from ktor-features/ktor-auth/test/io/ktor/tests/auth/UserHashedTableAuthTest.kt rename to ktor-features/ktor-auth/jvm/test/io/ktor/tests/auth/UserHashedTableAuthTest.kt diff --git a/ktor-features/ktor-freemarker/build.gradle b/ktor-features/ktor-freemarker/build.gradle index b2af6b9312..a63dae5b1d 100644 --- a/ktor-features/ktor-freemarker/build.gradle +++ b/ktor-features/ktor-freemarker/build.gradle @@ -1,4 +1,5 @@ description = '' -dependencies { - compile group: 'org.freemarker', name: 'freemarker', version: '[2.3.20, 2.4)' + +kotlin.sourceSets.jvmMain.dependencies { + api group: 'org.freemarker', name: 'freemarker', version: '[2.3.20, 2.4)' } diff --git a/ktor-features/ktor-freemarker/src/io/ktor/freemarker/FreeMarker.kt b/ktor-features/ktor-freemarker/jvm/src/io/ktor/freemarker/FreeMarker.kt similarity index 100% rename from ktor-features/ktor-freemarker/src/io/ktor/freemarker/FreeMarker.kt rename to ktor-features/ktor-freemarker/jvm/src/io/ktor/freemarker/FreeMarker.kt diff --git a/ktor-features/ktor-freemarker/src/io/ktor/freemarker/RespondTemplate.kt b/ktor-features/ktor-freemarker/jvm/src/io/ktor/freemarker/RespondTemplate.kt similarity index 100% rename from ktor-features/ktor-freemarker/src/io/ktor/freemarker/RespondTemplate.kt rename to ktor-features/ktor-freemarker/jvm/src/io/ktor/freemarker/RespondTemplate.kt diff --git a/ktor-features/ktor-freemarker/test/io/ktor/tests/freemarker/FreeMarkerTest.kt b/ktor-features/ktor-freemarker/jvm/test/io/ktor/tests/freemarker/FreeMarkerTest.kt similarity index 100% rename from ktor-features/ktor-freemarker/test/io/ktor/tests/freemarker/FreeMarkerTest.kt rename to ktor-features/ktor-freemarker/jvm/test/io/ktor/tests/freemarker/FreeMarkerTest.kt diff --git a/ktor-features/ktor-gson/build.gradle b/ktor-features/ktor-gson/build.gradle index efc972e899..c89e90a15d 100644 --- a/ktor-features/ktor-gson/build.gradle +++ b/ktor-features/ktor-gson/build.gradle @@ -1,6 +1,5 @@ description = '' -dependencies { - compile group: 'com.google.code.gson', name: 'gson', version: gson_version - - compile project(":ktor-utils:ktor-utils-jvm") +kotlin.sourceSets.jvmMain.dependencies { + api project(':ktor-utils') + api group: 'com.google.code.gson', name: 'gson', version: gson_version } diff --git a/ktor-features/ktor-gson/src/io/ktor/gson/GsonSupport.kt b/ktor-features/ktor-gson/jvm/src/io/ktor/gson/GsonSupport.kt similarity index 100% rename from ktor-features/ktor-gson/src/io/ktor/gson/GsonSupport.kt rename to ktor-features/ktor-gson/jvm/src/io/ktor/gson/GsonSupport.kt diff --git a/ktor-features/ktor-gson/test/io/ktor/tests/gson/GsonTest.kt b/ktor-features/ktor-gson/jvm/test/io/ktor/tests/gson/GsonTest.kt similarity index 100% rename from ktor-features/ktor-gson/test/io/ktor/tests/gson/GsonTest.kt rename to ktor-features/ktor-gson/jvm/test/io/ktor/tests/gson/GsonTest.kt diff --git a/ktor-features/ktor-html-builder/build.gradle b/ktor-features/ktor-html-builder/build.gradle index ebf0aeb395..9f57758c0f 100644 --- a/ktor-features/ktor-html-builder/build.gradle +++ b/ktor-features/ktor-html-builder/build.gradle @@ -1,4 +1,4 @@ description = '' -dependencies { - compile group: 'org.jetbrains.kotlinx', name: 'kotlinx-html-jvm', version: '0.6.11' +kotlin.sourceSets.jvmMain.dependencies { + api group: 'org.jetbrains.kotlinx', name: 'kotlinx-html-jvm', version: '0.6.11' } diff --git a/ktor-features/ktor-html-builder/src/io/ktor/html/RespondHtml.kt b/ktor-features/ktor-html-builder/jvm/src/io/ktor/html/RespondHtml.kt similarity index 100% rename from ktor-features/ktor-html-builder/src/io/ktor/html/RespondHtml.kt rename to ktor-features/ktor-html-builder/jvm/src/io/ktor/html/RespondHtml.kt diff --git a/ktor-features/ktor-html-builder/src/io/ktor/html/RespondHtmlTemplate.kt b/ktor-features/ktor-html-builder/jvm/src/io/ktor/html/RespondHtmlTemplate.kt similarity index 100% rename from ktor-features/ktor-html-builder/src/io/ktor/html/RespondHtmlTemplate.kt rename to ktor-features/ktor-html-builder/jvm/src/io/ktor/html/RespondHtmlTemplate.kt diff --git a/ktor-features/ktor-html-builder/src/io/ktor/html/Template.kt b/ktor-features/ktor-html-builder/jvm/src/io/ktor/html/Template.kt similarity index 100% rename from ktor-features/ktor-html-builder/src/io/ktor/html/Template.kt rename to ktor-features/ktor-html-builder/jvm/src/io/ktor/html/Template.kt diff --git a/ktor-features/ktor-html-builder/test/io/ktor/tests/html/HtmlBuilderTest.kt b/ktor-features/ktor-html-builder/jvm/test/io/ktor/tests/html/HtmlBuilderTest.kt similarity index 100% rename from ktor-features/ktor-html-builder/test/io/ktor/tests/html/HtmlBuilderTest.kt rename to ktor-features/ktor-html-builder/jvm/test/io/ktor/tests/html/HtmlBuilderTest.kt diff --git a/ktor-features/ktor-html-builder/test/io/ktor/tests/html/HtmlTemplateTest.kt b/ktor-features/ktor-html-builder/jvm/test/io/ktor/tests/html/HtmlTemplateTest.kt similarity index 100% rename from ktor-features/ktor-html-builder/test/io/ktor/tests/html/HtmlTemplateTest.kt rename to ktor-features/ktor-html-builder/jvm/test/io/ktor/tests/html/HtmlTemplateTest.kt diff --git a/ktor-features/ktor-jackson/build.gradle b/ktor-features/ktor-jackson/build.gradle index 1296e5beb4..8c6e9884d5 100644 --- a/ktor-features/ktor-jackson/build.gradle +++ b/ktor-features/ktor-jackson/build.gradle @@ -1,4 +1,10 @@ description = '' -dependencies { - compile group: 'com.fasterxml.jackson.module', name: 'jackson-module-kotlin', version: '2.9.2' +kotlin { + sourceSets { + jvmMain { + dependencies { + api group: 'com.fasterxml.jackson.module', name: 'jackson-module-kotlin', version: '2.9.2' + } + } + } } diff --git a/ktor-features/ktor-jackson/src/io/ktor/jackson/JacksonConverter.kt b/ktor-features/ktor-jackson/jvm/src/io/ktor/jackson/JacksonConverter.kt similarity index 100% rename from ktor-features/ktor-jackson/src/io/ktor/jackson/JacksonConverter.kt rename to ktor-features/ktor-jackson/jvm/src/io/ktor/jackson/JacksonConverter.kt diff --git a/ktor-features/ktor-jackson/test/io/ktor/tests/jackson/JacksonTest.kt b/ktor-features/ktor-jackson/jvm/test/io/ktor/tests/jackson/JacksonTest.kt similarity index 100% rename from ktor-features/ktor-jackson/test/io/ktor/tests/jackson/JacksonTest.kt rename to ktor-features/ktor-jackson/jvm/test/io/ktor/tests/jackson/JacksonTest.kt diff --git a/ktor-features/ktor-locations/build.gradle b/ktor-features/ktor-locations/build.gradle index b66b74eeef..3a43998b94 100644 --- a/ktor-features/ktor-locations/build.gradle +++ b/ktor-features/ktor-locations/build.gradle @@ -1,4 +1,4 @@ description = '' -dependencies { - compile project(':ktor-features:ktor-auth') +kotlin.sourceSets.jvmMain.dependencies { + api project(':ktor-features:ktor-auth') } diff --git a/ktor-features/ktor-locations/src/io/ktor/locations/Location.kt b/ktor-features/ktor-locations/jvm/src/io/ktor/locations/Location.kt similarity index 100% rename from ktor-features/ktor-locations/src/io/ktor/locations/Location.kt rename to ktor-features/ktor-locations/jvm/src/io/ktor/locations/Location.kt diff --git a/ktor-features/ktor-locations/src/io/ktor/locations/Locations.kt b/ktor-features/ktor-locations/jvm/src/io/ktor/locations/Locations.kt similarity index 100% rename from ktor-features/ktor-locations/src/io/ktor/locations/Locations.kt rename to ktor-features/ktor-locations/jvm/src/io/ktor/locations/Locations.kt diff --git a/ktor-features/ktor-locations/src/io/ktor/locations/URLBuilder.kt b/ktor-features/ktor-locations/jvm/src/io/ktor/locations/URLBuilder.kt similarity index 100% rename from ktor-features/ktor-locations/src/io/ktor/locations/URLBuilder.kt rename to ktor-features/ktor-locations/jvm/src/io/ktor/locations/URLBuilder.kt diff --git a/ktor-features/ktor-locations/test/io/ktor/tests/locations/CustomLocationsTest.kt b/ktor-features/ktor-locations/jvm/test/io/ktor/tests/locations/CustomLocationsTest.kt similarity index 100% rename from ktor-features/ktor-locations/test/io/ktor/tests/locations/CustomLocationsTest.kt rename to ktor-features/ktor-locations/jvm/test/io/ktor/tests/locations/CustomLocationsTest.kt diff --git a/ktor-features/ktor-locations/test/io/ktor/tests/locations/LocationsTest.kt b/ktor-features/ktor-locations/jvm/test/io/ktor/tests/locations/LocationsTest.kt similarity index 100% rename from ktor-features/ktor-locations/test/io/ktor/tests/locations/LocationsTest.kt rename to ktor-features/ktor-locations/jvm/test/io/ktor/tests/locations/LocationsTest.kt diff --git a/ktor-features/ktor-locations/test/io/ktor/tests/locations/OAuthLocationsTest.kt b/ktor-features/ktor-locations/jvm/test/io/ktor/tests/locations/OAuthLocationsTest.kt similarity index 100% rename from ktor-features/ktor-locations/test/io/ktor/tests/locations/OAuthLocationsTest.kt rename to ktor-features/ktor-locations/jvm/test/io/ktor/tests/locations/OAuthLocationsTest.kt diff --git a/ktor-features/ktor-locations/test/io/ktor/tests/locations/Verifiers.kt b/ktor-features/ktor-locations/jvm/test/io/ktor/tests/locations/Verifiers.kt similarity index 100% rename from ktor-features/ktor-locations/test/io/ktor/tests/locations/Verifiers.kt rename to ktor-features/ktor-locations/jvm/test/io/ktor/tests/locations/Verifiers.kt diff --git a/ktor-features/ktor-metrics/build.gradle b/ktor-features/ktor-metrics/build.gradle index bfdb5fd863..eeaed058f5 100644 --- a/ktor-features/ktor-metrics/build.gradle +++ b/ktor-features/ktor-metrics/build.gradle @@ -1,5 +1,11 @@ description = '' -dependencies { - compile group: 'io.dropwizard.metrics', name: 'metrics-core', version: '3.2.4' - compile group: 'io.dropwizard.metrics', name: 'metrics-jvm', version: '3.2.4' +kotlin { + sourceSets { + jvmMain { + dependencies { + api group: 'io.dropwizard.metrics', name: 'metrics-core', version: '3.2.4' + api group: 'io.dropwizard.metrics', name: 'metrics-jvm', version: '3.2.4' + } + } + } } diff --git a/ktor-features/ktor-metrics/src/io/ktor/metrics/Metrics.kt b/ktor-features/ktor-metrics/jvm/src/io/ktor/metrics/Metrics.kt similarity index 100% rename from ktor-features/ktor-metrics/src/io/ktor/metrics/Metrics.kt rename to ktor-features/ktor-metrics/jvm/src/io/ktor/metrics/Metrics.kt diff --git a/ktor-features/ktor-mustache/build.gradle b/ktor-features/ktor-mustache/build.gradle index 6f3aaf274f..c90681046f 100644 --- a/ktor-features/ktor-mustache/build.gradle +++ b/ktor-features/ktor-mustache/build.gradle @@ -1,4 +1,5 @@ description = '' -dependencies { - compile group: 'com.github.spullara.mustache.java', name: 'compiler', version: '0.9.5' + +kotlin.sourceSets.jvmMain.dependencies { + api group: 'com.github.spullara.mustache.java', name: 'compiler', version: '0.9.5' } diff --git a/ktor-features/ktor-mustache/src/io/ktor/mustache/Mustache.kt b/ktor-features/ktor-mustache/jvm/src/io/ktor/mustache/Mustache.kt similarity index 100% rename from ktor-features/ktor-mustache/src/io/ktor/mustache/Mustache.kt rename to ktor-features/ktor-mustache/jvm/src/io/ktor/mustache/Mustache.kt diff --git a/ktor-features/ktor-mustache/src/io/ktor/mustache/RespondTemplate.kt b/ktor-features/ktor-mustache/jvm/src/io/ktor/mustache/RespondTemplate.kt similarity index 100% rename from ktor-features/ktor-mustache/src/io/ktor/mustache/RespondTemplate.kt rename to ktor-features/ktor-mustache/jvm/src/io/ktor/mustache/RespondTemplate.kt diff --git a/ktor-features/ktor-mustache/test-resources/withPlaceholder.mustache b/ktor-features/ktor-mustache/jvm/test-resources/withPlaceholder.mustache similarity index 100% rename from ktor-features/ktor-mustache/test-resources/withPlaceholder.mustache rename to ktor-features/ktor-mustache/jvm/test-resources/withPlaceholder.mustache diff --git a/ktor-features/ktor-mustache/test-resources/withoutPlaceholder.mustache b/ktor-features/ktor-mustache/jvm/test-resources/withoutPlaceholder.mustache similarity index 100% rename from ktor-features/ktor-mustache/test-resources/withoutPlaceholder.mustache rename to ktor-features/ktor-mustache/jvm/test-resources/withoutPlaceholder.mustache diff --git a/ktor-features/ktor-mustache/test/io/ktor/mustache/MustacheTest.kt b/ktor-features/ktor-mustache/jvm/test/io/ktor/mustache/MustacheTest.kt similarity index 100% rename from ktor-features/ktor-mustache/test/io/ktor/mustache/MustacheTest.kt rename to ktor-features/ktor-mustache/jvm/test/io/ktor/mustache/MustacheTest.kt diff --git a/ktor-features/ktor-server-sessions/src/io/ktor/sessions/Cache.kt b/ktor-features/ktor-server-sessions/jvm/src/io/ktor/sessions/Cache.kt similarity index 100% rename from ktor-features/ktor-server-sessions/src/io/ktor/sessions/Cache.kt rename to ktor-features/ktor-server-sessions/jvm/src/io/ktor/sessions/Cache.kt diff --git a/ktor-features/ktor-server-sessions/src/io/ktor/sessions/CacheStorage.kt b/ktor-features/ktor-server-sessions/jvm/src/io/ktor/sessions/CacheStorage.kt similarity index 100% rename from ktor-features/ktor-server-sessions/src/io/ktor/sessions/CacheStorage.kt rename to ktor-features/ktor-server-sessions/jvm/src/io/ktor/sessions/CacheStorage.kt diff --git a/ktor-features/ktor-server-sessions/src/io/ktor/sessions/DirectoryStorage.kt b/ktor-features/ktor-server-sessions/jvm/src/io/ktor/sessions/DirectoryStorage.kt similarity index 100% rename from ktor-features/ktor-server-sessions/src/io/ktor/sessions/DirectoryStorage.kt rename to ktor-features/ktor-server-sessions/jvm/src/io/ktor/sessions/DirectoryStorage.kt diff --git a/ktor-features/ktor-server-sessions/test/io/ktor/tests/sessions/CacheTest.kt b/ktor-features/ktor-server-sessions/jvm/test/io/ktor/tests/sessions/CacheTest.kt similarity index 100% rename from ktor-features/ktor-server-sessions/test/io/ktor/tests/sessions/CacheTest.kt rename to ktor-features/ktor-server-sessions/jvm/test/io/ktor/tests/sessions/CacheTest.kt diff --git a/ktor-features/ktor-server-sessions/test/io/ktor/tests/sessions/DirectorySessionStorageTest.kt b/ktor-features/ktor-server-sessions/jvm/test/io/ktor/tests/sessions/DirectorySessionStorageTest.kt similarity index 100% rename from ktor-features/ktor-server-sessions/test/io/ktor/tests/sessions/DirectorySessionStorageTest.kt rename to ktor-features/ktor-server-sessions/jvm/test/io/ktor/tests/sessions/DirectorySessionStorageTest.kt diff --git a/ktor-features/ktor-velocity/build.gradle b/ktor-features/ktor-velocity/build.gradle index 4455a94eab..7dd9c8835c 100644 --- a/ktor-features/ktor-velocity/build.gradle +++ b/ktor-features/ktor-velocity/build.gradle @@ -1,4 +1,10 @@ description = '' -dependencies { - compile group: 'org.apache.velocity', name: 'velocity-engine-core', version: '[2.0, 2.1)' +kotlin { + sourceSets { + jvmMain { + dependencies { + api group: 'org.apache.velocity', name: 'velocity-engine-core', version: '[2.0, 2.1)' + } + } + } } diff --git a/ktor-features/ktor-velocity/src/io/ktor/velocity/RespondTemplate.kt b/ktor-features/ktor-velocity/jvm/src/io/ktor/velocity/RespondTemplate.kt similarity index 100% rename from ktor-features/ktor-velocity/src/io/ktor/velocity/RespondTemplate.kt rename to ktor-features/ktor-velocity/jvm/src/io/ktor/velocity/RespondTemplate.kt diff --git a/ktor-features/ktor-velocity/src/io/ktor/velocity/Velocity.kt b/ktor-features/ktor-velocity/jvm/src/io/ktor/velocity/Velocity.kt similarity index 100% rename from ktor-features/ktor-velocity/src/io/ktor/velocity/Velocity.kt rename to ktor-features/ktor-velocity/jvm/src/io/ktor/velocity/Velocity.kt diff --git a/ktor-features/ktor-velocity/test/io/ktor/tests/velocity/VelocityTest.kt b/ktor-features/ktor-velocity/jvm/test/io/ktor/tests/velocity/VelocityTest.kt similarity index 100% rename from ktor-features/ktor-velocity/test/io/ktor/tests/velocity/VelocityTest.kt rename to ktor-features/ktor-velocity/jvm/test/io/ktor/tests/velocity/VelocityTest.kt diff --git a/ktor-features/ktor-webjars/build.gradle b/ktor-features/ktor-webjars/build.gradle index cdbc9671c8..26735ff644 100644 --- a/ktor-features/ktor-webjars/build.gradle +++ b/ktor-features/ktor-webjars/build.gradle @@ -1,5 +1,17 @@ description = '' -dependencies { - compile group: 'org.webjars', name: 'webjars-locator-core', version: '0.35' - testCompile group: 'org.webjars', name: 'jquery', version: '3.3.1' + +kotlin { + sourceSets { + jvmMain { + dependencies { + api group: 'org.webjars', name: 'webjars-locator-core', version: '0.35' + } + } + jvmTest { + dependencies { + api group: 'org.webjars', name: 'jquery', version: '3.3.1' + } + + } + } } diff --git a/ktor-features/ktor-webjars/src/io/ktor/webjars/Webjars.kt b/ktor-features/ktor-webjars/jvm/src/io/ktor/webjars/Webjars.kt similarity index 86% rename from ktor-features/ktor-webjars/src/io/ktor/webjars/Webjars.kt rename to ktor-features/ktor-webjars/jvm/src/io/ktor/webjars/Webjars.kt index a14105547e..1299c8f5fc 100644 --- a/ktor-features/ktor-webjars/src/io/ktor/webjars/Webjars.kt +++ b/ktor-features/ktor-webjars/jvm/src/io/ktor/webjars/Webjars.kt @@ -55,7 +55,13 @@ class Webjars(val configuration: Configuration) { val resourcePath = fullPath.removePrefix(configuration.path) try { val location = extractWebJar(resourcePath) - context.call.respond(InputStreamContent(Webjars::class.java.classLoader.getResourceAsStream(location), ContentType.defaultForFilePath(fileName), lastModified)) + context.call.respond( + InputStreamContent( + Webjars::class.java.classLoader.getResourceAsStream(location), + ContentType.defaultForFilePath(fileName), + lastModified + ) + ) } catch (multipleFiles: MultipleMatchesException) { context.call.respond(HttpStatusCode.InternalServerError) } catch (notFound: IllegalArgumentException) { @@ -83,7 +89,11 @@ class Webjars(val configuration: Configuration) { } -private class InputStreamContent(val input: InputStream, override val contentType: ContentType, val lastModified: ZonedDateTime) : OutgoingContent.ReadChannelContent() { +private class InputStreamContent( + val input: InputStream, + override val contentType: ContentType, + val lastModified: ZonedDateTime +) : OutgoingContent.ReadChannelContent() { init { versions += LastModifiedVersion(lastModified) } diff --git a/ktor-features/ktor-webjars/test/io/ktor/webjars/WebjarsTest.kt b/ktor-features/ktor-webjars/jvm/test/io/ktor/webjars/WebjarsTest.kt similarity index 100% rename from ktor-features/ktor-webjars/test/io/ktor/webjars/WebjarsTest.kt rename to ktor-features/ktor-webjars/jvm/test/io/ktor/webjars/WebjarsTest.kt diff --git a/ktor-features/ktor-websockets/build.gradle b/ktor-features/ktor-websockets/build.gradle index 289fc6c186..21572d53d0 100644 --- a/ktor-features/ktor-websockets/build.gradle +++ b/ktor-features/ktor-websockets/build.gradle @@ -1,9 +1,12 @@ description = '' -dependencies { - compile project(':ktor-http:ktor-http-cio') - - testCompile project(':ktor-server:ktor-server-jetty') - testCompile project(':ktor-server:ktor-server-netty') - testCompile project(':ktor-server:ktor-server-tomcat') - testCompile project(':ktor-server:ktor-server-cio') +kotlin.sourceSets { + jvmMain.dependencies { + api project(':ktor-http:ktor-http-cio') + } + jvmTest.dependencies { + api project(':ktor-server:ktor-server-jetty') + api project(':ktor-server:ktor-server-netty') + api project(':ktor-server:ktor-server-tomcat') + api project(':ktor-server:ktor-server-cio') + } } diff --git a/ktor-features/ktor-websockets/src/io/ktor/websocket/Routing.kt b/ktor-features/ktor-websockets/jvm/src/io/ktor/websocket/Routing.kt similarity index 100% rename from ktor-features/ktor-websockets/src/io/ktor/websocket/Routing.kt rename to ktor-features/ktor-websockets/jvm/src/io/ktor/websocket/Routing.kt diff --git a/ktor-features/ktor-websockets/src/io/ktor/websocket/WebSocketServerSession.kt b/ktor-features/ktor-websockets/jvm/src/io/ktor/websocket/WebSocketServerSession.kt similarity index 100% rename from ktor-features/ktor-websockets/src/io/ktor/websocket/WebSocketServerSession.kt rename to ktor-features/ktor-websockets/jvm/src/io/ktor/websocket/WebSocketServerSession.kt diff --git a/ktor-features/ktor-websockets/src/io/ktor/websocket/WebSocketUpgrade.kt b/ktor-features/ktor-websockets/jvm/src/io/ktor/websocket/WebSocketUpgrade.kt similarity index 100% rename from ktor-features/ktor-websockets/src/io/ktor/websocket/WebSocketUpgrade.kt rename to ktor-features/ktor-websockets/jvm/src/io/ktor/websocket/WebSocketUpgrade.kt diff --git a/ktor-features/ktor-websockets/src/io/ktor/websocket/WebSockets.kt b/ktor-features/ktor-websockets/jvm/src/io/ktor/websocket/WebSockets.kt similarity index 100% rename from ktor-features/ktor-websockets/src/io/ktor/websocket/WebSockets.kt rename to ktor-features/ktor-websockets/jvm/src/io/ktor/websocket/WebSockets.kt diff --git a/ktor-features/ktor-websockets/test/io/ktor/tests/websocket/CIOWebSocketTest.kt b/ktor-features/ktor-websockets/jvm/test/io/ktor/tests/websocket/CIOWebSocketTest.kt similarity index 100% rename from ktor-features/ktor-websockets/test/io/ktor/tests/websocket/CIOWebSocketTest.kt rename to ktor-features/ktor-websockets/jvm/test/io/ktor/tests/websocket/CIOWebSocketTest.kt diff --git a/ktor-features/ktor-websockets/test/io/ktor/tests/websocket/JettyWebSocketTest.kt b/ktor-features/ktor-websockets/jvm/test/io/ktor/tests/websocket/JettyWebSocketTest.kt similarity index 100% rename from ktor-features/ktor-websockets/test/io/ktor/tests/websocket/JettyWebSocketTest.kt rename to ktor-features/ktor-websockets/jvm/test/io/ktor/tests/websocket/JettyWebSocketTest.kt diff --git a/ktor-features/ktor-websockets/test/io/ktor/tests/websocket/NettyWebSocketTest.kt b/ktor-features/ktor-websockets/jvm/test/io/ktor/tests/websocket/NettyWebSocketTest.kt similarity index 100% rename from ktor-features/ktor-websockets/test/io/ktor/tests/websocket/NettyWebSocketTest.kt rename to ktor-features/ktor-websockets/jvm/test/io/ktor/tests/websocket/NettyWebSocketTest.kt diff --git a/ktor-features/ktor-websockets/test/io/ktor/tests/websocket/ParserTest.kt b/ktor-features/ktor-websockets/jvm/test/io/ktor/tests/websocket/ParserTest.kt similarity index 100% rename from ktor-features/ktor-websockets/test/io/ktor/tests/websocket/ParserTest.kt rename to ktor-features/ktor-websockets/jvm/test/io/ktor/tests/websocket/ParserTest.kt diff --git a/ktor-features/ktor-websockets/test/io/ktor/tests/websocket/TomcatWebSocketTest.kt b/ktor-features/ktor-websockets/jvm/test/io/ktor/tests/websocket/TomcatWebSocketTest.kt similarity index 100% rename from ktor-features/ktor-websockets/test/io/ktor/tests/websocket/TomcatWebSocketTest.kt rename to ktor-features/ktor-websockets/jvm/test/io/ktor/tests/websocket/TomcatWebSocketTest.kt diff --git a/ktor-features/ktor-websockets/test/io/ktor/tests/websocket/WebSocketEngineSuite.kt b/ktor-features/ktor-websockets/jvm/test/io/ktor/tests/websocket/WebSocketEngineSuite.kt similarity index 100% rename from ktor-features/ktor-websockets/test/io/ktor/tests/websocket/WebSocketEngineSuite.kt rename to ktor-features/ktor-websockets/jvm/test/io/ktor/tests/websocket/WebSocketEngineSuite.kt diff --git a/ktor-features/ktor-websockets/test/io/ktor/tests/websocket/WebSocketTest.kt b/ktor-features/ktor-websockets/jvm/test/io/ktor/tests/websocket/WebSocketTest.kt similarity index 100% rename from ktor-features/ktor-websockets/test/io/ktor/tests/websocket/WebSocketTest.kt rename to ktor-features/ktor-websockets/jvm/test/io/ktor/tests/websocket/WebSocketTest.kt diff --git a/ktor-features/ktor-websockets/test/io/ktor/tests/websocket/WebSocketWithContentNegotiationTest.kt b/ktor-features/ktor-websockets/jvm/test/io/ktor/tests/websocket/WebSocketWithContentNegotiationTest.kt similarity index 100% rename from ktor-features/ktor-websockets/test/io/ktor/tests/websocket/WebSocketWithContentNegotiationTest.kt rename to ktor-features/ktor-websockets/jvm/test/io/ktor/tests/websocket/WebSocketWithContentNegotiationTest.kt diff --git a/ktor-features/ktor-websockets/test/io/ktor/tests/websocket/WriterTest.kt b/ktor-features/ktor-websockets/jvm/test/io/ktor/tests/websocket/WriterTest.kt similarity index 100% rename from ktor-features/ktor-websockets/test/io/ktor/tests/websocket/WriterTest.kt rename to ktor-features/ktor-websockets/jvm/test/io/ktor/tests/websocket/WriterTest.kt diff --git a/ktor-http/build.gradle b/ktor-http/build.gradle index b010bb66a7..27d0d331c7 100644 --- a/ktor-http/build.gradle +++ b/ktor-http/build.gradle @@ -1,5 +1,5 @@ description = 'io.ktor http-core' -dependencies { - compile project(':ktor-utils') +kotlin.sourceSets.commonMain.dependencies { + api project(':ktor-utils') } diff --git a/ktor-http/src/io/ktor/content/Compatibility.kt b/ktor-http/common/src/io/ktor/content/Compatibility.kt similarity index 100% rename from ktor-http/src/io/ktor/content/Compatibility.kt rename to ktor-http/common/src/io/ktor/content/Compatibility.kt diff --git a/ktor-http/src/io/ktor/http/ApplicationResponseProperties.kt b/ktor-http/common/src/io/ktor/http/ApplicationResponseProperties.kt similarity index 100% rename from ktor-http/src/io/ktor/http/ApplicationResponseProperties.kt rename to ktor-http/common/src/io/ktor/http/ApplicationResponseProperties.kt diff --git a/ktor-http/src/io/ktor/http/CacheControl.kt b/ktor-http/common/src/io/ktor/http/CacheControl.kt similarity index 100% rename from ktor-http/src/io/ktor/http/CacheControl.kt rename to ktor-http/common/src/io/ktor/http/CacheControl.kt diff --git a/ktor-http/src/io/ktor/http/Codecs.kt b/ktor-http/common/src/io/ktor/http/Codecs.kt similarity index 100% rename from ktor-http/src/io/ktor/http/Codecs.kt rename to ktor-http/common/src/io/ktor/http/Codecs.kt diff --git a/ktor-http/src/io/ktor/http/ContentDisposition.kt b/ktor-http/common/src/io/ktor/http/ContentDisposition.kt similarity index 100% rename from ktor-http/src/io/ktor/http/ContentDisposition.kt rename to ktor-http/common/src/io/ktor/http/ContentDisposition.kt diff --git a/ktor-http/src/io/ktor/http/ContentRange.kt b/ktor-http/common/src/io/ktor/http/ContentRange.kt similarity index 100% rename from ktor-http/src/io/ktor/http/ContentRange.kt rename to ktor-http/common/src/io/ktor/http/ContentRange.kt diff --git a/ktor-http/src/io/ktor/http/ContentTypes.kt b/ktor-http/common/src/io/ktor/http/ContentTypes.kt similarity index 100% rename from ktor-http/src/io/ktor/http/ContentTypes.kt rename to ktor-http/common/src/io/ktor/http/ContentTypes.kt diff --git a/ktor-http/src/io/ktor/http/Cookie.kt b/ktor-http/common/src/io/ktor/http/Cookie.kt similarity index 100% rename from ktor-http/src/io/ktor/http/Cookie.kt rename to ktor-http/common/src/io/ktor/http/Cookie.kt diff --git a/ktor-http/src/io/ktor/http/DateUtils.kt b/ktor-http/common/src/io/ktor/http/DateUtils.kt similarity index 100% rename from ktor-http/src/io/ktor/http/DateUtils.kt rename to ktor-http/common/src/io/ktor/http/DateUtils.kt diff --git a/ktor-http/src/io/ktor/http/FileContentType.kt b/ktor-http/common/src/io/ktor/http/FileContentType.kt similarity index 100% rename from ktor-http/src/io/ktor/http/FileContentType.kt rename to ktor-http/common/src/io/ktor/http/FileContentType.kt diff --git a/ktor-http/src/io/ktor/http/HeaderValueWithParameters.kt b/ktor-http/common/src/io/ktor/http/HeaderValueWithParameters.kt similarity index 100% rename from ktor-http/src/io/ktor/http/HeaderValueWithParameters.kt rename to ktor-http/common/src/io/ktor/http/HeaderValueWithParameters.kt diff --git a/ktor-http/src/io/ktor/http/Headers.kt b/ktor-http/common/src/io/ktor/http/Headers.kt similarity index 100% rename from ktor-http/src/io/ktor/http/Headers.kt rename to ktor-http/common/src/io/ktor/http/Headers.kt diff --git a/ktor-http/src/io/ktor/http/HttpHeaderValueParser.kt b/ktor-http/common/src/io/ktor/http/HttpHeaderValueParser.kt similarity index 100% rename from ktor-http/src/io/ktor/http/HttpHeaderValueParser.kt rename to ktor-http/common/src/io/ktor/http/HttpHeaderValueParser.kt diff --git a/ktor-http/src/io/ktor/http/HttpHeaders.kt b/ktor-http/common/src/io/ktor/http/HttpHeaders.kt similarity index 100% rename from ktor-http/src/io/ktor/http/HttpHeaders.kt rename to ktor-http/common/src/io/ktor/http/HttpHeaders.kt diff --git a/ktor-http/src/io/ktor/http/HttpMessage.kt b/ktor-http/common/src/io/ktor/http/HttpMessage.kt similarity index 100% rename from ktor-http/src/io/ktor/http/HttpMessage.kt rename to ktor-http/common/src/io/ktor/http/HttpMessage.kt diff --git a/ktor-http/src/io/ktor/http/HttpMessageProperties.kt b/ktor-http/common/src/io/ktor/http/HttpMessageProperties.kt similarity index 100% rename from ktor-http/src/io/ktor/http/HttpMessageProperties.kt rename to ktor-http/common/src/io/ktor/http/HttpMessageProperties.kt diff --git a/ktor-http/src/io/ktor/http/HttpMethod.kt b/ktor-http/common/src/io/ktor/http/HttpMethod.kt similarity index 100% rename from ktor-http/src/io/ktor/http/HttpMethod.kt rename to ktor-http/common/src/io/ktor/http/HttpMethod.kt diff --git a/ktor-http/src/io/ktor/http/HttpProtocolVersion.kt b/ktor-http/common/src/io/ktor/http/HttpProtocolVersion.kt similarity index 100% rename from ktor-http/src/io/ktor/http/HttpProtocolVersion.kt rename to ktor-http/common/src/io/ktor/http/HttpProtocolVersion.kt diff --git a/ktor-http/src/io/ktor/http/HttpStatusCode.kt b/ktor-http/common/src/io/ktor/http/HttpStatusCode.kt similarity index 100% rename from ktor-http/src/io/ktor/http/HttpStatusCode.kt rename to ktor-http/common/src/io/ktor/http/HttpStatusCode.kt diff --git a/ktor-http/src/io/ktor/http/HttpUrlEncoded.kt b/ktor-http/common/src/io/ktor/http/HttpUrlEncoded.kt similarity index 100% rename from ktor-http/src/io/ktor/http/HttpUrlEncoded.kt rename to ktor-http/common/src/io/ktor/http/HttpUrlEncoded.kt diff --git a/ktor-http/src/io/ktor/http/IpParser.kt b/ktor-http/common/src/io/ktor/http/IpParser.kt similarity index 100% rename from ktor-http/src/io/ktor/http/IpParser.kt rename to ktor-http/common/src/io/ktor/http/IpParser.kt diff --git a/ktor-http/src/io/ktor/http/LinkHeader.kt b/ktor-http/common/src/io/ktor/http/LinkHeader.kt similarity index 100% rename from ktor-http/src/io/ktor/http/LinkHeader.kt rename to ktor-http/common/src/io/ktor/http/LinkHeader.kt diff --git a/ktor-http/src/io/ktor/http/Mimes.kt b/ktor-http/common/src/io/ktor/http/Mimes.kt similarity index 100% rename from ktor-http/src/io/ktor/http/Mimes.kt rename to ktor-http/common/src/io/ktor/http/Mimes.kt diff --git a/ktor-http/src/io/ktor/http/Parameters.kt b/ktor-http/common/src/io/ktor/http/Parameters.kt similarity index 100% rename from ktor-http/src/io/ktor/http/Parameters.kt rename to ktor-http/common/src/io/ktor/http/Parameters.kt diff --git a/ktor-http/src/io/ktor/http/Query.kt b/ktor-http/common/src/io/ktor/http/Query.kt similarity index 100% rename from ktor-http/src/io/ktor/http/Query.kt rename to ktor-http/common/src/io/ktor/http/Query.kt diff --git a/ktor-http/src/io/ktor/http/Ranges.kt b/ktor-http/common/src/io/ktor/http/Ranges.kt similarity index 100% rename from ktor-http/src/io/ktor/http/Ranges.kt rename to ktor-http/common/src/io/ktor/http/Ranges.kt diff --git a/ktor-http/src/io/ktor/http/RangesSpecifier.kt b/ktor-http/common/src/io/ktor/http/RangesSpecifier.kt similarity index 100% rename from ktor-http/src/io/ktor/http/RangesSpecifier.kt rename to ktor-http/common/src/io/ktor/http/RangesSpecifier.kt diff --git a/ktor-http/src/io/ktor/http/RequestConnectionPoint.kt b/ktor-http/common/src/io/ktor/http/RequestConnectionPoint.kt similarity index 100% rename from ktor-http/src/io/ktor/http/RequestConnectionPoint.kt rename to ktor-http/common/src/io/ktor/http/RequestConnectionPoint.kt diff --git a/ktor-http/src/io/ktor/http/URLBuilder.kt b/ktor-http/common/src/io/ktor/http/URLBuilder.kt similarity index 100% rename from ktor-http/src/io/ktor/http/URLBuilder.kt rename to ktor-http/common/src/io/ktor/http/URLBuilder.kt diff --git a/ktor-http/src/io/ktor/http/URLParser.kt b/ktor-http/common/src/io/ktor/http/URLParser.kt similarity index 100% rename from ktor-http/src/io/ktor/http/URLParser.kt rename to ktor-http/common/src/io/ktor/http/URLParser.kt diff --git a/ktor-http/src/io/ktor/http/URLProtocol.kt b/ktor-http/common/src/io/ktor/http/URLProtocol.kt similarity index 100% rename from ktor-http/src/io/ktor/http/URLProtocol.kt rename to ktor-http/common/src/io/ktor/http/URLProtocol.kt diff --git a/ktor-http/src/io/ktor/http/URLUtils.kt b/ktor-http/common/src/io/ktor/http/URLUtils.kt similarity index 100% rename from ktor-http/src/io/ktor/http/URLUtils.kt rename to ktor-http/common/src/io/ktor/http/URLUtils.kt diff --git a/ktor-http/src/io/ktor/http/auth/AuthScheme.kt b/ktor-http/common/src/io/ktor/http/auth/AuthScheme.kt similarity index 100% rename from ktor-http/src/io/ktor/http/auth/AuthScheme.kt rename to ktor-http/common/src/io/ktor/http/auth/AuthScheme.kt diff --git a/ktor-http/src/io/ktor/http/auth/HeaderValueEncoding.kt b/ktor-http/common/src/io/ktor/http/auth/HeaderValueEncoding.kt similarity index 100% rename from ktor-http/src/io/ktor/http/auth/HeaderValueEncoding.kt rename to ktor-http/common/src/io/ktor/http/auth/HeaderValueEncoding.kt diff --git a/ktor-http/src/io/ktor/http/auth/HttpAuthHeader.kt b/ktor-http/common/src/io/ktor/http/auth/HttpAuthHeader.kt similarity index 100% rename from ktor-http/src/io/ktor/http/auth/HttpAuthHeader.kt rename to ktor-http/common/src/io/ktor/http/auth/HttpAuthHeader.kt diff --git a/ktor-http/src/io/ktor/http/content/ByteArrayContent.kt b/ktor-http/common/src/io/ktor/http/content/ByteArrayContent.kt similarity index 100% rename from ktor-http/src/io/ktor/http/content/ByteArrayContent.kt rename to ktor-http/common/src/io/ktor/http/content/ByteArrayContent.kt diff --git a/ktor-http/src/io/ktor/http/content/CachingOptions.kt b/ktor-http/common/src/io/ktor/http/content/CachingOptions.kt similarity index 99% rename from ktor-http/src/io/ktor/http/content/CachingOptions.kt rename to ktor-http/common/src/io/ktor/http/content/CachingOptions.kt index 187c1c6911..6f31276efb 100644 --- a/ktor-http/src/io/ktor/http/content/CachingOptions.kt +++ b/ktor-http/common/src/io/ktor/http/content/CachingOptions.kt @@ -4,6 +4,13 @@ import io.ktor.http.* import io.ktor.util.* import io.ktor.util.date.* +/** + * Specifies caching properties for an [OutgoingContent] such as Cache-Control or Expires + * @property cacheControl header + * @property expires header + */ +data class CachingOptions(val cacheControl: CacheControl? = null, val expires: GMTDate? = null) + /** * Specifies a key for CacheControl extension property for [OutgoingContent] */ @@ -16,9 +23,3 @@ var OutgoingContent.caching: CachingOptions? get() = getProperty(CachingProperty) set(value) = setProperty(CachingProperty, value) -/** - * Specifies caching properties for an [OutgoingContent] such as Cache-Control or Expires - * @property cacheControl header - * @property expires header - */ -data class CachingOptions(val cacheControl: CacheControl? = null, val expires: GMTDate? = null) diff --git a/ktor-http/src/io/ktor/http/content/Multipart.kt b/ktor-http/common/src/io/ktor/http/content/Multipart.kt similarity index 100% rename from ktor-http/src/io/ktor/http/content/Multipart.kt rename to ktor-http/common/src/io/ktor/http/content/Multipart.kt diff --git a/ktor-http/src/io/ktor/http/content/OutgoingContent.kt b/ktor-http/common/src/io/ktor/http/content/OutgoingContent.kt similarity index 100% rename from ktor-http/src/io/ktor/http/content/OutgoingContent.kt rename to ktor-http/common/src/io/ktor/http/content/OutgoingContent.kt diff --git a/ktor-http/src/io/ktor/http/content/TextContent.kt b/ktor-http/common/src/io/ktor/http/content/TextContent.kt similarity index 100% rename from ktor-http/src/io/ktor/http/content/TextContent.kt rename to ktor-http/common/src/io/ktor/http/content/TextContent.kt diff --git a/ktor-http/src/io/ktor/http/parsing/Debug.kt b/ktor-http/common/src/io/ktor/http/parsing/Debug.kt similarity index 100% rename from ktor-http/src/io/ktor/http/parsing/Debug.kt rename to ktor-http/common/src/io/ktor/http/parsing/Debug.kt diff --git a/ktor-http/src/io/ktor/http/parsing/GrammarBuilder.kt b/ktor-http/common/src/io/ktor/http/parsing/GrammarBuilder.kt similarity index 100% rename from ktor-http/src/io/ktor/http/parsing/GrammarBuilder.kt rename to ktor-http/common/src/io/ktor/http/parsing/GrammarBuilder.kt diff --git a/ktor-http/src/io/ktor/http/parsing/Parser.kt b/ktor-http/common/src/io/ktor/http/parsing/Parser.kt similarity index 100% rename from ktor-http/src/io/ktor/http/parsing/Parser.kt rename to ktor-http/common/src/io/ktor/http/parsing/Parser.kt diff --git a/ktor-http/src/io/ktor/http/parsing/ParserDsl.kt b/ktor-http/common/src/io/ktor/http/parsing/ParserDsl.kt similarity index 100% rename from ktor-http/src/io/ktor/http/parsing/ParserDsl.kt rename to ktor-http/common/src/io/ktor/http/parsing/ParserDsl.kt diff --git a/ktor-http/src/io/ktor/http/parsing/Primitives.kt b/ktor-http/common/src/io/ktor/http/parsing/Primitives.kt similarity index 100% rename from ktor-http/src/io/ktor/http/parsing/Primitives.kt rename to ktor-http/common/src/io/ktor/http/parsing/Primitives.kt diff --git a/ktor-http/src/io/ktor/http/parsing/regex/RegexParser.kt b/ktor-http/common/src/io/ktor/http/parsing/regex/RegexParser.kt similarity index 100% rename from ktor-http/src/io/ktor/http/parsing/regex/RegexParser.kt rename to ktor-http/common/src/io/ktor/http/parsing/regex/RegexParser.kt diff --git a/ktor-http/src/io/ktor/http/parsing/regex/RegexParserGenerator.kt b/ktor-http/common/src/io/ktor/http/parsing/regex/RegexParserGenerator.kt similarity index 100% rename from ktor-http/src/io/ktor/http/parsing/regex/RegexParserGenerator.kt rename to ktor-http/common/src/io/ktor/http/parsing/regex/RegexParserGenerator.kt diff --git a/ktor-http/test/io/ktor/tests/http/CodecTest.kt b/ktor-http/common/test/io/ktor/tests/http/CodecTest.kt similarity index 100% rename from ktor-http/test/io/ktor/tests/http/CodecTest.kt rename to ktor-http/common/test/io/ktor/tests/http/CodecTest.kt diff --git a/ktor-http/test/io/ktor/tests/http/ContentTypeLookupTest.kt b/ktor-http/common/test/io/ktor/tests/http/ContentTypeLookupTest.kt similarity index 100% rename from ktor-http/test/io/ktor/tests/http/ContentTypeLookupTest.kt rename to ktor-http/common/test/io/ktor/tests/http/ContentTypeLookupTest.kt diff --git a/ktor-http/test/io/ktor/tests/http/ContentTypeMatchTest.kt b/ktor-http/common/test/io/ktor/tests/http/ContentTypeMatchTest.kt similarity index 100% rename from ktor-http/test/io/ktor/tests/http/ContentTypeMatchTest.kt rename to ktor-http/common/test/io/ktor/tests/http/ContentTypeMatchTest.kt diff --git a/ktor-http/test/io/ktor/tests/http/ContentTypeTest.kt b/ktor-http/common/test/io/ktor/tests/http/ContentTypeTest.kt similarity index 100% rename from ktor-http/test/io/ktor/tests/http/ContentTypeTest.kt rename to ktor-http/common/test/io/ktor/tests/http/ContentTypeTest.kt diff --git a/ktor-http/test/io/ktor/tests/http/HeadersTest.kt b/ktor-http/common/test/io/ktor/tests/http/HeadersTest.kt similarity index 100% rename from ktor-http/test/io/ktor/tests/http/HeadersTest.kt rename to ktor-http/common/test/io/ktor/tests/http/HeadersTest.kt diff --git a/ktor-http/test/io/ktor/tests/http/HttpStatusCodeTest.kt b/ktor-http/common/test/io/ktor/tests/http/HttpStatusCodeTest.kt similarity index 100% rename from ktor-http/test/io/ktor/tests/http/HttpStatusCodeTest.kt rename to ktor-http/common/test/io/ktor/tests/http/HttpStatusCodeTest.kt diff --git a/ktor-http/test/io/ktor/tests/http/QueryParametersTest.kt b/ktor-http/common/test/io/ktor/tests/http/QueryParametersTest.kt similarity index 100% rename from ktor-http/test/io/ktor/tests/http/QueryParametersTest.kt rename to ktor-http/common/test/io/ktor/tests/http/QueryParametersTest.kt diff --git a/ktor-http/test/io/ktor/tests/http/RangesTest.kt b/ktor-http/common/test/io/ktor/tests/http/RangesTest.kt similarity index 100% rename from ktor-http/test/io/ktor/tests/http/RangesTest.kt rename to ktor-http/common/test/io/ktor/tests/http/RangesTest.kt diff --git a/ktor-http/test/io/ktor/tests/http/URLBuilderTest.kt b/ktor-http/common/test/io/ktor/tests/http/URLBuilderTest.kt similarity index 100% rename from ktor-http/test/io/ktor/tests/http/URLBuilderTest.kt rename to ktor-http/common/test/io/ktor/tests/http/URLBuilderTest.kt diff --git a/ktor-http/test/io/ktor/tests/http/UrlTest.kt b/ktor-http/common/test/io/ktor/tests/http/UrlTest.kt similarity index 100% rename from ktor-http/test/io/ktor/tests/http/UrlTest.kt rename to ktor-http/common/test/io/ktor/tests/http/UrlTest.kt diff --git a/ktor-http/ktor-http-jvm/src/io/ktor/http/ApplicationResponsePropertiesJvm.kt b/ktor-http/jvm/src/io/ktor/http/ApplicationResponsePropertiesJvm.kt similarity index 100% rename from ktor-http/ktor-http-jvm/src/io/ktor/http/ApplicationResponsePropertiesJvm.kt rename to ktor-http/jvm/src/io/ktor/http/ApplicationResponsePropertiesJvm.kt diff --git a/ktor-http/ktor-http-jvm/src/io/ktor/http/FileContentTypeJvm.kt b/ktor-http/jvm/src/io/ktor/http/FileContentTypeJvm.kt similarity index 100% rename from ktor-http/ktor-http-jvm/src/io/ktor/http/FileContentTypeJvm.kt rename to ktor-http/jvm/src/io/ktor/http/FileContentTypeJvm.kt diff --git a/ktor-http/ktor-http-jvm/src/io/ktor/http/HttpDate.kt b/ktor-http/jvm/src/io/ktor/http/HttpDate.kt similarity index 100% rename from ktor-http/ktor-http-jvm/src/io/ktor/http/HttpDate.kt rename to ktor-http/jvm/src/io/ktor/http/HttpDate.kt diff --git a/ktor-http/ktor-http-jvm/src/io/ktor/http/HttpMessagePropertiesJvm.kt b/ktor-http/jvm/src/io/ktor/http/HttpMessagePropertiesJvm.kt similarity index 100% rename from ktor-http/ktor-http-jvm/src/io/ktor/http/HttpMessagePropertiesJvm.kt rename to ktor-http/jvm/src/io/ktor/http/HttpMessagePropertiesJvm.kt diff --git a/ktor-http/ktor-http-jvm/src/io/ktor/http/URLBuilderJvm.kt b/ktor-http/jvm/src/io/ktor/http/URLBuilderJvm.kt similarity index 100% rename from ktor-http/ktor-http-jvm/src/io/ktor/http/URLBuilderJvm.kt rename to ktor-http/jvm/src/io/ktor/http/URLBuilderJvm.kt diff --git a/ktor-http/ktor-http-jvm/src/io/ktor/http/URLUtilsJvm.kt b/ktor-http/jvm/src/io/ktor/http/URLUtilsJvm.kt similarity index 100% rename from ktor-http/ktor-http-jvm/src/io/ktor/http/URLUtilsJvm.kt rename to ktor-http/jvm/src/io/ktor/http/URLUtilsJvm.kt diff --git a/ktor-http/ktor-http-jvm/src/io/ktor/http/content/CachingOptionsJvm.kt b/ktor-http/jvm/src/io/ktor/http/content/CachingOptionsJvm.kt similarity index 100% rename from ktor-http/ktor-http-jvm/src/io/ktor/http/content/CachingOptionsJvm.kt rename to ktor-http/jvm/src/io/ktor/http/content/CachingOptionsJvm.kt diff --git a/ktor-http/ktor-http-jvm/src/io/ktor/http/content/JarFileContent.kt b/ktor-http/jvm/src/io/ktor/http/content/JarFileContent.kt similarity index 100% rename from ktor-http/ktor-http-jvm/src/io/ktor/http/content/JarFileContent.kt rename to ktor-http/jvm/src/io/ktor/http/content/JarFileContent.kt diff --git a/ktor-http/ktor-http-jvm/src/io/ktor/http/content/LocalFileContent.kt b/ktor-http/jvm/src/io/ktor/http/content/LocalFileContent.kt similarity index 100% rename from ktor-http/ktor-http-jvm/src/io/ktor/http/content/LocalFileContent.kt rename to ktor-http/jvm/src/io/ktor/http/content/LocalFileContent.kt diff --git a/ktor-http/ktor-http-jvm/src/io/ktor/http/content/MultipartJvm.kt b/ktor-http/jvm/src/io/ktor/http/content/MultipartJvm.kt similarity index 100% rename from ktor-http/ktor-http-jvm/src/io/ktor/http/content/MultipartJvm.kt rename to ktor-http/jvm/src/io/ktor/http/content/MultipartJvm.kt diff --git a/ktor-http/ktor-http-jvm/src/io/ktor/http/content/URIFileContent.kt b/ktor-http/jvm/src/io/ktor/http/content/URIFileContent.kt similarity index 83% rename from ktor-http/ktor-http-jvm/src/io/ktor/http/content/URIFileContent.kt rename to ktor-http/jvm/src/io/ktor/http/content/URIFileContent.kt index c46172d3ee..d152f73ce4 100644 --- a/ktor-http/ktor-http-jvm/src/io/ktor/http/content/URIFileContent.kt +++ b/ktor-http/jvm/src/io/ktor/http/content/URIFileContent.kt @@ -3,8 +3,14 @@ package io.ktor.http.content import io.ktor.util.cio.* import io.ktor.http.* import io.ktor.util.* +import kotlinx.coroutines.* +import kotlinx.coroutines.io.* import kotlinx.coroutines.io.jvm.javaio.* +import kotlinx.io.pool.* +import java.io.* import java.net.* +import java.nio.* +import kotlin.coroutines.* /** * Represents a content that is served from the specified [uri] diff --git a/ktor-http/ktor-http-jvm/src/io/ktor/http/content/Versions.kt b/ktor-http/jvm/src/io/ktor/http/content/Versions.kt similarity index 100% rename from ktor-http/ktor-http-jvm/src/io/ktor/http/content/Versions.kt rename to ktor-http/jvm/src/io/ktor/http/content/Versions.kt diff --git a/ktor-http/ktor-http-jvm/src/io/ktor/http/content/WriterContent.kt b/ktor-http/jvm/src/io/ktor/http/content/WriterContent.kt similarity index 100% rename from ktor-http/ktor-http-jvm/src/io/ktor/http/content/WriterContent.kt rename to ktor-http/jvm/src/io/ktor/http/content/WriterContent.kt diff --git a/ktor-http/ktor-http-jvm/src/io/ktor/http/websocket/Utils.kt b/ktor-http/jvm/src/io/ktor/http/websocket/Utils.kt similarity index 100% rename from ktor-http/ktor-http-jvm/src/io/ktor/http/websocket/Utils.kt rename to ktor-http/jvm/src/io/ktor/http/websocket/Utils.kt diff --git a/ktor-http/ktor-http-jvm/test/io/ktor/tests/http/URLBuilderJvmTest.kt b/ktor-http/jvm/test/io/ktor/tests/http/URLBuilderTest.kt similarity index 98% rename from ktor-http/ktor-http-jvm/test/io/ktor/tests/http/URLBuilderJvmTest.kt rename to ktor-http/jvm/test/io/ktor/tests/http/URLBuilderTest.kt index 14d1915ccb..d927d5dd92 100644 --- a/ktor-http/ktor-http-jvm/test/io/ktor/tests/http/URLBuilderJvmTest.kt +++ b/ktor-http/jvm/test/io/ktor/tests/http/URLBuilderTest.kt @@ -4,8 +4,7 @@ import io.ktor.http.* import java.net.* import kotlin.test.* - -class URLBuilderJvmTest { +class URLBuilderTestJvm { private val urlString = "http://localhost:8080/path" @Test diff --git a/ktor-http/ktor-http-cio/build.gradle b/ktor-http/ktor-http-cio/build.gradle index 58f02673a0..2c03d32797 100644 --- a/ktor-http/ktor-http-cio/build.gradle +++ b/ktor-http/ktor-http-cio/build.gradle @@ -1,5 +1,13 @@ description = '' -dependencies { - compile project(':ktor-http:ktor-http-jvm') - compile project(':ktor-network') + +project.ext.set("commonStructure", false) + +kotlin.sourceSets { + commonMain.dependencies { + api project(':ktor-http') + } + + jvmMain.dependencies { + api project(':ktor-network') + } } diff --git a/ktor-http/ktor-http-cio/src/io/ktor/http/cio/CIOHeaders.kt b/ktor-http/ktor-http-cio/common/src/io/ktor/http/cio/CIOHeaders.kt similarity index 96% rename from ktor-http/ktor-http-cio/src/io/ktor/http/cio/CIOHeaders.kt rename to ktor-http/ktor-http-cio/common/src/io/ktor/http/cio/CIOHeaders.kt index 213eee1425..b7ef00d309 100644 --- a/ktor-http/ktor-http-cio/src/io/ktor/http/cio/CIOHeaders.kt +++ b/ktor-http/ktor-http-cio/common/src/io/ktor/http/cio/CIOHeaders.kt @@ -18,7 +18,7 @@ class CIOHeaders(private val headers: HttpHeadersMap) : Headers { override val caseInsensitiveName: Boolean get() = true - override fun names() = names + override fun names(): Set = names override fun get(name: String): String? = headers[name]?.toString() override fun getAll(name: String): List = headers.getAll(name).map { it.toString() }.toList() diff --git a/ktor-http/ktor-http-cio/src/io/ktor/http/cio/ChunkedTransferEncoding.kt b/ktor-http/ktor-http-cio/common/src/io/ktor/http/cio/ChunkedTransferEncoding.kt similarity index 80% rename from ktor-http/ktor-http-cio/src/io/ktor/http/cio/ChunkedTransferEncoding.kt rename to ktor-http/ktor-http-cio/common/src/io/ktor/http/cio/ChunkedTransferEncoding.kt index 848e2e1f17..8e1543924b 100644 --- a/ktor-http/ktor-http-cio/src/io/ktor/http/cio/ChunkedTransferEncoding.kt +++ b/ktor-http/ktor-http-cio/common/src/io/ktor/http/cio/ChunkedTransferEncoding.kt @@ -1,7 +1,6 @@ package io.ktor.http.cio import io.ktor.http.cio.internals.* -import io.ktor.util.cio.* import kotlinx.coroutines.* import kotlinx.coroutines.io.* import kotlinx.io.core.* @@ -12,6 +11,8 @@ import kotlin.coroutines.* private const val MAX_CHUNK_SIZE_LENGTH = 128 private const val CHUNK_BUFFER_POOL_SIZE = 2048 +private const val DEFAULT_BYTE_BUFFER_SIZE = 4088 + private val ChunkSizeBufferPool: ObjectPool = object : DefaultPool(CHUNK_BUFFER_POOL_SIZE) { override fun produceInstance(): StringBuilder = StringBuilder(MAX_CHUNK_SIZE_LENGTH) @@ -92,33 +93,19 @@ suspend fun encodeChunked( * Chunked stream encoding loop */ suspend fun encodeChunked(output: ByteWriteChannel, input: ByteReadChannel) { - val buffer = DefaultByteBufferPool.borrow() val view = IoBuffer.Pool.borrow() view.byteOrder = ByteOrder.BIG_ENDIAN try { - while (true) { - while (buffer.hasRemaining()) { - val rc = input.readAvailable(buffer) - if (rc == -1) { - break - } + input.readSuspendableSession { + while (await(DEFAULT_BYTE_BUFFER_SIZE)) { + val content = request() ?: return@readSuspendableSession + output.writeChunk(content, view) } - buffer.flip() - if (!buffer.hasRemaining()) break - - view.resetForWrite() - view.writeIntHex(buffer.remaining()) - view.writeShort(CrLfShort) - - output.writeFully(view) - output.writeFully(buffer) - buffer.clear() - - output.writeFully(CrLf) - - if (input.availableForRead == 0) output.flush() + request()?.let { lastChunk -> + output.writeChunk(lastChunk, view) + } } output.writeFully(LastChunkBytes) @@ -126,7 +113,6 @@ suspend fun encodeChunked(output: ByteWriteChannel, input: ByteReadChannel) { output.close(cause) } finally { output.flush() - DefaultByteBufferPool.recycle(buffer) view.release(IoBuffer.Pool) } } @@ -136,6 +122,15 @@ private const val CrLfShort: Short = 0x0d0a private val CrLf = "\r\n".toByteArray() private val LastChunkBytes = "0\r\n\r\n".toByteArray() -private fun StringBuilder.clear() { - delete(0, length) +private suspend inline fun ByteWriteChannel.writeChunk(chunk: IoBuffer, tempBuffer: IoBuffer) { + val size = chunk.readRemaining + + tempBuffer.resetForWrite() + tempBuffer.writeIntHex(size) + tempBuffer.writeShort(CrLfShort) + + writeFully(tempBuffer) + writeFully(chunk) + writeFully(CrLf) + flush() } diff --git a/ktor-http/ktor-http-cio/src/io/ktor/http/cio/ConnectionOptions.kt b/ktor-http/ktor-http-cio/common/src/io/ktor/http/cio/ConnectionOptions.kt similarity index 69% rename from ktor-http/ktor-http-cio/src/io/ktor/http/cio/ConnectionOptions.kt rename to ktor-http/ktor-http-cio/common/src/io/ktor/http/cio/ConnectionOptions.kt index 8389a45141..7701d19c89 100644 --- a/ktor-http/ktor-http-cio/src/io/ktor/http/cio/ConnectionOptions.kt +++ b/ktor-http/ktor-http-cio/common/src/io/ktor/http/cio/ConnectionOptions.kt @@ -9,7 +9,12 @@ import io.ktor.http.cio.internals.* * @property upgrade `true` for `Connection: upgrade` * @property extraOptions a list of extra connection header options other than close, keep-alive and upgrade */ -class ConnectionOptions(val close: Boolean = false, val keepAlive: Boolean = false, val upgrade: Boolean = false, val extraOptions: List = emptyList()) { +class ConnectionOptions( + val close: Boolean = false, + val keepAlive: Boolean = false, + val upgrade: Boolean = false, + val extraOptions: List = emptyList() +) { companion object { /** * An instance for `Connection: close` @@ -27,7 +32,10 @@ class ConnectionOptions(val close: Boolean = false, val keepAlive: Boolean = fal val Upgrade = ConnectionOptions(upgrade = true) private val knownTypes = AsciiCharTree.build( - listOf("close" to Close, "keep-alive" to KeepAlive, "upgrade" to Upgrade), { it.first.length }, { t, idx -> t.first[idx] }) + listOf("close" to Close, "keep-alive" to KeepAlive, "upgrade" to Upgrade), + { it.first.length }, + { t, idx -> t.first[idx] } + ) /** * Parse `Connection` header value @@ -62,7 +70,9 @@ class ConnectionOptions(val close: Boolean = false, val keepAlive: Boolean = fal idx++ } - val detected = knownTypes.search(connection, start, idx, lowerCase = true, stopPredicate = { _, _ -> false }).singleOrNull() + val detected = knownTypes + .search(connection, start, idx, lowerCase = true, stopPredicate = { _, _ -> false }) + .singleOrNull() when { detected == null -> { if (hopHeadersList == null) { @@ -73,10 +83,12 @@ class ConnectionOptions(val close: Boolean = false, val keepAlive: Boolean = fal } connectionOptions == null -> connectionOptions = detected.second else -> { - connectionOptions = ConnectionOptions(close = connectionOptions.close || detected.second.close, - keepAlive = connectionOptions.keepAlive || detected.second.keepAlive, - upgrade = connectionOptions.upgrade || detected.second.upgrade, - extraOptions = emptyList()) + connectionOptions = ConnectionOptions( + close = connectionOptions.close || detected.second.close, + keepAlive = connectionOptions.keepAlive || detected.second.keepAlive, + upgrade = connectionOptions.upgrade || detected.second.upgrade, + extraOptions = emptyList() + ) } } } @@ -84,22 +96,25 @@ class ConnectionOptions(val close: Boolean = false, val keepAlive: Boolean = fal if (connectionOptions == null) connectionOptions = KeepAlive return if (hopHeadersList == null) connectionOptions - else ConnectionOptions(connectionOptions.close, connectionOptions.keepAlive, connectionOptions.upgrade, hopHeadersList) + else ConnectionOptions( + connectionOptions.close, + connectionOptions.keepAlive, + connectionOptions.upgrade, + hopHeadersList + ) } } - override fun toString(): String { - return when { - extraOptions.isEmpty() -> { - when { - close && !keepAlive && !upgrade -> "close" - !close && keepAlive && !upgrade -> "keep-alive" - !close && keepAlive && upgrade -> "keep-alive, Upgrade" - else -> buildToString() - } + override fun toString(): String = when { + extraOptions.isEmpty() -> { + when { + close && !keepAlive && !upgrade -> "close" + !close && keepAlive && !upgrade -> "keep-alive" + !close && keepAlive && upgrade -> "keep-alive, Upgrade" + else -> buildToString() } - else -> buildToString() } + else -> buildToString() } private fun buildToString() = buildString { @@ -117,7 +132,7 @@ class ConnectionOptions(val close: Boolean = false, val keepAlive: Boolean = fal override fun equals(other: Any?): Boolean { if (this === other) return true - if (javaClass != other?.javaClass) return false + if (other == null || this::class != other::class) return false other as ConnectionOptions diff --git a/ktor-http/ktor-http-cio/src/io/ktor/http/cio/HttpBody.kt b/ktor-http/ktor-http-cio/common/src/io/ktor/http/cio/HttpBody.kt similarity index 77% rename from ktor-http/ktor-http-cio/src/io/ktor/http/cio/HttpBody.kt rename to ktor-http/ktor-http-cio/common/src/io/ktor/http/cio/HttpBody.kt index d1165c3f34..5791b349ee 100644 --- a/ktor-http/ktor-http-cio/src/io/ktor/http/cio/HttpBody.kt +++ b/ktor-http/ktor-http-cio/common/src/io/ktor/http/cio/HttpBody.kt @@ -4,7 +4,6 @@ import io.ktor.http.* import io.ktor.http.cio.internals.* import io.ktor.util.* import kotlinx.coroutines.io.* -import java.io.* /** * @return `true` if an http upgrade is expected accoding to request [method], [upgrade] header value and @@ -40,19 +39,10 @@ fun expectHttpBody( connectionOptions: ConnectionOptions?, contentType: CharSequence? ): Boolean { - if (method == HttpMethod.Get || - method == HttpMethod.Head || - method == HttpMethod.Options - ) { - return false - } - - if (transferEncoding != null) return true - if (connectionOptions?.close == true) return true - if (contentLength != -1L) { - return contentLength > 0L - } + if (method == HttpMethod.Get || method == HttpMethod.Head || method == HttpMethod.Options) return false + if (transferEncoding != null || connectionOptions?.close == true) return true + if (contentLength != -1L) return contentLength > 0L if (contentType != null) return true return false @@ -88,7 +78,7 @@ suspend fun parseHttpBody( transferEncoding.equalsLowerCase(other = "identity") -> { // do nothing special } - else -> out.close(IOException("Unsupported transfer-encoding $transferEncoding")) + else -> out.close(IllegalStateException("Unsupported transfer-encoding $transferEncoding")) // TODO: combined transfer encodings } } @@ -103,13 +93,15 @@ suspend fun parseHttpBody( return } - out.close( - IOException( - "Failed to parse request body: request body length should be specified, " + - "chunked transfer encoding should be used or " + - "keep-alive should be disabled (connection: close)" - ) + val cause = IllegalStateException( + """ + Failed to parse request body: request body length should be specified, + chunked transfer encoding should be used or + keep-alive should be disabled (connection: close) + """.trimIndent() ) + + out.close(cause) } /** @@ -117,7 +109,11 @@ suspend fun parseHttpBody( * writing it to [out]. Usually doesn't fail but closing [out] channel with error. */ @KtorExperimentalAPI -suspend fun parseHttpBody(headers: HttpHeadersMap, input: ByteReadChannel, out: ByteWriteChannel): Unit = parseHttpBody( +suspend fun parseHttpBody( + headers: HttpHeadersMap, + input: ByteReadChannel, + out: ByteWriteChannel +): Unit = parseHttpBody( headers["Content-Length"]?.parseDecLong() ?: -1, headers["Transfer-Encoding"], ConnectionOptions.parse(headers["Connection"]), diff --git a/ktor-http/ktor-http-cio/src/io/ktor/http/cio/HttpHeadersMap.kt b/ktor-http/ktor-http-cio/common/src/io/ktor/http/cio/HttpHeadersMap.kt similarity index 87% rename from ktor-http/ktor-http-cio/src/io/ktor/http/cio/HttpHeadersMap.kt rename to ktor-http/ktor-http-cio/common/src/io/ktor/http/cio/HttpHeadersMap.kt index a9cbb6d3dc..484d8edf8a 100644 --- a/ktor-http/ktor-http-cio/src/io/ktor/http/cio/HttpHeadersMap.kt +++ b/ktor-http/ktor-http-cio/common/src/io/ktor/http/cio/HttpHeadersMap.kt @@ -27,13 +27,20 @@ private val EMPTY_INT_ARRAY = IntArray(0) */ @Suppress("KDocMissingDocumentation") @InternalAPI -class HttpHeadersMap internal constructor(private val builder: CharBufferBuilder) { +class HttpHeadersMap internal constructor(private val builder: CharArrayBuilder) { var size = 0 private set private var indexes = IntArrayPool.borrow() - fun put(nameHash: Int, valueHash: Int, nameStartIndex: Int, nameEndIndex: Int, valueStartIndex: Int, valueEndIndex: Int) { + fun put( + nameHash: Int, + valueHash: Int, + nameStartIndex: Int, + nameEndIndex: Int, + valueStartIndex: Int, + valueEndIndex: Int + ) { val base = size * HEADER_SIZE val array = indexes @@ -78,9 +85,9 @@ class HttpHeadersMap internal constructor(private val builder: CharBufferBuilder fun getAll(name: String): Sequence { val nameHash = name.hashCodeLowerCase() return generateSequence(0) { if (it + 1 >= size) null else it + 1 } - .map { it * HEADER_SIZE } - .filter { indexes[it] == nameHash } - .map { builder.subSequence(indexes[it + 4], indexes[it + 5]) } + .map { it * HEADER_SIZE } + .filter { indexes[it] == nameHash } + .map { builder.subSequence(indexes[it + 4], indexes[it + 5]) } } fun nameAt(idx: Int): CharSequence { @@ -136,6 +143,6 @@ fun HttpHeadersMap.dumpTo(indent: String, out: Appendable) { } } -private val IntArrayPool = object : DefaultPool(HEADER_ARRAY_POOL_SIZE) { +private val IntArrayPool: DefaultPool = object : DefaultPool(HEADER_ARRAY_POOL_SIZE) { override fun produceInstance(): IntArray = IntArray(EXPECTED_HEADERS_QTY * HEADER_SIZE) } diff --git a/ktor-http/ktor-http-cio/src/io/ktor/http/cio/HttpParser.kt b/ktor-http/ktor-http-cio/common/src/io/ktor/http/cio/HttpParser.kt similarity index 83% rename from ktor-http/ktor-http-cio/src/io/ktor/http/cio/HttpParser.kt rename to ktor-http/ktor-http-cio/common/src/io/ktor/http/cio/HttpParser.kt index 5f13dbe7b6..bb17fd5b90 100644 --- a/ktor-http/ktor-http-cio/src/io/ktor/http/cio/HttpParser.kt +++ b/ktor-http/ktor-http-cio/common/src/io/ktor/http/cio/HttpParser.kt @@ -15,7 +15,7 @@ private const val HTTP_LINE_LIMIT = 8192 * Parse an HTTP request line and headers */ suspend fun parseRequest(input: ByteReadChannel): Request? { - val builder = CharBufferBuilder() + val builder = CharArrayBuilder() val range = MutableRange(0, 0) try { @@ -29,7 +29,12 @@ suspend fun parseRequest(input: ByteReadChannel): Request? { val version = parseVersion(builder, range) skipSpaces(builder, range) - if (range.start != range.end) throw ParserException("Extra characters in request line: ${builder.substring(range.start, range.end)}") + if (range.start != range.end) throw ParserException( + "Extra characters in request line: ${builder.substring( + range.start, + range.end + )}" + ) if (uri.isEmpty()) throw ParserException("URI is not specified") if (version.isEmpty()) throw ParserException("HTTP version is not specified") @@ -47,7 +52,7 @@ suspend fun parseRequest(input: ByteReadChannel): Request? { * Parse an HTTP response status line and headers */ suspend fun parseResponse(input: ByteReadChannel): Response? { - val builder = CharBufferBuilder() + val builder = CharArrayBuilder() val range = MutableRange(0, 0) try { @@ -69,10 +74,22 @@ suspend fun parseResponse(input: ByteReadChannel): Response? { } } +/** + * Parse http headers. Not applicable to request and response status lines. + */ +suspend fun parseHeaders(input: ByteReadChannel): HttpHeadersMap { + val builder = CharArrayBuilder() + return parseHeaders(input, builder) ?: HttpHeadersMap(builder) +} + /** * Parse HTTP headers. Not applicable to request and response status lines. */ -suspend fun parseHeaders(input: ByteReadChannel, builder: CharBufferBuilder, range: MutableRange = MutableRange(0, 0)): HttpHeadersMap? { +internal suspend fun parseHeaders( + input: ByteReadChannel, + builder: CharArrayBuilder, + range: MutableRange = MutableRange(0, 0) +): HttpHeadersMap? { val headers = HttpHeadersMap(builder) try { @@ -96,7 +113,12 @@ suspend fun parseHeaders(input: ByteReadChannel, builder: CharBufferBuilder, ran skipSpacesAndColon(builder, range) if (range.start == range.end) { - throw ParserException("No HTTP header value provided for name ${builder.substring(nameStart, nameEnd)}: \n$builder") + throw ParserException( + "No HTTP header value provided for name ${builder.substring( + nameStart, + nameEnd + )}: \n$builder" + ) } // TODO check for trailing spaces in HTTP spec @@ -175,7 +197,8 @@ private fun parseStatusCode(text: CharSequence, range: MutableRange): Int { } else if (ch in '0'..'9') { status = status * 10 + (ch - '0') } else { - throw NumberFormatException("Illegal digit $ch in status code ${text.substring(range.start, findSpaceOrEnd(text, range))}") + val code = text.substring(range.start, findSpaceOrEnd(text, range)) + throw NumberFormatException("Illegal digit $ch in status code $code") } } diff --git a/ktor-http/ktor-http-cio/src/io/ktor/http/cio/RequestResponse.kt b/ktor-http/ktor-http-cio/common/src/io/ktor/http/cio/RequestResponse.kt similarity index 82% rename from ktor-http/ktor-http-cio/src/io/ktor/http/cio/RequestResponse.kt rename to ktor-http/ktor-http-cio/common/src/io/ktor/http/cio/RequestResponse.kt index f40f7ae644..6851384630 100644 --- a/ktor-http/ktor-http-cio/src/io/ktor/http/cio/RequestResponse.kt +++ b/ktor-http/ktor-http-cio/common/src/io/ktor/http/cio/RequestResponse.kt @@ -2,14 +2,15 @@ package io.ktor.http.cio import io.ktor.http.* import io.ktor.http.cio.internals.* -import java.io.* +import kotlinx.io.core.* /** * Represents a base HTTP message type for request and response * @property headers request/response headers */ -abstract class HttpMessage internal constructor(val headers: HttpHeadersMap, private val builder: CharBufferBuilder) : - Closeable { +abstract class HttpMessage internal constructor( + val headers: HttpHeadersMap, private val builder: CharArrayBuilder +) : Closeable { /** * Release all memory resources hold by this message @@ -38,7 +39,7 @@ class Request internal constructor( val uri: CharSequence, val version: CharSequence, headers: HttpHeadersMap, - builder: CharBufferBuilder + builder: CharArrayBuilder ) : HttpMessage(headers, builder) /** @@ -52,5 +53,5 @@ class Response internal constructor( val status: Int, val statusText: CharSequence, headers: HttpHeadersMap, - builder: CharBufferBuilder + builder: CharArrayBuilder ) : HttpMessage(headers, builder) diff --git a/ktor-http/ktor-http-cio/src/io/ktor/http/cio/internals/AsciiCharTree.kt b/ktor-http/ktor-http-cio/common/src/io/ktor/http/cio/internals/AsciiCharTree.kt similarity index 53% rename from ktor-http/ktor-http-cio/src/io/ktor/http/cio/internals/AsciiCharTree.kt rename to ktor-http/ktor-http-cio/common/src/io/ktor/http/cio/internals/AsciiCharTree.kt index 4e6751c4a4..110e8153be 100644 --- a/ktor-http/ktor-http-cio/src/io/ktor/http/cio/internals/AsciiCharTree.kt +++ b/ktor-http/ktor-http-cio/common/src/io/ktor/http/cio/internals/AsciiCharTree.kt @@ -5,17 +5,25 @@ internal class AsciiCharTree(val root: Node) { val array = Array(0x100) { chi -> children.singleOrNull { it.ch.toInt() == chi } } } - fun search(s: CharSequence, fromIdx: Int = 0, end: Int = s.length, lowerCase: Boolean = false, stopPredicate: (Char, Int) -> Boolean): List { - if (s.isEmpty()) throw IllegalArgumentException("Couldn't search in char tree for empty string") + fun search( + sequence: CharSequence, + fromIdx: Int = 0, end: Int = sequence.length, + lowerCase: Boolean = false, + stopPredicate: (Char, Int) -> Boolean + ): List { + if (sequence.isEmpty()) throw IllegalArgumentException("Couldn't search in char tree for empty string") var node = root - for (idx in fromIdx until end) { - val ch = s[idx] - val chi = ch.toInt() + for (index in fromIdx until end) { + val current = sequence[index] + val currentCode = current.toInt() - if (stopPredicate(ch, chi)) break + if (stopPredicate(current, currentCode)) break + + val nextNode = node.array[currentCode] + ?: (if (lowerCase) node.array[current.toLowerCase().toInt()] else null) + ?: return emptyList() - val nextNode = node.array[chi] ?: (if (lowerCase) node.array[ch.toLowerCase().toInt()] else null) ?: return emptyList() node = nextNode } @@ -28,7 +36,9 @@ internal class AsciiCharTree(val root: Node) { } fun build(from: List, length: (T) -> Int, charAt: (T, Int) -> Char): AsciiCharTree { - val maxLen = from.maxBy(length)?.let(length) ?: throw NoSuchElementException("Unable to build char tree from an empty list") + val maxLen = from.maxBy(length)?.let(length) + ?: throw NoSuchElementException("Unable to build char tree from an empty list") + if (from.any { length(it) == 0 }) throw IllegalArgumentException("There should be no empty entries") val root = ArrayList>() @@ -37,8 +47,15 @@ internal class AsciiCharTree(val root: Node) { return AsciiCharTree(Node('\u0000', emptyList(), root)) } - private fun build(resultList: MutableList>, from: List, maxLength: Int, idx: Int, length: (T) -> Int, charAt: (T, Int) -> Char) { - from.groupBy { charAt(it, idx) }.forEach { ch, list -> + private fun build( + resultList: MutableList>, + from: List, + maxLength: Int, + idx: Int, + length: (T) -> Int, + charAt: (T, Int) -> Char + ) { + from.groupBy { charAt(it, idx) }.forEach { (ch, list) -> val nextIdx = idx + 1 val children = ArrayList>() build(children, list.filter { length(it) > nextIdx }, maxLength, nextIdx, length, charAt) @@ -47,4 +64,4 @@ internal class AsciiCharTree(val root: Node) { } } } -} \ No newline at end of file +} diff --git a/ktor-http/ktor-http-cio/src/io/ktor/http/cio/internals/CharBufferBuilder.kt b/ktor-http/ktor-http-cio/common/src/io/ktor/http/cio/internals/CharArrayBuilder.kt similarity index 72% rename from ktor-http/ktor-http-cio/src/io/ktor/http/cio/internals/CharBufferBuilder.kt rename to ktor-http/ktor-http-cio/common/src/io/ktor/http/cio/internals/CharArrayBuilder.kt index 833116ec9b..6e7a6c7d25 100644 --- a/ktor-http/ktor-http-cio/src/io/ktor/http/cio/internals/CharBufferBuilder.kt +++ b/ktor-http/ktor-http-cio/common/src/io/ktor/http/cio/internals/CharArrayBuilder.kt @@ -2,28 +2,28 @@ package io.ktor.http.cio.internals import io.ktor.util.* import kotlinx.io.pool.* -import java.lang.IllegalStateException -import java.nio.* +import kotlin.math.* @Suppress("LoopToCallChain", "ReplaceRangeToWithUntil", "KDocMissingDocumentation") @InternalAPI -class CharBufferBuilder(val pool: ObjectPool = CharBufferPool) : CharSequence, Appendable { - private var buffers: MutableList? = null - private var current: CharBuffer? = null +internal class CharArrayBuilder(val pool: ObjectPool = CharArrayPool) : CharSequence, Appendable { + private var buffers: MutableList? = null + private var current: CharArray? = null private var stringified: String? = null - private var released = false + private var released: Boolean = false + private var remaining: Int = 0 override var length: Int = 0 private set override fun get(index: Int): Char { - require(index >= 0) { "index is negative: $index"} + require(index >= 0) { "index is negative: $index" } require(index < length) { "index $index is not in range [0, $length)" } return getImpl(index) } - private fun getImpl(index: Int) = bufferForIndex(index).get(index % CHAR_BUFFER_LENGTH) + private fun getImpl(index: Int) = bufferForIndex(index).get(index % current!!.size) override fun subSequence(startIndex: Int, endIndex: Int): CharSequence { require(startIndex <= endIndex) { "startIndex ($startIndex) should be less or equal to endIndex ($endIndex)" } @@ -45,31 +45,42 @@ class CharBufferBuilder(val pool: ObjectPool = CharBufferPool) : Cha override fun hashCode() = stringified?.hashCode() ?: hashCodeImpl(0, length) override fun append(c: Char): Appendable { - nonFullBuffer().put(c) + nonFullBuffer()[current!!.size - remaining] = c stringified = null + remaining -= 1 length++ return this } - override fun append(csq: CharSequence, start: Int, end: Int): Appendable { - append(csq, start, end, nonFullBuffer()) + override fun append(csq: CharSequence?, start: Int, end: Int): Appendable { + csq ?: return this + + var current = start + while (current < end) { + val buffer = nonFullBuffer() + val offset = buffer.size - remaining + val bytesToCopy = min(end - current, remaining) + + for (i in 0 until bytesToCopy) { + buffer[offset + i] = csq[current + i] + } + + current += bytesToCopy + remaining -= bytesToCopy + } + stringified = null length += end - start return this } - override fun append(csq: CharSequence): java.lang.Appendable { - append(csq, 0, csq.length, nonFullBuffer()) - stringified = null - length += csq.length - return this + override fun append(csq: CharSequence?): Appendable { + csq ?: return this + return append(csq, 0, csq.length) } fun release() { - length = 0 val list = buffers - buffers = null - released = true if (list != null) { current = null @@ -81,7 +92,11 @@ class CharBufferBuilder(val pool: ObjectPool = CharBufferPool) : Cha current = null } + released = true + buffers = null stringified = null + length = 0 + remaining = 0 } private fun copy(startIndex: Int, endIndex: Int): CharSequence { @@ -89,19 +104,20 @@ class CharBufferBuilder(val pool: ObjectPool = CharBufferPool) : Cha val builder = StringBuilder(endIndex - startIndex) - var buffer: CharBuffer - var base = startIndex - (startIndex % CHAR_BUFFER_LENGTH) + var buffer: CharArray + + var base = startIndex - (startIndex % CHAR_BUFFER_ARRAY_LENGTH) while (base < endIndex) { buffer = bufferForIndex(base) val innerStartIndex = maxOf(0, startIndex - base) - val innerEndIndex = minOf(endIndex - base, CHAR_BUFFER_LENGTH) + val innerEndIndex = minOf(endIndex - base, CHAR_BUFFER_ARRAY_LENGTH) for (innerIndex in innerStartIndex until innerEndIndex) { builder.append(buffer.get(innerIndex)) } - base += CHAR_BUFFER_LENGTH + base += CHAR_BUFFER_ARRAY_LENGTH } return builder @@ -119,7 +135,7 @@ class CharBufferBuilder(val pool: ObjectPool = CharBufferPool) : Cha require(index >= 0) { "index is negative: $index" } require(withOffset < end) { "index ($index) should be less than length ($length)" } - return this@CharBufferBuilder.getImpl(withOffset) + return this@CharArrayBuilder.getImpl(withOffset) } override fun subSequence(startIndex: Int, endIndex: Int): CharSequence { @@ -143,46 +159,37 @@ class CharBufferBuilder(val pool: ObjectPool = CharBufferPool) : Cha override fun hashCode() = stringified?.hashCode() ?: hashCodeImpl(start, end) } - private tailrec fun append(csq: CharSequence, start: Int, end: Int, buffer: CharBuffer) { - val limitedEnd = minOf(end, start + buffer.remaining()) - - for (i in start until limitedEnd) { - buffer.put(csq[i]) - } - if (limitedEnd < end) { - return append(csq, limitedEnd, end, appendNewBuffer()) - } - } - - private fun bufferForIndex(index: Int): CharBuffer { + private fun bufferForIndex(index: Int): CharArray { val list = buffers if (list == null) { - if (index >= CHAR_BUFFER_LENGTH) throwSingleBuffer(index) + if (index >= CHAR_BUFFER_ARRAY_LENGTH) throwSingleBuffer(index) return current ?: throwSingleBuffer(index) } - return list[index / CHAR_BUFFER_LENGTH] + return list[index / current!!.size] } private fun throwSingleBuffer(index: Int): Nothing { if (released) throw IllegalStateException("Buffer is already released") - throw IndexOutOfBoundsException("$index is not in range [0; ${current?.position() ?: 0})") + throw IndexOutOfBoundsException("$index is not in range [0; ${currentPosition()})") } - private fun nonFullBuffer(): CharBuffer { - return current?.takeIf { it.hasRemaining() } ?: appendNewBuffer() + private fun nonFullBuffer(): CharArray { + return if (remaining == 0) appendNewArray() else current!! } - private fun appendNewBuffer(): CharBuffer { + private fun appendNewArray(): CharArray { val newBuffer = pool.borrow() val existing = current current = newBuffer + remaining = newBuffer.size + released = false if (existing != null) { - val list = buffers ?: ArrayList().also { + val list = buffers ?: ArrayList().also { buffers = it it.add(existing) } @@ -209,4 +216,6 @@ class CharBufferBuilder(val pool: ObjectPool = CharBufferPool) : Cha return hc } + + private fun currentPosition() = current!!.size - remaining } diff --git a/ktor-http/ktor-http-cio/common/src/io/ktor/http/cio/internals/CharArrayPool.kt b/ktor-http/ktor-http-cio/common/src/io/ktor/http/cio/internals/CharArrayPool.kt new file mode 100644 index 0000000000..a7dcc9df91 --- /dev/null +++ b/ktor-http/ktor-http-cio/common/src/io/ktor/http/cio/internals/CharArrayPool.kt @@ -0,0 +1,16 @@ +package io.ktor.http.cio.internals + +import io.ktor.util.* +import kotlinx.io.pool.* + +private const val CHAR_ARRAY_POOL_SIZE = 4096 + +/** + * Number of characters that a array from the pool can store + */ +@KtorExperimentalAPI +internal const val CHAR_BUFFER_ARRAY_LENGTH: Int = 4096 / 2 + +internal val CharArrayPool: ObjectPool = object : DefaultPool(CHAR_ARRAY_POOL_SIZE) { + override fun produceInstance(): CharArray = CharArray(CHAR_BUFFER_ARRAY_LENGTH) +} diff --git a/ktor-http/ktor-http-cio/src/io/ktor/http/cio/internals/Chars.kt b/ktor-http/ktor-http-cio/common/src/io/ktor/http/cio/internals/Chars.kt similarity index 83% rename from ktor-http/ktor-http-cio/src/io/ktor/http/cio/internals/Chars.kt rename to ktor-http/ktor-http-cio/common/src/io/ktor/http/cio/internals/Chars.kt index f37ed929c6..5398608175 100644 --- a/ktor-http/ktor-http-cio/src/io/ktor/http/cio/internals/Chars.kt +++ b/ktor-http/ktor-http-cio/common/src/io/ktor/http/cio/internals/Chars.kt @@ -2,7 +2,6 @@ package io.ktor.http.cio.internals import io.ktor.http.* import kotlinx.io.core.* -import java.nio.* internal fun CharSequence.hashCodeLowerCase(start: Int = 0, end: Int = length): Int { var hashCode = 0 @@ -15,7 +14,7 @@ internal fun CharSequence.hashCodeLowerCase(start: Int = 0, end: Int = length): } internal fun CharSequence.equalsLowerCase(start: Int = 0, end: Int = length, other: CharSequence): Boolean { - if (end - start != other.length) return false + if (end - start != other.length) return false for (pos in start until end) { if (get(pos).toInt().toLowerCase() != other.get(pos - start).toInt().toLowerCase()) return false @@ -25,7 +24,8 @@ internal fun CharSequence.equalsLowerCase(start: Int = 0, end: Int = length, oth } @Suppress("NOTHING_TO_INLINE") -private inline fun Int.toLowerCase() = if (this in 'A'.toInt() .. 'Z'.toInt()) 'a'.toInt() + (this - 'A'.toInt()) else this +private inline fun Int.toLowerCase() = + if (this in 'A'.toInt()..'Z'.toInt()) 'a'.toInt() + (this - 'A'.toInt()) else this internal val DefaultHttpMethods = AsciiCharTree.build(HttpMethod.DefaultMethods, { it.value.length }, { m, idx -> m.value[idx] }) @@ -40,7 +40,7 @@ private val HexTable = (0..0xff).map { v -> } }.toTypedArray() -private val HexLetterTable = (0..0xf).map { +internal val HexLetterTable = (0..0xf).map { if (it < 0xa) (0x30 + it).toByte() else ('a' + it - 0x0a).toInt().toByte() }.toTypedArray() @@ -86,23 +86,6 @@ private fun CharSequence.parseDecLongWithCheck(): Long { return result } -internal fun ByteBuffer.writeIntHex(value: Int): Int { - require(value > 0) { "Does only work for positive numbers" } // zero is not included! - var current = value - var zeroes = 0 - val table = HexLetterTable - - repeat(8) { idx -> - val v = current and 0x0f - if (v == 0) zeroes++ else zeroes = 0 - current = current ushr 4 - - put(7 - idx, table[v]) - } - - return zeroes -} - internal fun IoBuffer.writeIntHex(value: Int) { require(value > 0) { "Does only work for positive numbers" } // zero is not included! var current = value diff --git a/ktor-http/ktor-http-cio/src/io/ktor/http/cio/internals/MutableRange.kt b/ktor-http/ktor-http-cio/common/src/io/ktor/http/cio/internals/MutableRange.kt similarity index 100% rename from ktor-http/ktor-http-cio/src/io/ktor/http/cio/internals/MutableRange.kt rename to ktor-http/ktor-http-cio/common/src/io/ktor/http/cio/internals/MutableRange.kt diff --git a/ktor-http/ktor-http-cio/src/io/ktor/http/cio/internals/Tokenizer.kt b/ktor-http/ktor-http-cio/common/src/io/ktor/http/cio/internals/Tokenizer.kt similarity index 100% rename from ktor-http/ktor-http-cio/src/io/ktor/http/cio/internals/Tokenizer.kt rename to ktor-http/ktor-http-cio/common/src/io/ktor/http/cio/internals/Tokenizer.kt diff --git a/ktor-http/ktor-http-cio/test/io/ktor/tests/http/cio/CharBufferBuilderTest.kt b/ktor-http/ktor-http-cio/common/test/io/ktor/tests/http/cio/CharArrayBuilderTest.kt similarity index 79% rename from ktor-http/ktor-http-cio/test/io/ktor/tests/http/cio/CharBufferBuilderTest.kt rename to ktor-http/ktor-http-cio/common/test/io/ktor/tests/http/cio/CharArrayBuilderTest.kt index 8b75646212..1d071b903a 100644 --- a/ktor-http/ktor-http-cio/test/io/ktor/tests/http/cio/CharBufferBuilderTest.kt +++ b/ktor-http/ktor-http-cio/common/test/io/ktor/tests/http/cio/CharArrayBuilderTest.kt @@ -2,13 +2,11 @@ package io.ktor.tests.http.cio import io.ktor.http.cio.internals.* import kotlinx.io.pool.* -import java.nio.* -import java.util.* import kotlin.test.* -class CharBufferBuilderTest { +class CharArrayBuilderTest { private val pool = Pool() - private val builder = CharBufferBuilder(pool) + private val builder = CharArrayBuilder(pool) @AfterTest fun tearDown() { @@ -26,10 +24,10 @@ class CharBufferBuilderTest { builder[1] } assertFails { - builder[CHAR_BUFFER_LENGTH] + builder[CHAR_BUFFER_ARRAY_LENGTH] } assertFails { - builder[CHAR_BUFFER_LENGTH + 1] + builder[CHAR_BUFFER_ARRAY_LENGTH + 1] } builder.append('1') @@ -40,10 +38,10 @@ class CharBufferBuilderTest { builder[1] } assertFails { - builder[CHAR_BUFFER_LENGTH] + builder[CHAR_BUFFER_ARRAY_LENGTH] } assertFails { - builder[CHAR_BUFFER_LENGTH + 1] + builder[CHAR_BUFFER_ARRAY_LENGTH + 1] } } @@ -57,10 +55,10 @@ class CharBufferBuilderTest { builder[1] } assertFails { - builder[CHAR_BUFFER_LENGTH] + builder[CHAR_BUFFER_ARRAY_LENGTH] } assertFails { - builder[CHAR_BUFFER_LENGTH + 1] + builder[CHAR_BUFFER_ARRAY_LENGTH + 1] } for (i in 1..10) { @@ -81,10 +79,10 @@ class CharBufferBuilderTest { assertEquals("123456789:", builder.toString()) assertFails { - builder[CHAR_BUFFER_LENGTH] + builder[CHAR_BUFFER_ARRAY_LENGTH] } assertFails { - builder[CHAR_BUFFER_LENGTH + 1] + builder[CHAR_BUFFER_ARRAY_LENGTH + 1] } } @@ -141,21 +139,22 @@ class CharBufferBuilderTest { } } - private class Pool : NoPoolImpl() { - private val unreleased = IdentityHashMap() + private class Pool : NoPoolImpl() { + private val unreleased = mutableListOf() val size: Int get() = unreleased.size - override fun borrow(): CharBuffer { - val buffer = ByteBuffer.allocate(CHAR_BUFFER_BYTES).asCharBuffer() - unreleased[buffer] = Unit + override fun borrow(): CharArray { + val buffer = CharArray(CHAR_BUFFER_ARRAY_LENGTH) + unreleased.add(buffer) return buffer } - override fun recycle(instance: CharBuffer) { - if (unreleased.remove(instance) == null) { + override fun recycle(instance: CharArray) { + if (!unreleased.remove(instance)) { throw IllegalStateException("Recycling a buffer that hasn't been borrowed from this pool") } + super.recycle(instance) } @@ -163,4 +162,4 @@ class CharBufferBuilderTest { throw UnsupportedOperationException() } } -} \ No newline at end of file +} diff --git a/ktor-http/ktor-http-cio/src/io/ktor/http/cio/CIOMultipartData.kt b/ktor-http/ktor-http-cio/jvm/src/io/ktor/http/cio/CIOMultipartData.kt similarity index 98% rename from ktor-http/ktor-http-cio/src/io/ktor/http/cio/CIOMultipartData.kt rename to ktor-http/ktor-http-cio/jvm/src/io/ktor/http/cio/CIOMultipartData.kt index 2525dcf47d..f88bc38038 100644 --- a/ktor-http/ktor-http-cio/src/io/ktor/http/cio/CIOMultipartData.kt +++ b/ktor-http/ktor-http-cio/jvm/src/io/ktor/http/cio/CIOMultipartData.kt @@ -1,15 +1,13 @@ package io.ktor.http.cio -import io.ktor.http.content.* import io.ktor.http.* +import io.ktor.http.content.* import io.ktor.util.* import kotlinx.coroutines.* import kotlinx.coroutines.channels.* import kotlinx.coroutines.io.* -import kotlinx.io.core.* import kotlinx.io.streams.* import java.io.* -import java.lang.IllegalStateException import java.nio.* import java.nio.channels.* import java.nio.file.* diff --git a/ktor-http/ktor-http-cio/src/io/ktor/http/cio/Multipart.kt b/ktor-http/ktor-http-cio/jvm/src/io/ktor/http/cio/Multipart.kt similarity index 98% rename from ktor-http/ktor-http-cio/src/io/ktor/http/cio/Multipart.kt rename to ktor-http/ktor-http-cio/jvm/src/io/ktor/http/cio/Multipart.kt index 86f0538880..4a004793f1 100644 --- a/ktor-http/ktor-http-cio/src/io/ktor/http/cio/Multipart.kt +++ b/ktor-http/ktor-http-cio/jvm/src/io/ktor/http/cio/Multipart.kt @@ -82,7 +82,13 @@ suspend fun parsePreamble( output: BytePacketBuilder, limit: Long = Long.MAX_VALUE ): Long { - return copyUntilBoundary("preamble/prologue", boundaryPrefixed, input, { output.writeFully(it) }, limit) + return copyUntilBoundary( + "preamble/prologue", + boundaryPrefixed, + input, + { output.writeFully(it) }, + limit + ) } /** @@ -108,7 +114,7 @@ suspend fun parsePart( */ @KtorExperimentalAPI suspend fun parsePartHeaders(input: ByteReadChannel): HttpHeadersMap { - val builder = CharBufferBuilder() + val builder = CharArrayBuilder() try { return parseHeaders(input, builder, MutableRange(0, 0)) diff --git a/ktor-http/ktor-http-cio/src/io/ktor/http/cio/Pipeline.kt b/ktor-http/ktor-http-cio/jvm/src/io/ktor/http/cio/Pipeline.kt similarity index 100% rename from ktor-http/ktor-http-cio/src/io/ktor/http/cio/Pipeline.kt rename to ktor-http/ktor-http-cio/jvm/src/io/ktor/http/cio/Pipeline.kt diff --git a/ktor-http/ktor-http-cio/src/io/ktor/http/cio/RequestResponseBuilder.kt b/ktor-http/ktor-http-cio/jvm/src/io/ktor/http/cio/RequestResponseBuilder.kt similarity index 100% rename from ktor-http/ktor-http-cio/src/io/ktor/http/cio/RequestResponseBuilder.kt rename to ktor-http/ktor-http-cio/jvm/src/io/ktor/http/cio/RequestResponseBuilder.kt diff --git a/ktor-http/ktor-http-cio/jvm/src/io/ktor/http/cio/internals/CharsJvm.kt b/ktor-http/ktor-http-cio/jvm/src/io/ktor/http/cio/internals/CharsJvm.kt new file mode 100644 index 0000000000..027b3cb56e --- /dev/null +++ b/ktor-http/ktor-http-cio/jvm/src/io/ktor/http/cio/internals/CharsJvm.kt @@ -0,0 +1,20 @@ +package io.ktor.http.cio.internals + +import java.nio.* + +internal fun ByteBuffer.writeIntHex(value: Int): Int { + require(value > 0) { "Does only work for positive numbers" } // zero is not included! + var current = value + var zeroes = 0 + val table = HexLetterTable + + repeat(8) { idx -> + val v = current and 0x0f + if (v == 0) zeroes++ else zeroes = 0 + current = current ushr 4 + + put(7 - idx, table[v]) + } + + return zeroes +} diff --git a/ktor-http/ktor-http-cio/src/io/ktor/http/cio/internals/HttpByteBufferPool.kt b/ktor-http/ktor-http-cio/jvm/src/io/ktor/http/cio/internals/HttpByteBufferPool.kt similarity index 63% rename from ktor-http/ktor-http-cio/src/io/ktor/http/cio/internals/HttpByteBufferPool.kt rename to ktor-http/ktor-http-cio/jvm/src/io/ktor/http/cio/internals/HttpByteBufferPool.kt index 4e6029600f..e5f385509d 100644 --- a/ktor-http/ktor-http-cio/src/io/ktor/http/cio/internals/HttpByteBufferPool.kt +++ b/ktor-http/ktor-http-cio/jvm/src/io/ktor/http/cio/internals/HttpByteBufferPool.kt @@ -6,7 +6,16 @@ import java.nio.* @Suppress("KDocMissingDocumentation") @InternalAPI -val DefaultByteBufferPool: ObjectPool = DirectByteBufferPool(4096, 2048) +internal val DEFAULT_BYTE_BUFFER_POOL_SIZE: Int = 4096 + +@Suppress("KDocMissingDocumentation") +@InternalAPI +internal const val DEFAULT_BYTE_BUFFER_BUFFER_SIZE: Int = 4096 + +@Suppress("KDocMissingDocumentation") +@InternalAPI +val DefaultByteBufferPool: ObjectPool = + DirectByteBufferPool(DEFAULT_BYTE_BUFFER_BUFFER_SIZE, DEFAULT_BYTE_BUFFER_POOL_SIZE) private class DirectByteBufferPool(val bufferSize: Int, size: Int) : DefaultPool(size) { override fun produceInstance(): ByteBuffer = java.nio.ByteBuffer.allocateDirect(bufferSize) diff --git a/ktor-http/ktor-http-cio/src/io/ktor/http/cio/internals/WeakTimeoutQueue.kt b/ktor-http/ktor-http-cio/jvm/src/io/ktor/http/cio/internals/WeakTimeoutQueue.kt similarity index 91% rename from ktor-http/ktor-http-cio/src/io/ktor/http/cio/internals/WeakTimeoutQueue.kt rename to ktor-http/ktor-http-cio/jvm/src/io/ktor/http/cio/internals/WeakTimeoutQueue.kt index e7f2ec75a5..6cfb67c2ee 100644 --- a/ktor-http/ktor-http-cio/src/io/ktor/http/cio/internals/WeakTimeoutQueue.kt +++ b/ktor-http/ktor-http-cio/jvm/src/io/ktor/http/cio/internals/WeakTimeoutQueue.kt @@ -25,7 +25,9 @@ import kotlin.coroutines.intrinsics.* class WeakTimeoutQueue( private val timeoutMillis: Long, private val clock: Clock = Clock.systemUTC(), - private val exceptionFactory: () -> Exception = { TimeoutCancellationException(timeoutMillis) } + private val exceptionFactory: () -> Exception = { + TimeoutCancellationException(timeoutMillis) + } ) { private val head = LockFreeLinkedListHead() @@ -45,9 +47,9 @@ class WeakTimeoutQueue( process(now, head, cancelled) if (cancelled) { - val e = cancellationException() - cancellable.cancel(e) - throw e + val cause = cancellationException() + cancellable.cancel(cause) + throw cause } return cancellable @@ -75,7 +77,8 @@ class WeakTimeoutQueue( return suspendCoroutineUninterceptedOrReturn { rawContinuation -> val continuation = rawContinuation.intercepted() - val wrapped = WeakTimeoutCoroutine(continuation.context, continuation) + val wrapped = + WeakTimeoutCoroutine(continuation.context, continuation) val handle = register(wrapped) wrapped.invokeOnCompletion(handle) @@ -86,16 +89,14 @@ class WeakTimeoutQueue( if (wrapped.tryComplete()) { handle.dispose() throw t - } - else COROUTINE_SUSPENDED + } else COROUTINE_SUSPENDED } if (result !== COROUTINE_SUSPENDED) { if (wrapped.tryComplete()) { handle.dispose() result - } - else COROUTINE_SUSPENDED + } else COROUTINE_SUSPENDED } else COROUTINE_SUSPENDED } } @@ -125,7 +126,9 @@ class WeakTimeoutQueue( } } - private abstract class Cancellable(val deadline: Long) : LockFreeLinkedListNode(), Registration { + private abstract class Cancellable( + val deadline: Long + ) : LockFreeLinkedListNode(), Registration { open val isActive: Boolean get() = !isRemoved diff --git a/ktor-http/ktor-http-cio/src/io/ktor/http/cio/websocket/CloseReason.kt b/ktor-http/ktor-http-cio/jvm/src/io/ktor/http/cio/websocket/CloseReason.kt similarity index 100% rename from ktor-http/ktor-http-cio/src/io/ktor/http/cio/websocket/CloseReason.kt rename to ktor-http/ktor-http-cio/jvm/src/io/ktor/http/cio/websocket/CloseReason.kt diff --git a/ktor-http/ktor-http-cio/src/io/ktor/http/cio/websocket/DefaultWebSocketSession.kt b/ktor-http/ktor-http-cio/jvm/src/io/ktor/http/cio/websocket/DefaultWebSocketSession.kt similarity index 100% rename from ktor-http/ktor-http-cio/src/io/ktor/http/cio/websocket/DefaultWebSocketSession.kt rename to ktor-http/ktor-http-cio/jvm/src/io/ktor/http/cio/websocket/DefaultWebSocketSession.kt diff --git a/ktor-http/ktor-http-cio/src/io/ktor/http/cio/websocket/DefaultWebSocketSessionImpl.kt b/ktor-http/ktor-http-cio/jvm/src/io/ktor/http/cio/websocket/DefaultWebSocketSessionImpl.kt similarity index 100% rename from ktor-http/ktor-http-cio/src/io/ktor/http/cio/websocket/DefaultWebSocketSessionImpl.kt rename to ktor-http/ktor-http-cio/jvm/src/io/ktor/http/cio/websocket/DefaultWebSocketSessionImpl.kt diff --git a/ktor-http/ktor-http-cio/src/io/ktor/http/cio/websocket/Frame.kt b/ktor-http/ktor-http-cio/jvm/src/io/ktor/http/cio/websocket/Frame.kt similarity index 100% rename from ktor-http/ktor-http-cio/src/io/ktor/http/cio/websocket/Frame.kt rename to ktor-http/ktor-http-cio/jvm/src/io/ktor/http/cio/websocket/Frame.kt diff --git a/ktor-http/ktor-http-cio/src/io/ktor/http/cio/websocket/FrameParser.kt b/ktor-http/ktor-http-cio/jvm/src/io/ktor/http/cio/websocket/FrameParser.kt similarity index 100% rename from ktor-http/ktor-http-cio/src/io/ktor/http/cio/websocket/FrameParser.kt rename to ktor-http/ktor-http-cio/jvm/src/io/ktor/http/cio/websocket/FrameParser.kt diff --git a/ktor-http/ktor-http-cio/src/io/ktor/http/cio/websocket/PingPong.kt b/ktor-http/ktor-http-cio/jvm/src/io/ktor/http/cio/websocket/PingPong.kt similarity index 100% rename from ktor-http/ktor-http-cio/src/io/ktor/http/cio/websocket/PingPong.kt rename to ktor-http/ktor-http-cio/jvm/src/io/ktor/http/cio/websocket/PingPong.kt diff --git a/ktor-http/ktor-http-cio/src/io/ktor/http/cio/websocket/RawWebSocket.kt b/ktor-http/ktor-http-cio/jvm/src/io/ktor/http/cio/websocket/RawWebSocket.kt similarity index 100% rename from ktor-http/ktor-http-cio/src/io/ktor/http/cio/websocket/RawWebSocket.kt rename to ktor-http/ktor-http-cio/jvm/src/io/ktor/http/cio/websocket/RawWebSocket.kt diff --git a/ktor-http/ktor-http-cio/src/io/ktor/http/cio/websocket/Serializer.kt b/ktor-http/ktor-http-cio/jvm/src/io/ktor/http/cio/websocket/Serializer.kt similarity index 100% rename from ktor-http/ktor-http-cio/src/io/ktor/http/cio/websocket/Serializer.kt rename to ktor-http/ktor-http-cio/jvm/src/io/ktor/http/cio/websocket/Serializer.kt diff --git a/ktor-http/ktor-http-cio/src/io/ktor/http/cio/websocket/SimpleFrameCollector.kt b/ktor-http/ktor-http-cio/jvm/src/io/ktor/http/cio/websocket/SimpleFrameCollector.kt similarity index 100% rename from ktor-http/ktor-http-cio/src/io/ktor/http/cio/websocket/SimpleFrameCollector.kt rename to ktor-http/ktor-http-cio/jvm/src/io/ktor/http/cio/websocket/SimpleFrameCollector.kt diff --git a/ktor-http/ktor-http-cio/src/io/ktor/http/cio/websocket/Utils.kt b/ktor-http/ktor-http-cio/jvm/src/io/ktor/http/cio/websocket/Utils.kt similarity index 100% rename from ktor-http/ktor-http-cio/src/io/ktor/http/cio/websocket/Utils.kt rename to ktor-http/ktor-http-cio/jvm/src/io/ktor/http/cio/websocket/Utils.kt diff --git a/ktor-http/ktor-http-cio/src/io/ktor/http/cio/websocket/WebSocketInternalAPI.kt b/ktor-http/ktor-http-cio/jvm/src/io/ktor/http/cio/websocket/WebSocketInternalAPI.kt similarity index 100% rename from ktor-http/ktor-http-cio/src/io/ktor/http/cio/websocket/WebSocketInternalAPI.kt rename to ktor-http/ktor-http-cio/jvm/src/io/ktor/http/cio/websocket/WebSocketInternalAPI.kt diff --git a/ktor-http/ktor-http-cio/src/io/ktor/http/cio/websocket/WebSocketReader.kt b/ktor-http/ktor-http-cio/jvm/src/io/ktor/http/cio/websocket/WebSocketReader.kt similarity index 100% rename from ktor-http/ktor-http-cio/src/io/ktor/http/cio/websocket/WebSocketReader.kt rename to ktor-http/ktor-http-cio/jvm/src/io/ktor/http/cio/websocket/WebSocketReader.kt diff --git a/ktor-http/ktor-http-cio/src/io/ktor/http/cio/websocket/WebSocketSession.kt b/ktor-http/ktor-http-cio/jvm/src/io/ktor/http/cio/websocket/WebSocketSession.kt similarity index 100% rename from ktor-http/ktor-http-cio/src/io/ktor/http/cio/websocket/WebSocketSession.kt rename to ktor-http/ktor-http-cio/jvm/src/io/ktor/http/cio/websocket/WebSocketSession.kt diff --git a/ktor-http/ktor-http-cio/src/io/ktor/http/cio/websocket/WebSocketWriter.kt b/ktor-http/ktor-http-cio/jvm/src/io/ktor/http/cio/websocket/WebSocketWriter.kt similarity index 100% rename from ktor-http/ktor-http-cio/src/io/ktor/http/cio/websocket/WebSocketWriter.kt rename to ktor-http/ktor-http-cio/jvm/src/io/ktor/http/cio/websocket/WebSocketWriter.kt diff --git a/ktor-http/ktor-http-cio/test/io/ktor/tests/http/cio/ChunkedTest.kt b/ktor-http/ktor-http-cio/jvm/test/io/ktor/tests/http/cio/ChunkedTest.kt similarity index 94% rename from ktor-http/ktor-http-cio/test/io/ktor/tests/http/cio/ChunkedTest.kt rename to ktor-http/ktor-http-cio/jvm/test/io/ktor/tests/http/cio/ChunkedTest.kt index 96476416e8..aee88bd010 100644 --- a/ktor-http/ktor-http-cio/test/io/ktor/tests/http/cio/ChunkedTest.kt +++ b/ktor-http/ktor-http-cio/jvm/test/io/ktor/tests/http/cio/ChunkedTest.kt @@ -7,7 +7,6 @@ import kotlinx.io.streams.* import org.junit.Test import java.io.* import java.nio.* -import kotlin.coroutines.* import kotlin.test.* class ChunkedTest { @@ -106,24 +105,24 @@ class ChunkedTest { @Test fun testEncodeChunks() = runBlocking { - val ch = ByteChannel(true) + val output = ByteChannel(true) val encoded = ByteChannel() - launch(coroutineContext) { + launch { try { - encodeChunked(encoded, ch) + encodeChunked(encoded, output) } finally { encoded.close() } } yield() - ch.writeStringUtf8("123") + output.writeStringUtf8("123") yield() - ch.writeStringUtf8("45") + output.writeStringUtf8("45") yield() - ch.writeStringUtf8("6") - ch.close() + output.writeStringUtf8("6") + output.close() yield() val encodedText = encoded.readRemaining().inputStream().reader().readText() diff --git a/ktor-http/ktor-http-cio/test/io/ktor/tests/http/cio/HeadersTest.kt b/ktor-http/ktor-http-cio/jvm/test/io/ktor/tests/http/cio/HeadersTest.kt similarity index 99% rename from ktor-http/ktor-http-cio/test/io/ktor/tests/http/cio/HeadersTest.kt rename to ktor-http/ktor-http-cio/jvm/test/io/ktor/tests/http/cio/HeadersTest.kt index b166a4ce8a..9cf18c465f 100644 --- a/ktor-http/ktor-http-cio/test/io/ktor/tests/http/cio/HeadersTest.kt +++ b/ktor-http/ktor-http-cio/jvm/test/io/ktor/tests/http/cio/HeadersTest.kt @@ -10,7 +10,7 @@ import kotlin.test.* class HeadersTest { private val ch = ByteChannel(true) - private val builder = CharBufferBuilder() + private val builder = CharArrayBuilder() @After fun tearDown() { diff --git a/ktor-http/ktor-http-cio/test/io/ktor/tests/http/cio/IntegrationTest.kt b/ktor-http/ktor-http-cio/jvm/test/io/ktor/tests/http/cio/IntegrationTest.kt similarity index 100% rename from ktor-http/ktor-http-cio/test/io/ktor/tests/http/cio/IntegrationTest.kt rename to ktor-http/ktor-http-cio/jvm/test/io/ktor/tests/http/cio/IntegrationTest.kt diff --git a/ktor-http/ktor-http-cio/test/io/ktor/tests/http/cio/MultipartTest.kt b/ktor-http/ktor-http-cio/jvm/test/io/ktor/tests/http/cio/MultipartTest.kt similarity index 100% rename from ktor-http/ktor-http-cio/test/io/ktor/tests/http/cio/MultipartTest.kt rename to ktor-http/ktor-http-cio/jvm/test/io/ktor/tests/http/cio/MultipartTest.kt diff --git a/ktor-http/ktor-http-cio/test/io/ktor/tests/http/cio/RequestParserTest.kt b/ktor-http/ktor-http-cio/jvm/test/io/ktor/tests/http/cio/RequestParserTest.kt similarity index 100% rename from ktor-http/ktor-http-cio/test/io/ktor/tests/http/cio/RequestParserTest.kt rename to ktor-http/ktor-http-cio/jvm/test/io/ktor/tests/http/cio/RequestParserTest.kt diff --git a/ktor-http/ktor-http-cio/test/io/ktor/tests/http/cio/RequestResponseBuilderTest.kt b/ktor-http/ktor-http-cio/jvm/test/io/ktor/tests/http/cio/RequestResponseBuilderTest.kt similarity index 96% rename from ktor-http/ktor-http-cio/test/io/ktor/tests/http/cio/RequestResponseBuilderTest.kt rename to ktor-http/ktor-http-cio/jvm/test/io/ktor/tests/http/cio/RequestResponseBuilderTest.kt index e4042687c4..1d900a3c3e 100644 --- a/ktor-http/ktor-http-cio/test/io/ktor/tests/http/cio/RequestResponseBuilderTest.kt +++ b/ktor-http/ktor-http-cio/jvm/test/io/ktor/tests/http/cio/RequestResponseBuilderTest.kt @@ -1,7 +1,7 @@ package io.ktor.tests.http.cio +import io.ktor.http.cio.RequestResponseBuilder import io.ktor.http.* -import io.ktor.http.cio.* import kotlinx.io.streams.* import org.junit.* import org.junit.Test @@ -45,4 +45,4 @@ class RequestResponseBuilderTest { assertEquals("HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\nConnection: close\r\n\r\nHello, World!\r\n", response) } -} \ No newline at end of file +} diff --git a/ktor-http/ktor-http-cio/test/io/ktor/tests/http/cio/TestHttpServer.kt b/ktor-http/ktor-http-cio/jvm/test/io/ktor/tests/http/cio/TestHttpServer.kt similarity index 82% rename from ktor-http/ktor-http-cio/test/io/ktor/tests/http/cio/TestHttpServer.kt rename to ktor-http/ktor-http-cio/jvm/test/io/ktor/tests/http/cio/TestHttpServer.kt index c9d2fb68aa..7a22a8d85d 100644 --- a/ktor-http/ktor-http-cio/test/io/ktor/tests/http/cio/TestHttpServer.kt +++ b/ktor-http/ktor-http-cio/jvm/test/io/ktor/tests/http/cio/TestHttpServer.kt @@ -4,14 +4,18 @@ import io.ktor.http.cio.* import io.ktor.http.cio.internals.* import kotlinx.coroutines.* import kotlinx.coroutines.io.* -import kotlinx.coroutines.io.ByteChannel import java.net.* import java.nio.channels.* import java.util.concurrent.* import kotlin.coroutines.* // this is only suitable for tests, do not use in production -internal fun testHttpServer(port: Int = 9096, ioCoroutineContext: CoroutineContext, callDispatcher: CoroutineContext, handler: HttpRequestHandler): Pair> { +internal fun testHttpServer( + port: Int = 9096, + ioCoroutineContext: CoroutineContext, + callDispatcher: CoroutineContext, + handler: HttpRequestHandler +): Pair> { val deferred = CompletableDeferred() val j = Job() @@ -52,7 +56,12 @@ internal fun testHttpServer(port: Int = 9096, ioCoroutineContext: CoroutineConte return Pair(j, deferred) } -private suspend fun client(socket: SocketChannel, ioCoroutineContext: CoroutineContext, callDispatcher: CoroutineContext, handler: HttpRequestHandler) { +private suspend fun client( + socket: SocketChannel, + ioCoroutineContext: CoroutineContext, + callDispatcher: CoroutineContext, + handler: HttpRequestHandler +) { val incoming = ByteChannel(true) val outgoing = ByteChannel() @@ -98,7 +107,15 @@ private suspend fun client(socket: SocketChannel, ioCoroutineContext: CoroutineC val timeouts = WeakTimeoutQueue(TimeUnit.HOURS.toMillis(1000)) @Suppress("DEPRECATION") - startConnectionPipeline(incoming, outgoing, null, ioCoroutineContext, callDispatcher, timeouts, handler).invokeOnCompletion { + startConnectionPipeline( + incoming, + outgoing, + null, + ioCoroutineContext, + callDispatcher, + timeouts, + handler + ).invokeOnCompletion { incoming.close() outgoing.close() } diff --git a/ktor-http/ktor-http-cio/test/io/ktor/tests/http/cio/WeakTimeoutQueueTest.kt b/ktor-http/ktor-http-cio/jvm/test/io/ktor/tests/http/cio/WeakTimeoutQueueTest.kt similarity index 100% rename from ktor-http/ktor-http-cio/test/io/ktor/tests/http/cio/WeakTimeoutQueueTest.kt rename to ktor-http/ktor-http-cio/jvm/test/io/ktor/tests/http/cio/WeakTimeoutQueueTest.kt diff --git a/ktor-http/ktor-http-cio/src/io/ktor/http/cio/internals/CharBufferPool.kt b/ktor-http/ktor-http-cio/src/io/ktor/http/cio/internals/CharBufferPool.kt deleted file mode 100644 index 173c167f3a..0000000000 --- a/ktor-http/ktor-http-cio/src/io/ktor/http/cio/internals/CharBufferPool.kt +++ /dev/null @@ -1,28 +0,0 @@ -package io.ktor.http.cio.internals - -import io.ktor.util.* -import kotlinx.io.pool.* -import java.nio.* - -private const val CHAR_BUFFER_POOL_SIZE = 4096 - -/** - * Char buffer size in bytes used in internal buffer pool - */ -@KtorExperimentalAPI -const val CHAR_BUFFER_BYTES: Int = 4096 - -/** - * Number of characters that a buffer from the pool can store - */ -@KtorExperimentalAPI -const val CHAR_BUFFER_LENGTH: Int = 4096 / 2 - -internal val CharBufferPool: ObjectPool = - object : DefaultPool(CHAR_BUFFER_POOL_SIZE) { - override fun produceInstance(): CharBuffer = - ByteBuffer.allocateDirect(CHAR_BUFFER_BYTES).asCharBuffer() - - override fun clearInstance(instance: CharBuffer): CharBuffer = - instance.also { it.clear() } - } diff --git a/ktor-http/ktor-http-ios/build.gradle b/ktor-http/ktor-http-ios/build.gradle deleted file mode 100644 index 39f0cca04f..0000000000 --- a/ktor-http/ktor-http-ios/build.gradle +++ /dev/null @@ -1,6 +0,0 @@ - -dependencies { - expectedBy project(':ktor-http') - - implementation project(':ktor-utils:ktor-utils-ios') -} diff --git a/ktor-http/ktor-http-js/build.gradle b/ktor-http/ktor-http-js/build.gradle deleted file mode 100644 index beb19f5fcf..0000000000 --- a/ktor-http/ktor-http-js/build.gradle +++ /dev/null @@ -1,6 +0,0 @@ - -dependencies { - expectedBy project(':ktor-http') - - compile project(':ktor-utils:ktor-utils-js') -} diff --git a/ktor-http/ktor-http-jvm/build.gradle b/ktor-http/ktor-http-jvm/build.gradle deleted file mode 100644 index 1524c916ca..0000000000 --- a/ktor-http/ktor-http-jvm/build.gradle +++ /dev/null @@ -1,6 +0,0 @@ - -dependencies { - expectedBy project(':ktor-http') - - compile project(':ktor-utils:ktor-utils-jvm') -} \ No newline at end of file diff --git a/ktor-network/build.gradle b/ktor-network/build.gradle index b0dab94383..0509bd7818 100644 --- a/ktor-network/build.gradle +++ b/ktor-network/build.gradle @@ -1,5 +1,5 @@ description = '' -dependencies { - compile project(":ktor-utils:ktor-utils-jvm") -} \ No newline at end of file +kotlin.sourceSets.jvmMain.dependencies { + api project(':ktor-utils') +} diff --git a/ktor-network/src/io/ktor/network/selector/ActorSelectorManager.kt b/ktor-network/jvm/src/io/ktor/network/selector/ActorSelectorManager.kt similarity index 100% rename from ktor-network/src/io/ktor/network/selector/ActorSelectorManager.kt rename to ktor-network/jvm/src/io/ktor/network/selector/ActorSelectorManager.kt diff --git a/ktor-network/src/io/ktor/network/selector/InterestSuspensionsMap.kt b/ktor-network/jvm/src/io/ktor/network/selector/InterestSuspensionsMap.kt similarity index 100% rename from ktor-network/src/io/ktor/network/selector/InterestSuspensionsMap.kt rename to ktor-network/jvm/src/io/ktor/network/selector/InterestSuspensionsMap.kt diff --git a/ktor-network/src/io/ktor/network/selector/LockFreeMPSCQueue.kt b/ktor-network/jvm/src/io/ktor/network/selector/LockFreeMPSCQueue.kt similarity index 100% rename from ktor-network/src/io/ktor/network/selector/LockFreeMPSCQueue.kt rename to ktor-network/jvm/src/io/ktor/network/selector/LockFreeMPSCQueue.kt diff --git a/ktor-network/src/io/ktor/network/selector/Selectable.kt b/ktor-network/jvm/src/io/ktor/network/selector/Selectable.kt similarity index 100% rename from ktor-network/src/io/ktor/network/selector/Selectable.kt rename to ktor-network/jvm/src/io/ktor/network/selector/Selectable.kt diff --git a/ktor-network/src/io/ktor/network/selector/SelectorManager.kt b/ktor-network/jvm/src/io/ktor/network/selector/SelectorManager.kt similarity index 100% rename from ktor-network/src/io/ktor/network/selector/SelectorManager.kt rename to ktor-network/jvm/src/io/ktor/network/selector/SelectorManager.kt diff --git a/ktor-network/src/io/ktor/network/selector/SelectorManagerSupport.kt b/ktor-network/jvm/src/io/ktor/network/selector/SelectorManagerSupport.kt similarity index 100% rename from ktor-network/src/io/ktor/network/selector/SelectorManagerSupport.kt rename to ktor-network/jvm/src/io/ktor/network/selector/SelectorManagerSupport.kt diff --git a/ktor-network/src/io/ktor/network/sockets/Builders.kt b/ktor-network/jvm/src/io/ktor/network/sockets/Builders.kt similarity index 100% rename from ktor-network/src/io/ktor/network/sockets/Builders.kt rename to ktor-network/jvm/src/io/ktor/network/sockets/Builders.kt diff --git a/ktor-network/src/io/ktor/network/sockets/CIOReader.kt b/ktor-network/jvm/src/io/ktor/network/sockets/CIOReader.kt similarity index 100% rename from ktor-network/src/io/ktor/network/sockets/CIOReader.kt rename to ktor-network/jvm/src/io/ktor/network/sockets/CIOReader.kt diff --git a/ktor-network/src/io/ktor/network/sockets/CIOWriter.kt b/ktor-network/jvm/src/io/ktor/network/sockets/CIOWriter.kt similarity index 100% rename from ktor-network/src/io/ktor/network/sockets/CIOWriter.kt rename to ktor-network/jvm/src/io/ktor/network/sockets/CIOWriter.kt diff --git a/ktor-network/src/io/ktor/network/sockets/Datagram.kt b/ktor-network/jvm/src/io/ktor/network/sockets/Datagram.kt similarity index 100% rename from ktor-network/src/io/ktor/network/sockets/Datagram.kt rename to ktor-network/jvm/src/io/ktor/network/sockets/Datagram.kt diff --git a/ktor-network/src/io/ktor/network/sockets/DatagramSocketImpl.kt b/ktor-network/jvm/src/io/ktor/network/sockets/DatagramSocketImpl.kt similarity index 100% rename from ktor-network/src/io/ktor/network/sockets/DatagramSocketImpl.kt rename to ktor-network/jvm/src/io/ktor/network/sockets/DatagramSocketImpl.kt diff --git a/ktor-network/src/io/ktor/network/sockets/NIOSocket.kt b/ktor-network/jvm/src/io/ktor/network/sockets/NIOSocket.kt similarity index 100% rename from ktor-network/src/io/ktor/network/sockets/NIOSocket.kt rename to ktor-network/jvm/src/io/ktor/network/sockets/NIOSocket.kt diff --git a/ktor-network/src/io/ktor/network/sockets/ServerSocketImpl.kt b/ktor-network/jvm/src/io/ktor/network/sockets/ServerSocketImpl.kt similarity index 100% rename from ktor-network/src/io/ktor/network/sockets/ServerSocketImpl.kt rename to ktor-network/jvm/src/io/ktor/network/sockets/ServerSocketImpl.kt diff --git a/ktor-network/src/io/ktor/network/sockets/SocketImpl.kt b/ktor-network/jvm/src/io/ktor/network/sockets/SocketImpl.kt similarity index 100% rename from ktor-network/src/io/ktor/network/sockets/SocketImpl.kt rename to ktor-network/jvm/src/io/ktor/network/sockets/SocketImpl.kt diff --git a/ktor-network/src/io/ktor/network/sockets/Sockets.kt b/ktor-network/jvm/src/io/ktor/network/sockets/Sockets.kt similarity index 100% rename from ktor-network/src/io/ktor/network/sockets/Sockets.kt rename to ktor-network/jvm/src/io/ktor/network/sockets/Sockets.kt diff --git a/ktor-network/src/io/ktor/network/util/Coroutines.kt b/ktor-network/jvm/src/io/ktor/network/util/Coroutines.kt similarity index 100% rename from ktor-network/src/io/ktor/network/util/Coroutines.kt rename to ktor-network/jvm/src/io/ktor/network/util/Coroutines.kt diff --git a/ktor-network/src/io/ktor/network/util/IOCoroutineDispatcher.kt b/ktor-network/jvm/src/io/ktor/network/util/IOCoroutineDispatcher.kt similarity index 100% rename from ktor-network/src/io/ktor/network/util/IOCoroutineDispatcher.kt rename to ktor-network/jvm/src/io/ktor/network/util/IOCoroutineDispatcher.kt diff --git a/ktor-network/src/io/ktor/network/util/Pools.kt b/ktor-network/jvm/src/io/ktor/network/util/Pools.kt similarity index 100% rename from ktor-network/src/io/ktor/network/util/Pools.kt rename to ktor-network/jvm/src/io/ktor/network/util/Pools.kt diff --git a/ktor-network/test/io/ktor/network/sockets/tests/ClientSocketTest.kt b/ktor-network/jvm/test/io/ktor/network/sockets/tests/ClientSocketTest.kt similarity index 100% rename from ktor-network/test/io/ktor/network/sockets/tests/ClientSocketTest.kt rename to ktor-network/jvm/test/io/ktor/network/sockets/tests/ClientSocketTest.kt diff --git a/ktor-network/test/io/ktor/network/sockets/tests/ServerSocketTest.kt b/ktor-network/jvm/test/io/ktor/network/sockets/tests/ServerSocketTest.kt similarity index 100% rename from ktor-network/test/io/ktor/network/sockets/tests/ServerSocketTest.kt rename to ktor-network/jvm/test/io/ktor/network/sockets/tests/ServerSocketTest.kt diff --git a/ktor-network/ktor-network-tls/build.gradle b/ktor-network/ktor-network-tls/build.gradle index 2df8fd340c..9b2b64d32a 100644 --- a/ktor-network/ktor-network-tls/build.gradle +++ b/ktor-network/ktor-network-tls/build.gradle @@ -1,4 +1,4 @@ -dependencies { - compile project(':ktor-network') - compile project(':ktor-http:ktor-http-cio') -} \ No newline at end of file +kotlin.sourceSets.jvmMain.dependencies { + api project(':ktor-network') + api project(':ktor-http:ktor-http-cio') +} diff --git a/ktor-network/ktor-network-tls/src/io/ktor/network/tls/Cipher.kt b/ktor-network/ktor-network-tls/jvm/src/io/ktor/network/tls/Cipher.kt similarity index 100% rename from ktor-network/ktor-network-tls/src/io/ktor/network/tls/Cipher.kt rename to ktor-network/ktor-network-tls/jvm/src/io/ktor/network/tls/Cipher.kt diff --git a/ktor-network/ktor-network-tls/src/io/ktor/network/tls/CipherSuites.kt b/ktor-network/ktor-network-tls/jvm/src/io/ktor/network/tls/CipherSuites.kt similarity index 100% rename from ktor-network/ktor-network-tls/src/io/ktor/network/tls/CipherSuites.kt rename to ktor-network/ktor-network-tls/jvm/src/io/ktor/network/tls/CipherSuites.kt diff --git a/ktor-network/ktor-network-tls/src/io/ktor/network/tls/Hashes.kt b/ktor-network/ktor-network-tls/jvm/src/io/ktor/network/tls/Hashes.kt similarity index 100% rename from ktor-network/ktor-network-tls/src/io/ktor/network/tls/Hashes.kt rename to ktor-network/ktor-network-tls/jvm/src/io/ktor/network/tls/Hashes.kt diff --git a/ktor-network/ktor-network-tls/src/io/ktor/network/tls/Headers.kt b/ktor-network/ktor-network-tls/jvm/src/io/ktor/network/tls/Headers.kt similarity index 100% rename from ktor-network/ktor-network-tls/src/io/ktor/network/tls/Headers.kt rename to ktor-network/ktor-network-tls/jvm/src/io/ktor/network/tls/Headers.kt diff --git a/ktor-network/ktor-network-tls/src/io/ktor/network/tls/Keys.kt b/ktor-network/ktor-network-tls/jvm/src/io/ktor/network/tls/Keys.kt similarity index 100% rename from ktor-network/ktor-network-tls/src/io/ktor/network/tls/Keys.kt rename to ktor-network/ktor-network-tls/jvm/src/io/ktor/network/tls/Keys.kt diff --git a/ktor-network/ktor-network-tls/src/io/ktor/network/tls/OID.kt b/ktor-network/ktor-network-tls/jvm/src/io/ktor/network/tls/OID.kt similarity index 100% rename from ktor-network/ktor-network-tls/src/io/ktor/network/tls/OID.kt rename to ktor-network/ktor-network-tls/jvm/src/io/ktor/network/tls/OID.kt diff --git a/ktor-network/ktor-network-tls/src/io/ktor/network/tls/Parser.kt b/ktor-network/ktor-network-tls/jvm/src/io/ktor/network/tls/Parser.kt similarity index 100% rename from ktor-network/ktor-network-tls/src/io/ktor/network/tls/Parser.kt rename to ktor-network/ktor-network-tls/jvm/src/io/ktor/network/tls/Parser.kt diff --git a/ktor-network/ktor-network-tls/src/io/ktor/network/tls/Render.kt b/ktor-network/ktor-network-tls/jvm/src/io/ktor/network/tls/Render.kt similarity index 100% rename from ktor-network/ktor-network-tls/src/io/ktor/network/tls/Render.kt rename to ktor-network/ktor-network-tls/jvm/src/io/ktor/network/tls/Render.kt diff --git a/ktor-network/ktor-network-tls/src/io/ktor/network/tls/TLS.kt b/ktor-network/ktor-network-tls/jvm/src/io/ktor/network/tls/TLS.kt similarity index 100% rename from ktor-network/ktor-network-tls/src/io/ktor/network/tls/TLS.kt rename to ktor-network/ktor-network-tls/jvm/src/io/ktor/network/tls/TLS.kt diff --git a/ktor-network/ktor-network-tls/src/io/ktor/network/tls/TLSAlert.kt b/ktor-network/ktor-network-tls/jvm/src/io/ktor/network/tls/TLSAlert.kt similarity index 100% rename from ktor-network/ktor-network-tls/src/io/ktor/network/tls/TLSAlert.kt rename to ktor-network/ktor-network-tls/jvm/src/io/ktor/network/tls/TLSAlert.kt diff --git a/ktor-network/ktor-network-tls/src/io/ktor/network/tls/TLSClientHandshake.kt b/ktor-network/ktor-network-tls/jvm/src/io/ktor/network/tls/TLSClientHandshake.kt similarity index 100% rename from ktor-network/ktor-network-tls/src/io/ktor/network/tls/TLSClientHandshake.kt rename to ktor-network/ktor-network-tls/jvm/src/io/ktor/network/tls/TLSClientHandshake.kt diff --git a/ktor-network/ktor-network-tls/src/io/ktor/network/tls/TLSClientSession.kt b/ktor-network/ktor-network-tls/jvm/src/io/ktor/network/tls/TLSClientSession.kt similarity index 100% rename from ktor-network/ktor-network-tls/src/io/ktor/network/tls/TLSClientSession.kt rename to ktor-network/ktor-network-tls/jvm/src/io/ktor/network/tls/TLSClientSession.kt diff --git a/ktor-network/ktor-network-tls/src/io/ktor/network/tls/TLSHandshakeType.kt b/ktor-network/ktor-network-tls/jvm/src/io/ktor/network/tls/TLSHandshakeType.kt similarity index 100% rename from ktor-network/ktor-network-tls/src/io/ktor/network/tls/TLSHandshakeType.kt rename to ktor-network/ktor-network-tls/jvm/src/io/ktor/network/tls/TLSHandshakeType.kt diff --git a/ktor-network/ktor-network-tls/src/io/ktor/network/tls/TLSRecordType.kt b/ktor-network/ktor-network-tls/jvm/src/io/ktor/network/tls/TLSRecordType.kt similarity index 100% rename from ktor-network/ktor-network-tls/src/io/ktor/network/tls/TLSRecordType.kt rename to ktor-network/ktor-network-tls/jvm/src/io/ktor/network/tls/TLSRecordType.kt diff --git a/ktor-network/ktor-network-tls/src/io/ktor/network/tls/TLSVersion.kt b/ktor-network/ktor-network-tls/jvm/src/io/ktor/network/tls/TLSVersion.kt similarity index 100% rename from ktor-network/ktor-network-tls/src/io/ktor/network/tls/TLSVersion.kt rename to ktor-network/ktor-network-tls/jvm/src/io/ktor/network/tls/TLSVersion.kt diff --git a/ktor-network/ktor-network-tls/src/io/ktor/network/tls/Utils.kt b/ktor-network/ktor-network-tls/jvm/src/io/ktor/network/tls/Utils.kt similarity index 100% rename from ktor-network/ktor-network-tls/src/io/ktor/network/tls/Utils.kt rename to ktor-network/ktor-network-tls/jvm/src/io/ktor/network/tls/Utils.kt diff --git a/ktor-network/ktor-network-tls/src/io/ktor/network/tls/certificates/Certificates.kt b/ktor-network/ktor-network-tls/jvm/src/io/ktor/network/tls/certificates/Certificates.kt similarity index 100% rename from ktor-network/ktor-network-tls/src/io/ktor/network/tls/certificates/Certificates.kt rename to ktor-network/ktor-network-tls/jvm/src/io/ktor/network/tls/certificates/Certificates.kt diff --git a/ktor-network/ktor-network-tls/src/io/ktor/network/tls/certificates/builders.kt b/ktor-network/ktor-network-tls/jvm/src/io/ktor/network/tls/certificates/builders.kt similarity index 100% rename from ktor-network/ktor-network-tls/src/io/ktor/network/tls/certificates/builders.kt rename to ktor-network/ktor-network-tls/jvm/src/io/ktor/network/tls/certificates/builders.kt diff --git a/ktor-network/ktor-network-tls/src/io/ktor/network/tls/extensions/NamedCurves.kt b/ktor-network/ktor-network-tls/jvm/src/io/ktor/network/tls/extensions/NamedCurves.kt similarity index 100% rename from ktor-network/ktor-network-tls/src/io/ktor/network/tls/extensions/NamedCurves.kt rename to ktor-network/ktor-network-tls/jvm/src/io/ktor/network/tls/extensions/NamedCurves.kt diff --git a/ktor-network/ktor-network-tls/src/io/ktor/network/tls/extensions/PointFormat.kt b/ktor-network/ktor-network-tls/jvm/src/io/ktor/network/tls/extensions/PointFormat.kt similarity index 100% rename from ktor-network/ktor-network-tls/src/io/ktor/network/tls/extensions/PointFormat.kt rename to ktor-network/ktor-network-tls/jvm/src/io/ktor/network/tls/extensions/PointFormat.kt diff --git a/ktor-network/ktor-network-tls/src/io/ktor/network/tls/extensions/SignatureAlgorithm.kt b/ktor-network/ktor-network-tls/jvm/src/io/ktor/network/tls/extensions/SignatureAlgorithm.kt similarity index 100% rename from ktor-network/ktor-network-tls/src/io/ktor/network/tls/extensions/SignatureAlgorithm.kt rename to ktor-network/ktor-network-tls/jvm/src/io/ktor/network/tls/extensions/SignatureAlgorithm.kt diff --git a/ktor-network/ktor-network-tls/src/io/ktor/network/tls/extensions/TLSExtension.kt b/ktor-network/ktor-network-tls/jvm/src/io/ktor/network/tls/extensions/TLSExtension.kt similarity index 100% rename from ktor-network/ktor-network-tls/src/io/ktor/network/tls/extensions/TLSExtension.kt rename to ktor-network/ktor-network-tls/jvm/src/io/ktor/network/tls/extensions/TLSExtension.kt diff --git a/ktor-network/ktor-network-tls/src/io/ktor/network/tls/platform/PlatformVersion.kt b/ktor-network/ktor-network-tls/jvm/src/io/ktor/network/tls/platform/PlatformVersion.kt similarity index 100% rename from ktor-network/ktor-network-tls/src/io/ktor/network/tls/platform/PlatformVersion.kt rename to ktor-network/ktor-network-tls/jvm/src/io/ktor/network/tls/platform/PlatformVersion.kt diff --git a/ktor-network/ktor-network-tls/test/io/ktor/network/tls/tests/ConnectionTests.kt b/ktor-network/ktor-network-tls/jvm/test/io/ktor/network/tls/tests/ConnectionTests.kt similarity index 86% rename from ktor-network/ktor-network-tls/test/io/ktor/network/tls/tests/ConnectionTests.kt rename to ktor-network/ktor-network-tls/jvm/test/io/ktor/network/tls/tests/ConnectionTests.kt index 762591555d..4ffeb437cf 100644 --- a/ktor-network/ktor-network-tls/test/io/ktor/network/tls/tests/ConnectionTests.kt +++ b/ktor-network/ktor-network-tls/jvm/test/io/ktor/network/tls/tests/ConnectionTests.kt @@ -3,10 +3,10 @@ package io.ktor.network.tls.tests import io.ktor.network.selector.* import io.ktor.network.sockets.* import io.ktor.network.tls.* -import io.ktor.network.util.* import kotlinx.coroutines.* import kotlinx.coroutines.io.* import org.junit.* +import java.security.* class ConnectionTests { @@ -17,7 +17,7 @@ class ConnectionTests { val socket = aSocket(selectorManager) .tcp() .connect("www.google.com", port = 443) - .tls(Dispatchers.Default) + .tls(Dispatchers.Default, randomAlgorithm = SecureRandom.getInstanceStrong().algorithm) val channel = socket.openWriteChannel() diff --git a/ktor-server/jvm/.gitkeep b/ktor-server/jvm/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ktor-server/ktor-server-benchmarks/build.gradle b/ktor-server/ktor-server-benchmarks/build.gradle index 684c8c4a10..8da3ea3dad 100644 --- a/ktor-server/ktor-server-benchmarks/build.gradle +++ b/ktor-server/ktor-server-benchmarks/build.gradle @@ -1,5 +1,5 @@ plugins { - id 'me.champeau.gradle.jmh' version '0.4.4' + id 'me.champeau.gradle.jmh' version '0.4.5' } apply plugin: 'kotlin-allopen' @@ -8,22 +8,42 @@ allOpen { annotation('org.openjdk.jmh.annotations.State') } -sourceSets { - jmh { - kotlin { - srcDir 'src-jmh' - } +kotlin { + targets { + fromPreset(presets.jvmWithJava, 'jvmWithJava') } } description = '' dependencies { - jmh project(':ktor-server:ktor-server-test-host') - jmh project(':ktor-server:ktor-server-netty') - jmh project(':ktor-server:ktor-server-jetty') - jmh project(':ktor-server:ktor-server-cio') - jmh project(':ktor-client:ktor-client-cio') - jmh project(':ktor-client:ktor-client-apache') + api group: 'org.openjdk.jmh', name: 'jmh-core', version: '1.21' + + def deps = [ + project(':ktor-server:ktor-server-test-host'), + project(':ktor-server:ktor-server-netty'), + project(':ktor-server:ktor-server-jetty'), + project(':ktor-server:ktor-server-cio'), + project(':ktor-client:ktor-client-cio'), + project(':ktor-client:ktor-client-apache') + ] + + deps.each { + jmh it + jmhCompile it + jmhCompileClasspath it + jmhRuntimeClasspath it + + jmh it.kotlin.targets.jvm.compilations.main.output.allOutputs + jmhCompileClasspath it.kotlin.targets.jvm.compilations.main.output.allOutputs + jmhRuntimeClasspath it.kotlin.targets.jvm.compilations.main.output.allOutputs + + jmh it.kotlin.targets.jvm.compilations.test.output.allOutputs + jmhCompileClasspath it.kotlin.targets.jvm.compilations.test.output.allOutputs + jmhRuntimeClasspath it.kotlin.targets.jvm.compilations.test.output.allOutputs + +// jmhCompile it.kotlin.targets.jvm.compilations.test.output.allOutputs + + } jmh group: 'org.apache.httpcomponents', name: 'httpclient', version: '4.5.2' jmh group: 'com.squareup.okhttp3', name: 'okhttp', version: '3.6.0' @@ -32,9 +52,11 @@ dependencies { jmh { jmhVersion = jmh_version + jmhJar { + archiveName = 'benchmarks.jar' + } } -jmhJar.archiveName = 'benchmarks.jar' task runBenchmark(type: JavaExec, dependsOn: 'jmhJar') { def mainClassFqName = null @@ -57,4 +79,3 @@ task runBenchmark(type: JavaExec, dependsOn: 'jmhJar') { new File(project.buildDir, 'reports/benchmarks').mkdirs() } } - diff --git a/ktor-server/ktor-server-benchmarks/src-jmh/io/ktor/server/benchmarks/AsyncIntegrationBenchmark.kt b/ktor-server/ktor-server-benchmarks/src/jmh/kotlin/io/ktor/server/benchmarks/AsyncIntegrationBenchmark.kt similarity index 100% rename from ktor-server/ktor-server-benchmarks/src-jmh/io/ktor/server/benchmarks/AsyncIntegrationBenchmark.kt rename to ktor-server/ktor-server-benchmarks/src/jmh/kotlin/io/ktor/server/benchmarks/AsyncIntegrationBenchmark.kt diff --git a/ktor-server/ktor-server-benchmarks/src-jmh/io/ktor/server/benchmarks/BenchmarkRunner.kt b/ktor-server/ktor-server-benchmarks/src/jmh/kotlin/io/ktor/server/benchmarks/BenchmarkRunner.kt similarity index 100% rename from ktor-server/ktor-server-benchmarks/src-jmh/io/ktor/server/benchmarks/BenchmarkRunner.kt rename to ktor-server/ktor-server-benchmarks/src/jmh/kotlin/io/ktor/server/benchmarks/BenchmarkRunner.kt diff --git a/ktor-server/ktor-server-benchmarks/src-jmh/io/ktor/server/benchmarks/CIOChunkedBenchmark.kt b/ktor-server/ktor-server-benchmarks/src/jmh/kotlin/io/ktor/server/benchmarks/CIOChunkedBenchmark.kt similarity index 100% rename from ktor-server/ktor-server-benchmarks/src-jmh/io/ktor/server/benchmarks/CIOChunkedBenchmark.kt rename to ktor-server/ktor-server-benchmarks/src/jmh/kotlin/io/ktor/server/benchmarks/CIOChunkedBenchmark.kt diff --git a/ktor-server/ktor-server-benchmarks/src-jmh/io/ktor/server/benchmarks/ChannelBenchmarks.kt b/ktor-server/ktor-server-benchmarks/src/jmh/kotlin/io/ktor/server/benchmarks/ChannelBenchmarks.kt similarity index 100% rename from ktor-server/ktor-server-benchmarks/src-jmh/io/ktor/server/benchmarks/ChannelBenchmarks.kt rename to ktor-server/ktor-server-benchmarks/src/jmh/kotlin/io/ktor/server/benchmarks/ChannelBenchmarks.kt diff --git a/ktor-server/ktor-server-benchmarks/src-jmh/io/ktor/server/benchmarks/CodecsBenchmark.kt b/ktor-server/ktor-server-benchmarks/src/jmh/kotlin/io/ktor/server/benchmarks/CodecsBenchmark.kt similarity index 100% rename from ktor-server/ktor-server-benchmarks/src-jmh/io/ktor/server/benchmarks/CodecsBenchmark.kt rename to ktor-server/ktor-server-benchmarks/src/jmh/kotlin/io/ktor/server/benchmarks/CodecsBenchmark.kt diff --git a/ktor-server/ktor-server-benchmarks/src-jmh/io/ktor/server/benchmarks/HttpBenchmarkAsyncClients.kt b/ktor-server/ktor-server-benchmarks/src/jmh/kotlin/io/ktor/server/benchmarks/HttpBenchmarkAsyncClients.kt similarity index 100% rename from ktor-server/ktor-server-benchmarks/src-jmh/io/ktor/server/benchmarks/HttpBenchmarkAsyncClients.kt rename to ktor-server/ktor-server-benchmarks/src/jmh/kotlin/io/ktor/server/benchmarks/HttpBenchmarkAsyncClients.kt diff --git a/ktor-server/ktor-server-benchmarks/src-jmh/io/ktor/server/benchmarks/HttpBenchmarkClient.kt b/ktor-server/ktor-server-benchmarks/src/jmh/kotlin/io/ktor/server/benchmarks/HttpBenchmarkClient.kt similarity index 100% rename from ktor-server/ktor-server-benchmarks/src-jmh/io/ktor/server/benchmarks/HttpBenchmarkClient.kt rename to ktor-server/ktor-server-benchmarks/src/jmh/kotlin/io/ktor/server/benchmarks/HttpBenchmarkClient.kt diff --git a/ktor-server/ktor-server-benchmarks/src-jmh/io/ktor/server/benchmarks/IntegrationBenchmark.kt b/ktor-server/ktor-server-benchmarks/src/jmh/kotlin/io/ktor/server/benchmarks/IntegrationBenchmark.kt similarity index 100% rename from ktor-server/ktor-server-benchmarks/src-jmh/io/ktor/server/benchmarks/IntegrationBenchmark.kt rename to ktor-server/ktor-server-benchmarks/src/jmh/kotlin/io/ktor/server/benchmarks/IntegrationBenchmark.kt diff --git a/ktor-server/ktor-server-benchmarks/src-jmh/io/ktor/server/benchmarks/PipelineBenchmark.kt b/ktor-server/ktor-server-benchmarks/src/jmh/kotlin/io/ktor/server/benchmarks/PipelineBenchmark.kt similarity index 100% rename from ktor-server/ktor-server-benchmarks/src-jmh/io/ktor/server/benchmarks/PipelineBenchmark.kt rename to ktor-server/ktor-server-benchmarks/src/jmh/kotlin/io/ktor/server/benchmarks/PipelineBenchmark.kt diff --git a/ktor-server/ktor-server-benchmarks/src-jmh/io/ktor/server/benchmarks/PlatformBenchmark.kt b/ktor-server/ktor-server-benchmarks/src/jmh/kotlin/io/ktor/server/benchmarks/PlatformBenchmark.kt similarity index 100% rename from ktor-server/ktor-server-benchmarks/src-jmh/io/ktor/server/benchmarks/PlatformBenchmark.kt rename to ktor-server/ktor-server-benchmarks/src/jmh/kotlin/io/ktor/server/benchmarks/PlatformBenchmark.kt diff --git a/ktor-server/ktor-server-benchmarks/src-jmh/io/ktor/server/benchmarks/RoutingBenchmark.kt b/ktor-server/ktor-server-benchmarks/src/jmh/kotlin/io/ktor/server/benchmarks/RoutingBenchmark.kt similarity index 100% rename from ktor-server/ktor-server-benchmarks/src-jmh/io/ktor/server/benchmarks/RoutingBenchmark.kt rename to ktor-server/ktor-server-benchmarks/src/jmh/kotlin/io/ktor/server/benchmarks/RoutingBenchmark.kt diff --git a/ktor-server/ktor-server-benchmarks/src-jmh/io/ktor/server/benchmarks/StringValuesBenchmark.kt b/ktor-server/ktor-server-benchmarks/src/jmh/kotlin/io/ktor/server/benchmarks/StringValuesBenchmark.kt similarity index 100% rename from ktor-server/ktor-server-benchmarks/src-jmh/io/ktor/server/benchmarks/StringValuesBenchmark.kt rename to ktor-server/ktor-server-benchmarks/src/jmh/kotlin/io/ktor/server/benchmarks/StringValuesBenchmark.kt diff --git a/ktor-server/ktor-server-benchmarks/src-jmh/io/ktor/server/benchmarks/cio/CIOIntegrationBenchmark.kt b/ktor-server/ktor-server-benchmarks/src/jmh/kotlin/io/ktor/server/benchmarks/cio/CIOIntegrationBenchmark.kt similarity index 100% rename from ktor-server/ktor-server-benchmarks/src-jmh/io/ktor/server/benchmarks/cio/CIOIntegrationBenchmark.kt rename to ktor-server/ktor-server-benchmarks/src/jmh/kotlin/io/ktor/server/benchmarks/cio/CIOIntegrationBenchmark.kt diff --git a/ktor-server/ktor-server-benchmarks/src-jmh/io/ktor/server/benchmarks/cio/CIOPlatformBenchmark.kt b/ktor-server/ktor-server-benchmarks/src/jmh/kotlin/io/ktor/server/benchmarks/cio/CIOPlatformBenchmark.kt similarity index 100% rename from ktor-server/ktor-server-benchmarks/src-jmh/io/ktor/server/benchmarks/cio/CIOPlatformBenchmark.kt rename to ktor-server/ktor-server-benchmarks/src/jmh/kotlin/io/ktor/server/benchmarks/cio/CIOPlatformBenchmark.kt diff --git a/ktor-server/ktor-server-benchmarks/src-jmh/io/ktor/server/benchmarks/jetty/JettyIntegrationBenchmark.kt b/ktor-server/ktor-server-benchmarks/src/jmh/kotlin/io/ktor/server/benchmarks/jetty/JettyIntegrationBenchmark.kt similarity index 100% rename from ktor-server/ktor-server-benchmarks/src-jmh/io/ktor/server/benchmarks/jetty/JettyIntegrationBenchmark.kt rename to ktor-server/ktor-server-benchmarks/src/jmh/kotlin/io/ktor/server/benchmarks/jetty/JettyIntegrationBenchmark.kt diff --git a/ktor-server/ktor-server-benchmarks/src-jmh/io/ktor/server/benchmarks/jetty/JettyPlatformBenchmark.kt b/ktor-server/ktor-server-benchmarks/src/jmh/kotlin/io/ktor/server/benchmarks/jetty/JettyPlatformBenchmark.kt similarity index 100% rename from ktor-server/ktor-server-benchmarks/src-jmh/io/ktor/server/benchmarks/jetty/JettyPlatformBenchmark.kt rename to ktor-server/ktor-server-benchmarks/src/jmh/kotlin/io/ktor/server/benchmarks/jetty/JettyPlatformBenchmark.kt diff --git a/ktor-server/ktor-server-benchmarks/src-jmh/io/ktor/server/benchmarks/netty/NettyIntegrationBenchmark.kt b/ktor-server/ktor-server-benchmarks/src/jmh/kotlin/io/ktor/server/benchmarks/netty/NettyIntegrationBenchmark.kt similarity index 100% rename from ktor-server/ktor-server-benchmarks/src-jmh/io/ktor/server/benchmarks/netty/NettyIntegrationBenchmark.kt rename to ktor-server/ktor-server-benchmarks/src/jmh/kotlin/io/ktor/server/benchmarks/netty/NettyIntegrationBenchmark.kt diff --git a/ktor-server/ktor-server-benchmarks/src-jmh/io/ktor/server/benchmarks/netty/NettyPlatformBenchmark.kt b/ktor-server/ktor-server-benchmarks/src/jmh/kotlin/io/ktor/server/benchmarks/netty/NettyPlatformBenchmark.kt similarity index 100% rename from ktor-server/ktor-server-benchmarks/src-jmh/io/ktor/server/benchmarks/netty/NettyPlatformBenchmark.kt rename to ktor-server/ktor-server-benchmarks/src/jmh/kotlin/io/ktor/server/benchmarks/netty/NettyPlatformBenchmark.kt diff --git a/ktor-server/ktor-server-benchmarks/src-jmh/io/ktor/server/benchmarks/test/TestIntegrationBenchmark.kt b/ktor-server/ktor-server-benchmarks/src/jmh/kotlin/io/ktor/server/benchmarks/test/TestIntegrationBenchmark.kt similarity index 100% rename from ktor-server/ktor-server-benchmarks/src-jmh/io/ktor/server/benchmarks/test/TestIntegrationBenchmark.kt rename to ktor-server/ktor-server-benchmarks/src/jmh/kotlin/io/ktor/server/benchmarks/test/TestIntegrationBenchmark.kt diff --git a/ktor-server/ktor-server-cio/build.gradle b/ktor-server/ktor-server-cio/build.gradle index 55ced9a3bb..36cc1ef41d 100644 --- a/ktor-server/ktor-server-cio/build.gradle +++ b/ktor-server/ktor-server-cio/build.gradle @@ -1,10 +1,14 @@ description = '' -dependencies { - compile project(':ktor-server:ktor-server-host-common') - compile project(':ktor-http:ktor-http-cio') - compile project(':ktor-network') - testCompile project(':ktor-server:ktor-server-test-host') - testCompile project(':ktor-server:ktor-server-core') - testCompile project(':ktor-client:ktor-client-cio') +kotlin.sourceSets { + jvmMain.dependencies { + api project(':ktor-server:ktor-server-host-common') + api project(':ktor-http:ktor-http-cio') + api project(':ktor-network') + } + jvmTest.dependencies { + api project(':ktor-server:ktor-server-test-host') + api project(':ktor-server:ktor-server-core') + api project(':ktor-client:ktor-client-cio') + } } diff --git a/ktor-server/ktor-server-cio/src/io/ktor/server/cio/CIO.kt b/ktor-server/ktor-server-cio/jvm/src/io/ktor/server/cio/CIO.kt similarity index 100% rename from ktor-server/ktor-server-cio/src/io/ktor/server/cio/CIO.kt rename to ktor-server/ktor-server-cio/jvm/src/io/ktor/server/cio/CIO.kt diff --git a/ktor-server/ktor-server-cio/src/io/ktor/server/cio/CIOApplicationCall.kt b/ktor-server/ktor-server-cio/jvm/src/io/ktor/server/cio/CIOApplicationCall.kt similarity index 100% rename from ktor-server/ktor-server-cio/src/io/ktor/server/cio/CIOApplicationCall.kt rename to ktor-server/ktor-server-cio/jvm/src/io/ktor/server/cio/CIOApplicationCall.kt diff --git a/ktor-server/ktor-server-cio/src/io/ktor/server/cio/CIOApplicationEngine.kt b/ktor-server/ktor-server-cio/jvm/src/io/ktor/server/cio/CIOApplicationEngine.kt similarity index 100% rename from ktor-server/ktor-server-cio/src/io/ktor/server/cio/CIOApplicationEngine.kt rename to ktor-server/ktor-server-cio/jvm/src/io/ktor/server/cio/CIOApplicationEngine.kt diff --git a/ktor-server/ktor-server-cio/src/io/ktor/server/cio/CIOApplicationRequest.kt b/ktor-server/ktor-server-cio/jvm/src/io/ktor/server/cio/CIOApplicationRequest.kt similarity index 94% rename from ktor-server/ktor-server-cio/src/io/ktor/server/cio/CIOApplicationRequest.kt rename to ktor-server/ktor-server-cio/jvm/src/io/ktor/server/cio/CIOApplicationRequest.kt index 648bab3322..fb0b93acea 100644 --- a/ktor-server/ktor-server-cio/src/io/ktor/server/cio/CIOApplicationRequest.kt +++ b/ktor-server/ktor-server-cio/jvm/src/io/ktor/server/cio/CIOApplicationRequest.kt @@ -9,7 +9,8 @@ import kotlinx.coroutines.io.* internal class CIOApplicationRequest(call: ApplicationCall, private val input: ByteReadChannel, - private val request: Request) : BaseApplicationRequest(call) { + private val request: Request +) : BaseApplicationRequest(call) { override val cookies: RequestCookies by lazy(LazyThreadSafetyMode.NONE) { RequestCookies(this) } override fun receiveChannel() = input diff --git a/ktor-server/ktor-server-cio/src/io/ktor/server/cio/CIOApplicationResponse.kt b/ktor-server/ktor-server-cio/jvm/src/io/ktor/server/cio/CIOApplicationResponse.kt similarity index 100% rename from ktor-server/ktor-server-cio/src/io/ktor/server/cio/CIOApplicationResponse.kt rename to ktor-server/ktor-server-cio/jvm/src/io/ktor/server/cio/CIOApplicationResponse.kt diff --git a/ktor-server/ktor-server-cio/src/io/ktor/server/cio/EngineMain.kt b/ktor-server/ktor-server-cio/jvm/src/io/ktor/server/cio/EngineMain.kt similarity index 100% rename from ktor-server/ktor-server-cio/src/io/ktor/server/cio/EngineMain.kt rename to ktor-server/ktor-server-cio/jvm/src/io/ktor/server/cio/EngineMain.kt diff --git a/ktor-server/ktor-server-cio/src/io/ktor/server/cio/HttpServer.kt b/ktor-server/ktor-server-cio/jvm/src/io/ktor/server/cio/HttpServer.kt similarity index 96% rename from ktor-server/ktor-server-cio/src/io/ktor/server/cio/HttpServer.kt rename to ktor-server/ktor-server-cio/jvm/src/io/ktor/server/cio/HttpServer.kt index 9cb0192757..b30b1a8e4a 100644 --- a/ktor-server/ktor-server-cio/src/io/ktor/server/cio/HttpServer.kt +++ b/ktor-server/ktor-server-cio/jvm/src/io/ktor/server/cio/HttpServer.kt @@ -81,9 +81,10 @@ fun CoroutineScope.httpServer( } val selector = ActorSelectorManager(coroutineContext) - val timeout = WeakTimeoutQueue(TimeUnit.SECONDS.toMillis(settings.connectionIdleTimeoutSeconds), + val timeout = WeakTimeoutQueue( + TimeUnit.SECONDS.toMillis(settings.connectionIdleTimeoutSeconds), Clock.systemUTC() - ) { io.ktor.http.cio.internals.TimeoutCancellationException("Connection IDLE") } + ) { io.ktor.http.cio.internals.TimeoutCancellationException("Connection IDLE") } val acceptJob = launch(serverJob + CoroutineName("accept-${settings.port}")) { aSocket(selector).tcp().bind(InetSocketAddress(settings.host, settings.port)).use { server -> diff --git a/ktor-server/ktor-server-cio/test/io/ktor/tests/server/cio/CIOEngineTest.kt b/ktor-server/ktor-server-cio/jvm/test/io/ktor/tests/server/cio/CIOEngineTest.kt similarity index 100% rename from ktor-server/ktor-server-cio/test/io/ktor/tests/server/cio/CIOEngineTest.kt rename to ktor-server/ktor-server-cio/jvm/test/io/ktor/tests/server/cio/CIOEngineTest.kt diff --git a/ktor-server/ktor-server-cio/test/io/ktor/tests/server/cio/CIOHttpClientTest.kt b/ktor-server/ktor-server-cio/jvm/test/io/ktor/tests/server/cio/CIOHttpClientTest.kt similarity index 100% rename from ktor-server/ktor-server-cio/test/io/ktor/tests/server/cio/CIOHttpClientTest.kt rename to ktor-server/ktor-server-cio/jvm/test/io/ktor/tests/server/cio/CIOHttpClientTest.kt diff --git a/ktor-server/ktor-server-cio/test/io/ktor/tests/server/cio/RAWExample.kt b/ktor-server/ktor-server-cio/jvm/test/io/ktor/tests/server/cio/RAWExample.kt similarity index 85% rename from ktor-server/ktor-server-cio/test/io/ktor/tests/server/cio/RAWExample.kt rename to ktor-server/ktor-server-cio/jvm/test/io/ktor/tests/server/cio/RAWExample.kt index fb2369cedc..2d46a6b160 100644 --- a/ktor-server/ktor-server-cio/test/io/ktor/tests/server/cio/RAWExample.kt +++ b/ktor-server/ktor-server-cio/jvm/test/io/ktor/tests/server/cio/RAWExample.kt @@ -1,5 +1,6 @@ package io.ktor.tests.server.cio +import io.ktor.http.cio.RequestResponseBuilder import io.ktor.http.* import io.ktor.http.cio.* import io.ktor.server.cio.* @@ -34,9 +35,9 @@ fun main(args: Array) { } val server = GlobalScope.httpServer(settings, handler = { request: Request, - _: ByteReadChannel, - output: ByteWriteChannel, - _: CompletableDeferred? -> + _: ByteReadChannel, + output: ByteWriteChannel, + _: CompletableDeferred? -> try { if (request.uri.length == 1 && request.uri[0] == '/' && request.method == HttpMethod.Get) { val response = RequestResponseBuilder() diff --git a/ktor-server/ktor-server-core/build.gradle b/ktor-server/ktor-server-core/build.gradle index 70bbe7cf2d..f8d0c6fe94 100644 --- a/ktor-server/ktor-server-core/build.gradle +++ b/ktor-server/ktor-server-core/build.gradle @@ -1,13 +1,16 @@ description = '' -dependencies { - compile project(":ktor-utils:ktor-utils-jvm") - compile project(':ktor-http:ktor-http-jvm') - testCompile project(":ktor-http:ktor-http-cio") - testCompile project(":ktor-network") +kotlin.sourceSets { + jvmMain.dependencies { + api project(':ktor-utils') + api project(':ktor-http') + } + jvmTest.dependencies { + api project(':ktor-http:ktor-http-cio') + api project(':ktor-network') + } } artifacts { testOutput jarTest } - diff --git a/ktor-server/ktor-server-core/src/io/ktor/application/Application.kt b/ktor-server/ktor-server-core/jvm/src/io/ktor/application/Application.kt similarity index 100% rename from ktor-server/ktor-server-core/src/io/ktor/application/Application.kt rename to ktor-server/ktor-server-core/jvm/src/io/ktor/application/Application.kt diff --git a/ktor-server/ktor-server-core/src/io/ktor/application/ApplicationCall.kt b/ktor-server/ktor-server-core/jvm/src/io/ktor/application/ApplicationCall.kt similarity index 100% rename from ktor-server/ktor-server-core/src/io/ktor/application/ApplicationCall.kt rename to ktor-server/ktor-server-core/jvm/src/io/ktor/application/ApplicationCall.kt diff --git a/ktor-server/ktor-server-core/src/io/ktor/application/ApplicationCallPipeline.kt b/ktor-server/ktor-server-core/jvm/src/io/ktor/application/ApplicationCallPipeline.kt similarity index 100% rename from ktor-server/ktor-server-core/src/io/ktor/application/ApplicationCallPipeline.kt rename to ktor-server/ktor-server-core/jvm/src/io/ktor/application/ApplicationCallPipeline.kt diff --git a/ktor-server/ktor-server-core/src/io/ktor/application/ApplicationEnvironment.kt b/ktor-server/ktor-server-core/jvm/src/io/ktor/application/ApplicationEnvironment.kt similarity index 100% rename from ktor-server/ktor-server-core/src/io/ktor/application/ApplicationEnvironment.kt rename to ktor-server/ktor-server-core/jvm/src/io/ktor/application/ApplicationEnvironment.kt diff --git a/ktor-server/ktor-server-core/src/io/ktor/application/ApplicationEvents.kt b/ktor-server/ktor-server-core/jvm/src/io/ktor/application/ApplicationEvents.kt similarity index 100% rename from ktor-server/ktor-server-core/src/io/ktor/application/ApplicationEvents.kt rename to ktor-server/ktor-server-core/jvm/src/io/ktor/application/ApplicationEvents.kt diff --git a/ktor-server/ktor-server-core/src/io/ktor/application/ApplicationFeature.kt b/ktor-server/ktor-server-core/jvm/src/io/ktor/application/ApplicationFeature.kt similarity index 100% rename from ktor-server/ktor-server-core/src/io/ktor/application/ApplicationFeature.kt rename to ktor-server/ktor-server-core/jvm/src/io/ktor/application/ApplicationFeature.kt diff --git a/ktor-server/ktor-server-core/src/io/ktor/application/DefaultApplicationEvents.kt b/ktor-server/ktor-server-core/jvm/src/io/ktor/application/DefaultApplicationEvents.kt similarity index 100% rename from ktor-server/ktor-server-core/src/io/ktor/application/DefaultApplicationEvents.kt rename to ktor-server/ktor-server-core/jvm/src/io/ktor/application/DefaultApplicationEvents.kt diff --git a/ktor-server/ktor-server-core/src/io/ktor/config/ApplicationConfig.kt b/ktor-server/ktor-server-core/jvm/src/io/ktor/config/ApplicationConfig.kt similarity index 100% rename from ktor-server/ktor-server-core/src/io/ktor/config/ApplicationConfig.kt rename to ktor-server/ktor-server-core/jvm/src/io/ktor/config/ApplicationConfig.kt diff --git a/ktor-server/ktor-server-core/src/io/ktor/config/HoconApplicationConfig.kt b/ktor-server/ktor-server-core/jvm/src/io/ktor/config/HoconApplicationConfig.kt similarity index 100% rename from ktor-server/ktor-server-core/src/io/ktor/config/HoconApplicationConfig.kt rename to ktor-server/ktor-server-core/jvm/src/io/ktor/config/HoconApplicationConfig.kt diff --git a/ktor-server/ktor-server-core/src/io/ktor/config/MapApplicationConfig.kt b/ktor-server/ktor-server-core/jvm/src/io/ktor/config/MapApplicationConfig.kt similarity index 100% rename from ktor-server/ktor-server-core/src/io/ktor/config/MapApplicationConfig.kt rename to ktor-server/ktor-server-core/jvm/src/io/ktor/config/MapApplicationConfig.kt diff --git a/ktor-server/ktor-server-core/src/io/ktor/features/AutoHeadResponse.kt b/ktor-server/ktor-server-core/jvm/src/io/ktor/features/AutoHeadResponse.kt similarity index 100% rename from ktor-server/ktor-server-core/src/io/ktor/features/AutoHeadResponse.kt rename to ktor-server/ktor-server-core/jvm/src/io/ktor/features/AutoHeadResponse.kt diff --git a/ktor-server/ktor-server-core/src/io/ktor/features/CORS.kt b/ktor-server/ktor-server-core/jvm/src/io/ktor/features/CORS.kt similarity index 100% rename from ktor-server/ktor-server-core/src/io/ktor/features/CORS.kt rename to ktor-server/ktor-server-core/jvm/src/io/ktor/features/CORS.kt diff --git a/ktor-server/ktor-server-core/src/io/ktor/features/CachingHeaders.kt b/ktor-server/ktor-server-core/jvm/src/io/ktor/features/CachingHeaders.kt similarity index 100% rename from ktor-server/ktor-server-core/src/io/ktor/features/CachingHeaders.kt rename to ktor-server/ktor-server-core/jvm/src/io/ktor/features/CachingHeaders.kt diff --git a/ktor-server/ktor-server-core/src/io/ktor/features/CallId.kt b/ktor-server/ktor-server-core/jvm/src/io/ktor/features/CallId.kt similarity index 100% rename from ktor-server/ktor-server-core/src/io/ktor/features/CallId.kt rename to ktor-server/ktor-server-core/jvm/src/io/ktor/features/CallId.kt diff --git a/ktor-server/ktor-server-core/src/io/ktor/features/CallLogging.kt b/ktor-server/ktor-server-core/jvm/src/io/ktor/features/CallLogging.kt similarity index 100% rename from ktor-server/ktor-server-core/src/io/ktor/features/CallLogging.kt rename to ktor-server/ktor-server-core/jvm/src/io/ktor/features/CallLogging.kt diff --git a/ktor-server/ktor-server-core/src/io/ktor/features/Compression.kt b/ktor-server/ktor-server-core/jvm/src/io/ktor/features/Compression.kt similarity index 100% rename from ktor-server/ktor-server-core/src/io/ktor/features/Compression.kt rename to ktor-server/ktor-server-core/jvm/src/io/ktor/features/Compression.kt diff --git a/ktor-server/ktor-server-core/src/io/ktor/features/ConditionalHeaders.kt b/ktor-server/ktor-server-core/jvm/src/io/ktor/features/ConditionalHeaders.kt similarity index 100% rename from ktor-server/ktor-server-core/src/io/ktor/features/ConditionalHeaders.kt rename to ktor-server/ktor-server-core/jvm/src/io/ktor/features/ConditionalHeaders.kt diff --git a/ktor-server/ktor-server-core/src/io/ktor/features/ContentNegotiation.kt b/ktor-server/ktor-server-core/jvm/src/io/ktor/features/ContentNegotiation.kt similarity index 100% rename from ktor-server/ktor-server-core/src/io/ktor/features/ContentNegotiation.kt rename to ktor-server/ktor-server-core/jvm/src/io/ktor/features/ContentNegotiation.kt diff --git a/ktor-server/ktor-server-core/src/io/ktor/features/DataConversion.kt b/ktor-server/ktor-server-core/jvm/src/io/ktor/features/DataConversion.kt similarity index 100% rename from ktor-server/ktor-server-core/src/io/ktor/features/DataConversion.kt rename to ktor-server/ktor-server-core/jvm/src/io/ktor/features/DataConversion.kt diff --git a/ktor-server/ktor-server-core/src/io/ktor/features/DefaultHeaders.kt b/ktor-server/ktor-server-core/jvm/src/io/ktor/features/DefaultHeaders.kt similarity index 100% rename from ktor-server/ktor-server-core/src/io/ktor/features/DefaultHeaders.kt rename to ktor-server/ktor-server-core/jvm/src/io/ktor/features/DefaultHeaders.kt diff --git a/ktor-server/ktor-server-core/src/io/ktor/features/HSTS.kt b/ktor-server/ktor-server-core/jvm/src/io/ktor/features/HSTS.kt similarity index 100% rename from ktor-server/ktor-server-core/src/io/ktor/features/HSTS.kt rename to ktor-server/ktor-server-core/jvm/src/io/ktor/features/HSTS.kt diff --git a/ktor-server/ktor-server-core/src/io/ktor/features/HttpsRedirect.kt b/ktor-server/ktor-server-core/jvm/src/io/ktor/features/HttpsRedirect.kt similarity index 100% rename from ktor-server/ktor-server-core/src/io/ktor/features/HttpsRedirect.kt rename to ktor-server/ktor-server-core/jvm/src/io/ktor/features/HttpsRedirect.kt diff --git a/ktor-server/ktor-server-core/src/io/ktor/features/MultipleRangeWriter.kt b/ktor-server/ktor-server-core/jvm/src/io/ktor/features/MultipleRangeWriter.kt similarity index 100% rename from ktor-server/ktor-server-core/src/io/ktor/features/MultipleRangeWriter.kt rename to ktor-server/ktor-server-core/jvm/src/io/ktor/features/MultipleRangeWriter.kt diff --git a/ktor-server/ktor-server-core/src/io/ktor/features/OriginConnectionPoint.kt b/ktor-server/ktor-server-core/jvm/src/io/ktor/features/OriginConnectionPoint.kt similarity index 100% rename from ktor-server/ktor-server-core/src/io/ktor/features/OriginConnectionPoint.kt rename to ktor-server/ktor-server-core/jvm/src/io/ktor/features/OriginConnectionPoint.kt diff --git a/ktor-server/ktor-server-core/src/io/ktor/features/PartialContent.kt b/ktor-server/ktor-server-core/jvm/src/io/ktor/features/PartialContent.kt similarity index 100% rename from ktor-server/ktor-server-core/src/io/ktor/features/PartialContent.kt rename to ktor-server/ktor-server-core/jvm/src/io/ktor/features/PartialContent.kt diff --git a/ktor-server/ktor-server-core/src/io/ktor/features/StatusPages.kt b/ktor-server/ktor-server-core/jvm/src/io/ktor/features/StatusPages.kt similarity index 100% rename from ktor-server/ktor-server-core/src/io/ktor/features/StatusPages.kt rename to ktor-server/ktor-server-core/jvm/src/io/ktor/features/StatusPages.kt diff --git a/ktor-server/ktor-server-core/src/io/ktor/http/LinkHeader.kt b/ktor-server/ktor-server-core/jvm/src/io/ktor/http/LinkHeader.kt similarity index 100% rename from ktor-server/ktor-server-core/src/io/ktor/http/LinkHeader.kt rename to ktor-server/ktor-server-core/jvm/src/io/ktor/http/LinkHeader.kt diff --git a/ktor-server/ktor-server-core/src/io/ktor/http/Push.kt b/ktor-server/ktor-server-core/jvm/src/io/ktor/http/Push.kt similarity index 100% rename from ktor-server/ktor-server-core/src/io/ktor/http/Push.kt rename to ktor-server/ktor-server-core/jvm/src/io/ktor/http/Push.kt diff --git a/ktor-server/ktor-server-core/src/io/ktor/http/content/DefaultTransform.kt b/ktor-server/ktor-server-core/jvm/src/io/ktor/http/content/DefaultTransform.kt similarity index 100% rename from ktor-server/ktor-server-core/src/io/ktor/http/content/DefaultTransform.kt rename to ktor-server/ktor-server-core/jvm/src/io/ktor/http/content/DefaultTransform.kt diff --git a/ktor-server/ktor-server-core/src/io/ktor/http/content/HttpStatusCodeContent.kt b/ktor-server/ktor-server-core/jvm/src/io/ktor/http/content/HttpStatusCodeContent.kt similarity index 100% rename from ktor-server/ktor-server-core/src/io/ktor/http/content/HttpStatusCodeContent.kt rename to ktor-server/ktor-server-core/jvm/src/io/ktor/http/content/HttpStatusCodeContent.kt diff --git a/ktor-server/ktor-server-core/src/io/ktor/http/content/OutputStreamContent.kt b/ktor-server/ktor-server-core/jvm/src/io/ktor/http/content/OutputStreamContent.kt similarity index 100% rename from ktor-server/ktor-server-core/src/io/ktor/http/content/OutputStreamContent.kt rename to ktor-server/ktor-server-core/jvm/src/io/ktor/http/content/OutputStreamContent.kt diff --git a/ktor-server/ktor-server-core/src/io/ktor/http/content/StaticContent.kt b/ktor-server/ktor-server-core/jvm/src/io/ktor/http/content/StaticContent.kt similarity index 100% rename from ktor-server/ktor-server-core/src/io/ktor/http/content/StaticContent.kt rename to ktor-server/ktor-server-core/jvm/src/io/ktor/http/content/StaticContent.kt diff --git a/ktor-server/ktor-server-core/src/io/ktor/http/content/StaticContentResolution.kt b/ktor-server/ktor-server-core/jvm/src/io/ktor/http/content/StaticContentResolution.kt similarity index 85% rename from ktor-server/ktor-server-core/src/io/ktor/http/content/StaticContentResolution.kt rename to ktor-server/ktor-server-core/jvm/src/io/ktor/http/content/StaticContentResolution.kt index ae7dcff15b..b4191b1a6c 100644 --- a/ktor-server/ktor-server-core/src/io/ktor/http/content/StaticContentResolution.kt +++ b/ktor-server/ktor-server-core/jvm/src/io/ktor/http/content/StaticContentResolution.kt @@ -13,10 +13,12 @@ import java.nio.file.* * * @return [LocalFileContent] or [JarFileContent] or `null` */ -fun ApplicationCall.resolveResource(path: String, - resourcePackage: String? = null, - classLoader: ClassLoader = application.environment.classLoader, - mimeResolve: (String) -> ContentType = { ContentType.defaultForFileExtension(it) }): OutgoingContent? { +fun ApplicationCall.resolveResource( + path: String, + resourcePackage: String? = null, + classLoader: ClassLoader = application.environment.classLoader, + mimeResolve: (String) -> ContentType = { ContentType.defaultForFileExtension(it) } +): OutgoingContent? { val packagePath = (resourcePackage?.replace('.', '/') ?: "").appendPathPart(path) val normalizedPath = Paths.get(packagePath).normalizeAndRelativize() val normalizedResource = normalizedPath.toString().replace(File.separatorChar, '/') @@ -40,7 +42,8 @@ fun ApplicationCall.resolveResource(path: String, "jrt" -> { return URIFileContent(url, mimeResolve(url.path.extension())) } - else -> {} + else -> { + } } } @@ -66,11 +69,11 @@ private fun String.extension(): String { private fun String.appendPathPart(part: String): String { val count = (if (isNotEmpty() && this[length - 1] == '/') 1 else 0) + - (if (part.isNotEmpty() && part[0] == '/') 1 else 0) + (if (part.isNotEmpty() && part[0] == '/') 1 else 0) return when (count) { 2 -> this + part.removePrefix("/") 1 -> this + part else -> StringBuilder(length + part.length + 1).apply { append(this@appendPathPart); append('/'); append(part) }.toString() } -} \ No newline at end of file +} diff --git a/ktor-server/ktor-server-core/src/io/ktor/request/ApplicationReceiveFunctions.kt b/ktor-server/ktor-server-core/jvm/src/io/ktor/request/ApplicationReceiveFunctions.kt similarity index 100% rename from ktor-server/ktor-server-core/src/io/ktor/request/ApplicationReceiveFunctions.kt rename to ktor-server/ktor-server-core/jvm/src/io/ktor/request/ApplicationReceiveFunctions.kt diff --git a/ktor-server/ktor-server-core/src/io/ktor/request/ApplicationRequest.kt b/ktor-server/ktor-server-core/jvm/src/io/ktor/request/ApplicationRequest.kt similarity index 100% rename from ktor-server/ktor-server-core/src/io/ktor/request/ApplicationRequest.kt rename to ktor-server/ktor-server-core/jvm/src/io/ktor/request/ApplicationRequest.kt diff --git a/ktor-server/ktor-server-core/src/io/ktor/request/ApplicationRequestProperties.kt b/ktor-server/ktor-server-core/jvm/src/io/ktor/request/ApplicationRequestProperties.kt similarity index 100% rename from ktor-server/ktor-server-core/src/io/ktor/request/ApplicationRequestProperties.kt rename to ktor-server/ktor-server-core/jvm/src/io/ktor/request/ApplicationRequestProperties.kt diff --git a/ktor-server/ktor-server-core/src/io/ktor/request/RequestCookies.kt b/ktor-server/ktor-server-core/jvm/src/io/ktor/request/RequestCookies.kt similarity index 100% rename from ktor-server/ktor-server-core/src/io/ktor/request/RequestCookies.kt rename to ktor-server/ktor-server-core/jvm/src/io/ktor/request/RequestCookies.kt diff --git a/ktor-server/ktor-server-core/src/io/ktor/response/ApplicationResponse.kt b/ktor-server/ktor-server-core/jvm/src/io/ktor/response/ApplicationResponse.kt similarity index 100% rename from ktor-server/ktor-server-core/src/io/ktor/response/ApplicationResponse.kt rename to ktor-server/ktor-server-core/jvm/src/io/ktor/response/ApplicationResponse.kt diff --git a/ktor-server/ktor-server-core/src/io/ktor/response/ApplicationResponseFunctions.kt b/ktor-server/ktor-server-core/jvm/src/io/ktor/response/ApplicationResponseFunctions.kt similarity index 100% rename from ktor-server/ktor-server-core/src/io/ktor/response/ApplicationResponseFunctions.kt rename to ktor-server/ktor-server-core/jvm/src/io/ktor/response/ApplicationResponseFunctions.kt diff --git a/ktor-server/ktor-server-core/src/io/ktor/response/ApplicationResponseProperties.kt b/ktor-server/ktor-server-core/jvm/src/io/ktor/response/ApplicationResponseProperties.kt similarity index 100% rename from ktor-server/ktor-server-core/src/io/ktor/response/ApplicationResponseProperties.kt rename to ktor-server/ktor-server-core/jvm/src/io/ktor/response/ApplicationResponseProperties.kt diff --git a/ktor-server/ktor-server-core/src/io/ktor/response/ApplicationSendPipeline.kt b/ktor-server/ktor-server-core/jvm/src/io/ktor/response/ApplicationSendPipeline.kt similarity index 100% rename from ktor-server/ktor-server-core/src/io/ktor/response/ApplicationSendPipeline.kt rename to ktor-server/ktor-server-core/jvm/src/io/ktor/response/ApplicationSendPipeline.kt diff --git a/ktor-server/ktor-server-core/src/io/ktor/response/DefaultResponsePushBuilder.kt b/ktor-server/ktor-server-core/jvm/src/io/ktor/response/DefaultResponsePushBuilder.kt similarity index 100% rename from ktor-server/ktor-server-core/src/io/ktor/response/DefaultResponsePushBuilder.kt rename to ktor-server/ktor-server-core/jvm/src/io/ktor/response/DefaultResponsePushBuilder.kt diff --git a/ktor-server/ktor-server-core/src/io/ktor/response/ResponseCookies.kt b/ktor-server/ktor-server-core/jvm/src/io/ktor/response/ResponseCookies.kt similarity index 100% rename from ktor-server/ktor-server-core/src/io/ktor/response/ResponseCookies.kt rename to ktor-server/ktor-server-core/jvm/src/io/ktor/response/ResponseCookies.kt diff --git a/ktor-server/ktor-server-core/src/io/ktor/response/ResponseHeaders.kt b/ktor-server/ktor-server-core/jvm/src/io/ktor/response/ResponseHeaders.kt similarity index 100% rename from ktor-server/ktor-server-core/src/io/ktor/response/ResponseHeaders.kt rename to ktor-server/ktor-server-core/jvm/src/io/ktor/response/ResponseHeaders.kt diff --git a/ktor-server/ktor-server-core/src/io/ktor/response/ResponsePushBuilder.kt b/ktor-server/ktor-server-core/jvm/src/io/ktor/response/ResponsePushBuilder.kt similarity index 100% rename from ktor-server/ktor-server-core/src/io/ktor/response/ResponsePushBuilder.kt rename to ktor-server/ktor-server-core/jvm/src/io/ktor/response/ResponsePushBuilder.kt diff --git a/ktor-server/ktor-server-core/src/io/ktor/routing/Route.kt b/ktor-server/ktor-server-core/jvm/src/io/ktor/routing/Route.kt similarity index 100% rename from ktor-server/ktor-server-core/src/io/ktor/routing/Route.kt rename to ktor-server/ktor-server-core/jvm/src/io/ktor/routing/Route.kt diff --git a/ktor-server/ktor-server-core/src/io/ktor/routing/RouteSelector.kt b/ktor-server/ktor-server-core/jvm/src/io/ktor/routing/RouteSelector.kt similarity index 100% rename from ktor-server/ktor-server-core/src/io/ktor/routing/RouteSelector.kt rename to ktor-server/ktor-server-core/jvm/src/io/ktor/routing/RouteSelector.kt diff --git a/ktor-server/ktor-server-core/src/io/ktor/routing/Routing.kt b/ktor-server/ktor-server-core/jvm/src/io/ktor/routing/Routing.kt similarity index 100% rename from ktor-server/ktor-server-core/src/io/ktor/routing/Routing.kt rename to ktor-server/ktor-server-core/jvm/src/io/ktor/routing/Routing.kt diff --git a/ktor-server/ktor-server-core/src/io/ktor/routing/RoutingApplicationCall.kt b/ktor-server/ktor-server-core/jvm/src/io/ktor/routing/RoutingApplicationCall.kt similarity index 100% rename from ktor-server/ktor-server-core/src/io/ktor/routing/RoutingApplicationCall.kt rename to ktor-server/ktor-server-core/jvm/src/io/ktor/routing/RoutingApplicationCall.kt diff --git a/ktor-server/ktor-server-core/src/io/ktor/routing/RoutingBuilder.kt b/ktor-server/ktor-server-core/jvm/src/io/ktor/routing/RoutingBuilder.kt similarity index 100% rename from ktor-server/ktor-server-core/src/io/ktor/routing/RoutingBuilder.kt rename to ktor-server/ktor-server-core/jvm/src/io/ktor/routing/RoutingBuilder.kt diff --git a/ktor-server/ktor-server-core/src/io/ktor/routing/RoutingPath.kt b/ktor-server/ktor-server-core/jvm/src/io/ktor/routing/RoutingPath.kt similarity index 100% rename from ktor-server/ktor-server-core/src/io/ktor/routing/RoutingPath.kt rename to ktor-server/ktor-server-core/jvm/src/io/ktor/routing/RoutingPath.kt diff --git a/ktor-server/ktor-server-core/src/io/ktor/routing/RoutingResolve.kt b/ktor-server/ktor-server-core/jvm/src/io/ktor/routing/RoutingResolve.kt similarity index 100% rename from ktor-server/ktor-server-core/src/io/ktor/routing/RoutingResolve.kt rename to ktor-server/ktor-server-core/jvm/src/io/ktor/routing/RoutingResolve.kt diff --git a/ktor-server/ktor-server-core/src/io/ktor/routing/RoutingResolveTrace.kt b/ktor-server/ktor-server-core/jvm/src/io/ktor/routing/RoutingResolveTrace.kt similarity index 100% rename from ktor-server/ktor-server-core/src/io/ktor/routing/RoutingResolveTrace.kt rename to ktor-server/ktor-server-core/jvm/src/io/ktor/routing/RoutingResolveTrace.kt diff --git a/ktor-server/ktor-server-core/src/io/ktor/sessions/SessionProvider.kt b/ktor-server/ktor-server-core/jvm/src/io/ktor/sessions/SessionProvider.kt similarity index 100% rename from ktor-server/ktor-server-core/src/io/ktor/sessions/SessionProvider.kt rename to ktor-server/ktor-server-core/jvm/src/io/ktor/sessions/SessionProvider.kt diff --git a/ktor-server/ktor-server-core/src/io/ktor/sessions/SessionSerializer.kt b/ktor-server/ktor-server-core/jvm/src/io/ktor/sessions/SessionSerializer.kt similarity index 100% rename from ktor-server/ktor-server-core/src/io/ktor/sessions/SessionSerializer.kt rename to ktor-server/ktor-server-core/jvm/src/io/ktor/sessions/SessionSerializer.kt diff --git a/ktor-server/ktor-server-core/src/io/ktor/sessions/SessionSerializerReflection.kt b/ktor-server/ktor-server-core/jvm/src/io/ktor/sessions/SessionSerializerReflection.kt similarity index 100% rename from ktor-server/ktor-server-core/src/io/ktor/sessions/SessionSerializerReflection.kt rename to ktor-server/ktor-server-core/jvm/src/io/ktor/sessions/SessionSerializerReflection.kt diff --git a/ktor-server/ktor-server-core/src/io/ktor/sessions/SessionStorage.kt b/ktor-server/ktor-server-core/jvm/src/io/ktor/sessions/SessionStorage.kt similarity index 100% rename from ktor-server/ktor-server-core/src/io/ktor/sessions/SessionStorage.kt rename to ktor-server/ktor-server-core/jvm/src/io/ktor/sessions/SessionStorage.kt diff --git a/ktor-server/ktor-server-core/src/io/ktor/sessions/SessionStorageMemory.kt b/ktor-server/ktor-server-core/jvm/src/io/ktor/sessions/SessionStorageMemory.kt similarity index 100% rename from ktor-server/ktor-server-core/src/io/ktor/sessions/SessionStorageMemory.kt rename to ktor-server/ktor-server-core/jvm/src/io/ktor/sessions/SessionStorageMemory.kt diff --git a/ktor-server/ktor-server-core/src/io/ktor/sessions/SessionTracker.kt b/ktor-server/ktor-server-core/jvm/src/io/ktor/sessions/SessionTracker.kt similarity index 100% rename from ktor-server/ktor-server-core/src/io/ktor/sessions/SessionTracker.kt rename to ktor-server/ktor-server-core/jvm/src/io/ktor/sessions/SessionTracker.kt diff --git a/ktor-server/ktor-server-core/src/io/ktor/sessions/SessionTrackerById.kt b/ktor-server/ktor-server-core/jvm/src/io/ktor/sessions/SessionTrackerById.kt similarity index 100% rename from ktor-server/ktor-server-core/src/io/ktor/sessions/SessionTrackerById.kt rename to ktor-server/ktor-server-core/jvm/src/io/ktor/sessions/SessionTrackerById.kt diff --git a/ktor-server/ktor-server-core/src/io/ktor/sessions/SessionTrackerByValue.kt b/ktor-server/ktor-server-core/jvm/src/io/ktor/sessions/SessionTrackerByValue.kt similarity index 100% rename from ktor-server/ktor-server-core/src/io/ktor/sessions/SessionTrackerByValue.kt rename to ktor-server/ktor-server-core/jvm/src/io/ktor/sessions/SessionTrackerByValue.kt diff --git a/ktor-server/ktor-server-core/src/io/ktor/sessions/SessionTransport.kt b/ktor-server/ktor-server-core/jvm/src/io/ktor/sessions/SessionTransport.kt similarity index 100% rename from ktor-server/ktor-server-core/src/io/ktor/sessions/SessionTransport.kt rename to ktor-server/ktor-server-core/jvm/src/io/ktor/sessions/SessionTransport.kt diff --git a/ktor-server/ktor-server-core/src/io/ktor/sessions/SessionTransportCookie.kt b/ktor-server/ktor-server-core/jvm/src/io/ktor/sessions/SessionTransportCookie.kt similarity index 100% rename from ktor-server/ktor-server-core/src/io/ktor/sessions/SessionTransportCookie.kt rename to ktor-server/ktor-server-core/jvm/src/io/ktor/sessions/SessionTransportCookie.kt diff --git a/ktor-server/ktor-server-core/src/io/ktor/sessions/SessionTransportHeader.kt b/ktor-server/ktor-server-core/jvm/src/io/ktor/sessions/SessionTransportHeader.kt similarity index 100% rename from ktor-server/ktor-server-core/src/io/ktor/sessions/SessionTransportHeader.kt rename to ktor-server/ktor-server-core/jvm/src/io/ktor/sessions/SessionTransportHeader.kt diff --git a/ktor-server/ktor-server-core/src/io/ktor/sessions/SessionTransportTransformer.kt b/ktor-server/ktor-server-core/jvm/src/io/ktor/sessions/SessionTransportTransformer.kt similarity index 100% rename from ktor-server/ktor-server-core/src/io/ktor/sessions/SessionTransportTransformer.kt rename to ktor-server/ktor-server-core/jvm/src/io/ktor/sessions/SessionTransportTransformer.kt diff --git a/ktor-server/ktor-server-core/src/io/ktor/sessions/SessionTransportTransformerDigest.kt b/ktor-server/ktor-server-core/jvm/src/io/ktor/sessions/SessionTransportTransformerDigest.kt similarity index 100% rename from ktor-server/ktor-server-core/src/io/ktor/sessions/SessionTransportTransformerDigest.kt rename to ktor-server/ktor-server-core/jvm/src/io/ktor/sessions/SessionTransportTransformerDigest.kt diff --git a/ktor-server/ktor-server-core/src/io/ktor/sessions/SessionTransportTransformerEncrypt.kt b/ktor-server/ktor-server-core/jvm/src/io/ktor/sessions/SessionTransportTransformerEncrypt.kt similarity index 100% rename from ktor-server/ktor-server-core/src/io/ktor/sessions/SessionTransportTransformerEncrypt.kt rename to ktor-server/ktor-server-core/jvm/src/io/ktor/sessions/SessionTransportTransformerEncrypt.kt diff --git a/ktor-server/ktor-server-core/src/io/ktor/sessions/SessionTransportTransformerMessageAuthentication.kt b/ktor-server/ktor-server-core/jvm/src/io/ktor/sessions/SessionTransportTransformerMessageAuthentication.kt similarity index 100% rename from ktor-server/ktor-server-core/src/io/ktor/sessions/SessionTransportTransformerMessageAuthentication.kt rename to ktor-server/ktor-server-core/jvm/src/io/ktor/sessions/SessionTransportTransformerMessageAuthentication.kt diff --git a/ktor-server/ktor-server-core/src/io/ktor/sessions/Sessions.kt b/ktor-server/ktor-server-core/jvm/src/io/ktor/sessions/Sessions.kt similarity index 100% rename from ktor-server/ktor-server-core/src/io/ktor/sessions/Sessions.kt rename to ktor-server/ktor-server-core/jvm/src/io/ktor/sessions/Sessions.kt diff --git a/ktor-server/ktor-server-core/src/io/ktor/sessions/SessionsBuilder.kt b/ktor-server/ktor-server-core/jvm/src/io/ktor/sessions/SessionsBuilder.kt similarity index 100% rename from ktor-server/ktor-server-core/src/io/ktor/sessions/SessionsBuilder.kt rename to ktor-server/ktor-server-core/jvm/src/io/ktor/sessions/SessionsBuilder.kt diff --git a/ktor-server/ktor-server-core/src/io/ktor/util/ConversionService.kt b/ktor-server/ktor-server-core/jvm/src/io/ktor/util/ConversionService.kt similarity index 100% rename from ktor-server/ktor-server-core/src/io/ktor/util/ConversionService.kt rename to ktor-server/ktor-server-core/jvm/src/io/ktor/util/ConversionService.kt diff --git a/ktor-server/ktor-server-core/src/io/ktor/util/DispatcherWithShutdown.kt b/ktor-server/ktor-server-core/jvm/src/io/ktor/util/DispatcherWithShutdown.kt similarity index 100% rename from ktor-server/ktor-server-core/src/io/ktor/util/DispatcherWithShutdown.kt rename to ktor-server/ktor-server-core/jvm/src/io/ktor/util/DispatcherWithShutdown.kt diff --git a/ktor-server/ktor-server-core/src/io/ktor/util/URLBuilder.kt b/ktor-server/ktor-server-core/jvm/src/io/ktor/util/URLBuilder.kt similarity index 100% rename from ktor-server/ktor-server-core/src/io/ktor/util/URLBuilder.kt rename to ktor-server/ktor-server-core/jvm/src/io/ktor/util/URLBuilder.kt diff --git a/ktor-server/ktor-server-core/test-resources/error404.html b/ktor-server/ktor-server-core/jvm/test-resources/error404.html similarity index 100% rename from ktor-server/ktor-server-core/test-resources/error404.html rename to ktor-server/ktor-server-core/jvm/test-resources/error404.html diff --git a/ktor-server/ktor-server-core/test-resources/logback-test.xml b/ktor-server/ktor-server-core/jvm/test-resources/logback-test.xml similarity index 100% rename from ktor-server/ktor-server-core/test-resources/logback-test.xml rename to ktor-server/ktor-server-core/jvm/test-resources/logback-test.xml diff --git a/ktor-server/ktor-server-core/test/io/ktor/tests/http/FindContainingJarFileTest.kt b/ktor-server/ktor-server-core/jvm/test/io/ktor/tests/http/FindContainingJarFileTest.kt similarity index 100% rename from ktor-server/ktor-server-core/test/io/ktor/tests/http/FindContainingJarFileTest.kt rename to ktor-server/ktor-server-core/jvm/test/io/ktor/tests/http/FindContainingJarFileTest.kt diff --git a/ktor-server/ktor-server-core/test/io/ktor/tests/http/MultipleRangeWriterTest.kt b/ktor-server/ktor-server-core/jvm/test/io/ktor/tests/http/MultipleRangeWriterTest.kt similarity index 100% rename from ktor-server/ktor-server-core/test/io/ktor/tests/http/MultipleRangeWriterTest.kt rename to ktor-server/ktor-server-core/jvm/test/io/ktor/tests/http/MultipleRangeWriterTest.kt diff --git a/ktor-server/ktor-server-host-common/build.gradle b/ktor-server/ktor-server-host-common/build.gradle index 6b8b577174..cf21259301 100644 --- a/ktor-server/ktor-server-host-common/build.gradle +++ b/ktor-server/ktor-server-host-common/build.gradle @@ -1,5 +1,6 @@ description = '' -dependencies { - compile project(':ktor-server:ktor-server-core') - compile project(':ktor-http:ktor-http-cio') + +kotlin.sourceSets.jvmMain.dependencies { + api project(':ktor-server:ktor-server-core') + api project(':ktor-http:ktor-http-cio') } diff --git a/ktor-server/ktor-server-host-common/src/io/ktor/server/engine/ApplicationEngine.kt b/ktor-server/ktor-server-host-common/jvm/src/io/ktor/server/engine/ApplicationEngine.kt similarity index 100% rename from ktor-server/ktor-server-host-common/src/io/ktor/server/engine/ApplicationEngine.kt rename to ktor-server/ktor-server-host-common/jvm/src/io/ktor/server/engine/ApplicationEngine.kt diff --git a/ktor-server/ktor-server-host-common/src/io/ktor/server/engine/ApplicationEngineEnvironment.kt b/ktor-server/ktor-server-host-common/jvm/src/io/ktor/server/engine/ApplicationEngineEnvironment.kt similarity index 100% rename from ktor-server/ktor-server-host-common/src/io/ktor/server/engine/ApplicationEngineEnvironment.kt rename to ktor-server/ktor-server-host-common/jvm/src/io/ktor/server/engine/ApplicationEngineEnvironment.kt diff --git a/ktor-server/ktor-server-host-common/src/io/ktor/server/engine/ApplicationEngineEnvironmentReloading.kt b/ktor-server/ktor-server-host-common/jvm/src/io/ktor/server/engine/ApplicationEngineEnvironmentReloading.kt similarity index 100% rename from ktor-server/ktor-server-host-common/src/io/ktor/server/engine/ApplicationEngineEnvironmentReloading.kt rename to ktor-server/ktor-server-host-common/jvm/src/io/ktor/server/engine/ApplicationEngineEnvironmentReloading.kt diff --git a/ktor-server/ktor-server-host-common/src/io/ktor/server/engine/BaseApplicationCall.kt b/ktor-server/ktor-server-host-common/jvm/src/io/ktor/server/engine/BaseApplicationCall.kt similarity index 100% rename from ktor-server/ktor-server-host-common/src/io/ktor/server/engine/BaseApplicationCall.kt rename to ktor-server/ktor-server-host-common/jvm/src/io/ktor/server/engine/BaseApplicationCall.kt diff --git a/ktor-server/ktor-server-host-common/src/io/ktor/server/engine/BaseApplicationEngine.kt b/ktor-server/ktor-server-host-common/jvm/src/io/ktor/server/engine/BaseApplicationEngine.kt similarity index 100% rename from ktor-server/ktor-server-host-common/src/io/ktor/server/engine/BaseApplicationEngine.kt rename to ktor-server/ktor-server-host-common/jvm/src/io/ktor/server/engine/BaseApplicationEngine.kt diff --git a/ktor-server/ktor-server-host-common/src/io/ktor/server/engine/BaseApplicationRequest.kt b/ktor-server/ktor-server-host-common/jvm/src/io/ktor/server/engine/BaseApplicationRequest.kt similarity index 100% rename from ktor-server/ktor-server-host-common/src/io/ktor/server/engine/BaseApplicationRequest.kt rename to ktor-server/ktor-server-host-common/jvm/src/io/ktor/server/engine/BaseApplicationRequest.kt diff --git a/ktor-server/ktor-server-host-common/src/io/ktor/server/engine/BaseApplicationResponse.kt b/ktor-server/ktor-server-host-common/jvm/src/io/ktor/server/engine/BaseApplicationResponse.kt similarity index 100% rename from ktor-server/ktor-server-host-common/src/io/ktor/server/engine/BaseApplicationResponse.kt rename to ktor-server/ktor-server-host-common/jvm/src/io/ktor/server/engine/BaseApplicationResponse.kt diff --git a/ktor-server/ktor-server-host-common/src/io/ktor/server/engine/CommandLine.kt b/ktor-server/ktor-server-host-common/jvm/src/io/ktor/server/engine/CommandLine.kt similarity index 100% rename from ktor-server/ktor-server-host-common/src/io/ktor/server/engine/CommandLine.kt rename to ktor-server/ktor-server-host-common/jvm/src/io/ktor/server/engine/CommandLine.kt diff --git a/ktor-server/ktor-server-host-common/src/io/ktor/server/engine/DefaultEnginePipeline.kt b/ktor-server/ktor-server-host-common/jvm/src/io/ktor/server/engine/DefaultEnginePipeline.kt similarity index 100% rename from ktor-server/ktor-server-host-common/src/io/ktor/server/engine/DefaultEnginePipeline.kt rename to ktor-server/ktor-server-host-common/jvm/src/io/ktor/server/engine/DefaultEnginePipeline.kt diff --git a/ktor-server/ktor-server-host-common/src/io/ktor/server/engine/DefaultTransform.kt b/ktor-server/ktor-server-host-common/jvm/src/io/ktor/server/engine/DefaultTransform.kt similarity index 95% rename from ktor-server/ktor-server-host-common/src/io/ktor/server/engine/DefaultTransform.kt rename to ktor-server/ktor-server-host-common/jvm/src/io/ktor/server/engine/DefaultTransform.kt index 66666ba12a..2ff58a742d 100644 --- a/ktor-server/ktor-server-host-common/src/io/ktor/server/engine/DefaultTransform.kt +++ b/ktor-server/ktor-server-host-common/jvm/src/io/ktor/server/engine/DefaultTransform.kt @@ -75,7 +75,12 @@ private fun PipelineContext<*, ApplicationCall>.multiPartData(rc: ByteReadChanne ?: throw IllegalStateException("Content-Type header is required for multipart processing") val contentLength = call.request.header(HttpHeaders.ContentLength)?.toLong() - return CIOMultipartDataBase(coroutineContext + Dispatchers.Unconfined, rc, contentType, contentLength) + return CIOMultipartDataBase( + coroutineContext + Dispatchers.Unconfined, + rc, + contentType, + contentLength + ) } private suspend fun ByteReadChannel.readText( diff --git a/ktor-server/ktor-server-host-common/src/io/ktor/server/engine/EmbeddedServer.kt b/ktor-server/ktor-server-host-common/jvm/src/io/ktor/server/engine/EmbeddedServer.kt similarity index 100% rename from ktor-server/ktor-server-host-common/src/io/ktor/server/engine/EmbeddedServer.kt rename to ktor-server/ktor-server-host-common/jvm/src/io/ktor/server/engine/EmbeddedServer.kt diff --git a/ktor-server/ktor-server-host-common/src/io/ktor/server/engine/EngineAPI.kt b/ktor-server/ktor-server-host-common/jvm/src/io/ktor/server/engine/EngineAPI.kt similarity index 100% rename from ktor-server/ktor-server-host-common/src/io/ktor/server/engine/EngineAPI.kt rename to ktor-server/ktor-server-host-common/jvm/src/io/ktor/server/engine/EngineAPI.kt diff --git a/ktor-server/ktor-server-host-common/src/io/ktor/server/engine/EngineConnectorConfig.kt b/ktor-server/ktor-server-host-common/jvm/src/io/ktor/server/engine/EngineConnectorConfig.kt similarity index 100% rename from ktor-server/ktor-server-host-common/src/io/ktor/server/engine/EngineConnectorConfig.kt rename to ktor-server/ktor-server-host-common/jvm/src/io/ktor/server/engine/EngineConnectorConfig.kt diff --git a/ktor-server/ktor-server-host-common/src/io/ktor/server/engine/EngineContextCancellationHelper.kt b/ktor-server/ktor-server-host-common/jvm/src/io/ktor/server/engine/EngineContextCancellationHelper.kt similarity index 100% rename from ktor-server/ktor-server-host-common/src/io/ktor/server/engine/EngineContextCancellationHelper.kt rename to ktor-server/ktor-server-host-common/jvm/src/io/ktor/server/engine/EngineContextCancellationHelper.kt diff --git a/ktor-server/ktor-server-host-common/src/io/ktor/server/engine/EnginePipeline.kt b/ktor-server/ktor-server-host-common/jvm/src/io/ktor/server/engine/EnginePipeline.kt similarity index 100% rename from ktor-server/ktor-server-host-common/src/io/ktor/server/engine/EnginePipeline.kt rename to ktor-server/ktor-server-host-common/jvm/src/io/ktor/server/engine/EnginePipeline.kt diff --git a/ktor-server/ktor-server-host-common/src/io/ktor/server/engine/Long.kt b/ktor-server/ktor-server-host-common/jvm/src/io/ktor/server/engine/Long.kt similarity index 100% rename from ktor-server/ktor-server-host-common/src/io/ktor/server/engine/Long.kt rename to ktor-server/ktor-server-host-common/jvm/src/io/ktor/server/engine/Long.kt diff --git a/ktor-server/ktor-server-host-common/src/io/ktor/server/engine/OverridingClassLoader.kt b/ktor-server/ktor-server-host-common/jvm/src/io/ktor/server/engine/OverridingClassLoader.kt similarity index 100% rename from ktor-server/ktor-server-host-common/src/io/ktor/server/engine/OverridingClassLoader.kt rename to ktor-server/ktor-server-host-common/jvm/src/io/ktor/server/engine/OverridingClassLoader.kt diff --git a/ktor-server/ktor-server-host-common/src/io/ktor/server/engine/ShutDownUrl.kt b/ktor-server/ktor-server-host-common/jvm/src/io/ktor/server/engine/ShutDownUrl.kt similarity index 100% rename from ktor-server/ktor-server-host-common/src/io/ktor/server/engine/ShutDownUrl.kt rename to ktor-server/ktor-server-host-common/jvm/src/io/ktor/server/engine/ShutDownUrl.kt diff --git a/ktor-server/ktor-server-host-common/test-resources/application.conf b/ktor-server/ktor-server-host-common/jvm/test-resources/application.conf similarity index 100% rename from ktor-server/ktor-server-host-common/test-resources/application.conf rename to ktor-server/ktor-server-host-common/jvm/test-resources/application.conf diff --git a/ktor-server/ktor-server-host-common/test-resources/applicationWithEnv.conf b/ktor-server/ktor-server-host-common/jvm/test-resources/applicationWithEnv.conf similarity index 100% rename from ktor-server/ktor-server-host-common/test-resources/applicationWithEnv.conf rename to ktor-server/ktor-server-host-common/jvm/test-resources/applicationWithEnv.conf diff --git a/ktor-server/ktor-server-host-common/test/io/ktor/tests/hosts/ApplicationEngineEnvironmentReloadingTests.kt b/ktor-server/ktor-server-host-common/jvm/test/io/ktor/tests/hosts/ApplicationEngineEnvironmentReloadingTests.kt similarity index 100% rename from ktor-server/ktor-server-host-common/test/io/ktor/tests/hosts/ApplicationEngineEnvironmentReloadingTests.kt rename to ktor-server/ktor-server-host-common/jvm/test/io/ktor/tests/hosts/ApplicationEngineEnvironmentReloadingTests.kt diff --git a/ktor-server/ktor-server-host-common/test/io/ktor/tests/hosts/CommandLineTest.kt b/ktor-server/ktor-server-host-common/jvm/test/io/ktor/tests/hosts/CommandLineTest.kt similarity index 100% rename from ktor-server/ktor-server-host-common/test/io/ktor/tests/hosts/CommandLineTest.kt rename to ktor-server/ktor-server-host-common/jvm/test/io/ktor/tests/hosts/CommandLineTest.kt diff --git a/ktor-server/ktor-server-jetty/build.gradle b/ktor-server/ktor-server-jetty/build.gradle index cfde763e11..4aa997c7d2 100644 --- a/ktor-server/ktor-server-jetty/build.gradle +++ b/ktor-server/ktor-server-jetty/build.gradle @@ -1,19 +1,26 @@ description = '' -dependencies { - compile project(':ktor-server:ktor-server-host-common') - compile project(':ktor-server:ktor-server-servlet') - compile group: 'org.eclipse.jetty', name: 'jetty-server', version: jetty_version - compile group: 'org.eclipse.jetty', name: 'jetty-servlets', version: jetty_version - compile group: 'org.eclipse.jetty', name: 'jetty-alpn-server', version: jetty_version - compile group: 'org.eclipse.jetty', name: 'jetty-alpn-openjdk8-server', version: jetty_version - compile group: 'org.eclipse.jetty', name: 'jetty-alpn-java-server', version: jetty_version - compile group: 'org.eclipse.jetty.http2', name: 'http2-server', version: jetty_version - - testCompile project(':ktor-server:ktor-server-test-host') - testCompile group: 'org.eclipse.jetty', name: 'jetty-servlet', version: jetty_version - testCompile project(':ktor-server:ktor-server-core') - testCompile project(path: ':ktor-server:ktor-server-core', configuration: 'testOutput') +kotlin { + sourceSets { + jvmMain.dependencies { + api project(':ktor-server:ktor-server-host-common') + api project(':ktor-server:ktor-server-servlet') + api group: 'org.eclipse.jetty', name: 'jetty-server', version: jetty_version + api group: 'org.eclipse.jetty', name: 'jetty-servlets', version: jetty_version + api group: 'org.eclipse.jetty', name: 'jetty-alpn-server', version: jetty_version + api group: 'org.eclipse.jetty', name: 'jetty-alpn-openjdk8-server', version: jetty_version + api group: 'org.eclipse.jetty', name: 'jetty-alpn-java-server', version: jetty_version + api group: 'org.eclipse.jetty.http2', name: 'http2-server', version: jetty_version - boot group: 'org.mortbay.jetty.alpn', name: 'alpn-boot', version: jetty_alpn_boot_version + } + jvmTest.dependencies { + api project(':ktor-server:ktor-server-core') + api project(':ktor-server:ktor-server-test-host') + api group: 'org.eclipse.jetty', name: 'jetty-servlet', version: jetty_version + } + } } +dependencies { + jvmTestApi project(path: ':ktor-server:ktor-server-core', configuration: 'testOutput') + boot group: 'org.mortbay.jetty.alpn', name: 'alpn-boot', version: project.ext.jetty_alpn_boot_version +} diff --git a/ktor-server/ktor-server-jetty/src/io/ktor/server/jetty/Embedded.kt b/ktor-server/ktor-server-jetty/jvm/src/io/ktor/server/jetty/Embedded.kt similarity index 100% rename from ktor-server/ktor-server-jetty/src/io/ktor/server/jetty/Embedded.kt rename to ktor-server/ktor-server-jetty/jvm/src/io/ktor/server/jetty/Embedded.kt diff --git a/ktor-server/ktor-server-jetty/src/io/ktor/server/jetty/EngineMain.kt b/ktor-server/ktor-server-jetty/jvm/src/io/ktor/server/jetty/EngineMain.kt similarity index 100% rename from ktor-server/ktor-server-jetty/src/io/ktor/server/jetty/EngineMain.kt rename to ktor-server/ktor-server-jetty/jvm/src/io/ktor/server/jetty/EngineMain.kt diff --git a/ktor-server/ktor-server-jetty/src/io/ktor/server/jetty/JettyApplicationCall.kt b/ktor-server/ktor-server-jetty/jvm/src/io/ktor/server/jetty/JettyApplicationCall.kt similarity index 100% rename from ktor-server/ktor-server-jetty/src/io/ktor/server/jetty/JettyApplicationCall.kt rename to ktor-server/ktor-server-jetty/jvm/src/io/ktor/server/jetty/JettyApplicationCall.kt diff --git a/ktor-server/ktor-server-jetty/src/io/ktor/server/jetty/JettyApplicationEngine.kt b/ktor-server/ktor-server-jetty/jvm/src/io/ktor/server/jetty/JettyApplicationEngine.kt similarity index 100% rename from ktor-server/ktor-server-jetty/src/io/ktor/server/jetty/JettyApplicationEngine.kt rename to ktor-server/ktor-server-jetty/jvm/src/io/ktor/server/jetty/JettyApplicationEngine.kt diff --git a/ktor-server/ktor-server-jetty/src/io/ktor/server/jetty/JettyApplicationEngineBase.kt b/ktor-server/ktor-server-jetty/jvm/src/io/ktor/server/jetty/JettyApplicationEngineBase.kt similarity index 100% rename from ktor-server/ktor-server-jetty/src/io/ktor/server/jetty/JettyApplicationEngineBase.kt rename to ktor-server/ktor-server-jetty/jvm/src/io/ktor/server/jetty/JettyApplicationEngineBase.kt diff --git a/ktor-server/ktor-server-jetty/src/io/ktor/server/jetty/JettyApplicationResponse.kt b/ktor-server/ktor-server-jetty/jvm/src/io/ktor/server/jetty/JettyApplicationResponse.kt similarity index 100% rename from ktor-server/ktor-server-jetty/src/io/ktor/server/jetty/JettyApplicationResponse.kt rename to ktor-server/ktor-server-jetty/jvm/src/io/ktor/server/jetty/JettyApplicationResponse.kt diff --git a/ktor-server/ktor-server-jetty/src/io/ktor/server/jetty/JettyKtorHandler.kt b/ktor-server/ktor-server-jetty/jvm/src/io/ktor/server/jetty/JettyKtorHandler.kt similarity index 100% rename from ktor-server/ktor-server-jetty/src/io/ktor/server/jetty/JettyKtorHandler.kt rename to ktor-server/ktor-server-jetty/jvm/src/io/ktor/server/jetty/JettyKtorHandler.kt diff --git a/ktor-server/ktor-server-jetty/src/io/ktor/server/jetty/ServerInitializer.kt b/ktor-server/ktor-server-jetty/jvm/src/io/ktor/server/jetty/ServerInitializer.kt similarity index 100% rename from ktor-server/ktor-server-jetty/src/io/ktor/server/jetty/ServerInitializer.kt rename to ktor-server/ktor-server-jetty/jvm/src/io/ktor/server/jetty/ServerInitializer.kt diff --git a/ktor-server/ktor-server-jetty/src/io/ktor/server/jetty/internal/EndPointChannels.kt b/ktor-server/ktor-server-jetty/jvm/src/io/ktor/server/jetty/internal/EndPointChannels.kt similarity index 100% rename from ktor-server/ktor-server-jetty/src/io/ktor/server/jetty/internal/EndPointChannels.kt rename to ktor-server/ktor-server-jetty/jvm/src/io/ktor/server/jetty/internal/EndPointChannels.kt diff --git a/ktor-server/ktor-server-jetty/src/io/ktor/server/jetty/internal/JettyUpgradeImpl.kt b/ktor-server/ktor-server-jetty/jvm/src/io/ktor/server/jetty/internal/JettyUpgradeImpl.kt similarity index 100% rename from ktor-server/ktor-server-jetty/src/io/ktor/server/jetty/internal/JettyUpgradeImpl.kt rename to ktor-server/ktor-server-jetty/jvm/src/io/ktor/server/jetty/internal/JettyUpgradeImpl.kt diff --git a/ktor-server/ktor-server-jetty/ktor-server-jetty-test-http2/test/io/ktor/tests/server/jetty/JettyEngineTest.kt b/ktor-server/ktor-server-jetty/jvm/test/io/ktor/tests/server/jetty/JettyEngineTest.kt similarity index 100% rename from ktor-server/ktor-server-jetty/ktor-server-jetty-test-http2/test/io/ktor/tests/server/jetty/JettyEngineTest.kt rename to ktor-server/ktor-server-jetty/jvm/test/io/ktor/tests/server/jetty/JettyEngineTest.kt diff --git a/ktor-server/ktor-server-jetty/test/io/ktor/tests/server/jetty/JettyServletContainerEngineTest.kt b/ktor-server/ktor-server-jetty/jvm/test/io/ktor/tests/server/jetty/JettyServletContainerEngineTest.kt similarity index 83% rename from ktor-server/ktor-server-jetty/test/io/ktor/tests/server/jetty/JettyServletContainerEngineTest.kt rename to ktor-server/ktor-server-jetty/jvm/test/io/ktor/tests/server/jetty/JettyServletContainerEngineTest.kt index de419445cc..1176822b12 100644 --- a/ktor-server/ktor-server-jetty/test/io/ktor/tests/server/jetty/JettyServletContainerEngineTest.kt +++ b/ktor-server/ktor-server-jetty/jvm/test/io/ktor/tests/server/jetty/JettyServletContainerEngineTest.kt @@ -14,14 +14,19 @@ class JettyAsyncServletContainerEngineTest : class JettyBlockingServletContainerEngineTest : EngineTestSuite(Servlet(async = false)) { @Ignore - override fun testUpgrade() {} + override fun testUpgrade() { + } } // the factory and engine are only suitable for testing // you shouldn't use it for production code -private class Servlet(private val async: Boolean) : ApplicationEngineFactory { - override fun create(environment: ApplicationEngineEnvironment, configure: JettyApplicationEngineBase.Configuration.() -> Unit): JettyServletApplicationEngine { +private class Servlet(private val async: Boolean) : + ApplicationEngineFactory { + override fun create( + environment: ApplicationEngineEnvironment, + configure: JettyApplicationEngineBase.Configuration.() -> Unit + ): JettyServletApplicationEngine { return JettyServletApplicationEngine(environment, configure, async) } } diff --git a/ktor-server/ktor-server-jetty/test/io/ktor/tests/server/jetty/JettyStressTest.kt b/ktor-server/ktor-server-jetty/jvm/test/io/ktor/tests/server/jetty/JettyStressTest.kt similarity index 100% rename from ktor-server/ktor-server-jetty/test/io/ktor/tests/server/jetty/JettyStressTest.kt rename to ktor-server/ktor-server-jetty/jvm/test/io/ktor/tests/server/jetty/JettyStressTest.kt diff --git a/ktor-server/ktor-server-jetty/ktor-server-jetty-test-http2/test/io/ktor/tests/server/jetty/MultipleDispatchOnTimeout.kt b/ktor-server/ktor-server-jetty/jvm/test/io/ktor/tests/server/jetty/MultipleDispatchOnTimeout.kt similarity index 100% rename from ktor-server/ktor-server-jetty/ktor-server-jetty-test-http2/test/io/ktor/tests/server/jetty/MultipleDispatchOnTimeout.kt rename to ktor-server/ktor-server-jetty/jvm/test/io/ktor/tests/server/jetty/MultipleDispatchOnTimeout.kt diff --git a/ktor-server/ktor-server-jetty/ktor-server-jetty-test-http2/build.gradle b/ktor-server/ktor-server-jetty/ktor-server-jetty-test-http2/build.gradle index 77add05e3e..d7b50cd7a4 100644 --- a/ktor-server/ktor-server-jetty/ktor-server-jetty-test-http2/build.gradle +++ b/ktor-server/ktor-server-jetty/ktor-server-jetty-test-http2/build.gradle @@ -1,15 +1,17 @@ -dependencies { - testCompile project(':ktor-server:ktor-server-test-host') - testCompile group: 'org.eclipse.jetty', name: 'jetty-servlet', version: jetty_version - testCompile project(':ktor-server:ktor-server-core') - testCompile project(path: ':ktor-server:ktor-server-core', configuration: 'testOutput') +kotlin.sourceSets.jvmTest.dependencies { + api project(':ktor-server:ktor-server-test-host') + api group: 'org.eclipse.jetty', name: 'jetty-servlet', version: jetty_version + api project(':ktor-server:ktor-server-core') + api project(":ktor-server:ktor-server-jetty") +} - testCompile project(":ktor-server:ktor-server-jetty") - boot group: 'org.mortbay.jetty.alpn', name: 'alpn-boot', version: jetty_alpn_boot_version +dependencies { + jvmTestApi project(path: ':ktor-server:ktor-server-core', configuration: 'testOutput') + boot group: 'org.mortbay.jetty.alpn', name: 'alpn-boot', version: project.ext.jetty_alpn_boot_version } -configure(tasks.test) { +configure(tasks.jvmTest) { useJUnit() systemProperty 'enable.http2', 'true' diff --git a/ktor-server/ktor-server-jetty/test/io/ktor/tests/server/jetty/JettyEngineTest.kt b/ktor-server/ktor-server-jetty/ktor-server-jetty-test-http2/jvm/test/io/ktor/tests/server/jetty/JettyEngineTest.kt similarity index 100% rename from ktor-server/ktor-server-jetty/test/io/ktor/tests/server/jetty/JettyEngineTest.kt rename to ktor-server/ktor-server-jetty/ktor-server-jetty-test-http2/jvm/test/io/ktor/tests/server/jetty/JettyEngineTest.kt diff --git a/ktor-server/ktor-server-jetty/ktor-server-jetty-test-http2/test/io/ktor/tests/server/jetty/JettyServletContainerEngineTest.kt b/ktor-server/ktor-server-jetty/ktor-server-jetty-test-http2/jvm/test/io/ktor/tests/server/jetty/JettyServletContainerEngineTest.kt similarity index 83% rename from ktor-server/ktor-server-jetty/ktor-server-jetty-test-http2/test/io/ktor/tests/server/jetty/JettyServletContainerEngineTest.kt rename to ktor-server/ktor-server-jetty/ktor-server-jetty-test-http2/jvm/test/io/ktor/tests/server/jetty/JettyServletContainerEngineTest.kt index de419445cc..1176822b12 100644 --- a/ktor-server/ktor-server-jetty/ktor-server-jetty-test-http2/test/io/ktor/tests/server/jetty/JettyServletContainerEngineTest.kt +++ b/ktor-server/ktor-server-jetty/ktor-server-jetty-test-http2/jvm/test/io/ktor/tests/server/jetty/JettyServletContainerEngineTest.kt @@ -14,14 +14,19 @@ class JettyAsyncServletContainerEngineTest : class JettyBlockingServletContainerEngineTest : EngineTestSuite(Servlet(async = false)) { @Ignore - override fun testUpgrade() {} + override fun testUpgrade() { + } } // the factory and engine are only suitable for testing // you shouldn't use it for production code -private class Servlet(private val async: Boolean) : ApplicationEngineFactory { - override fun create(environment: ApplicationEngineEnvironment, configure: JettyApplicationEngineBase.Configuration.() -> Unit): JettyServletApplicationEngine { +private class Servlet(private val async: Boolean) : + ApplicationEngineFactory { + override fun create( + environment: ApplicationEngineEnvironment, + configure: JettyApplicationEngineBase.Configuration.() -> Unit + ): JettyServletApplicationEngine { return JettyServletApplicationEngine(environment, configure, async) } } diff --git a/ktor-server/ktor-server-jetty/test/io/ktor/tests/server/jetty/MultipleDispatchOnTimeout.kt b/ktor-server/ktor-server-jetty/ktor-server-jetty-test-http2/jvm/test/io/ktor/tests/server/jetty/MultipleDispatchOnTimeout.kt similarity index 100% rename from ktor-server/ktor-server-jetty/test/io/ktor/tests/server/jetty/MultipleDispatchOnTimeout.kt rename to ktor-server/ktor-server-jetty/ktor-server-jetty-test-http2/jvm/test/io/ktor/tests/server/jetty/MultipleDispatchOnTimeout.kt diff --git a/ktor-server/ktor-server-netty/build.gradle b/ktor-server/ktor-server-netty/build.gradle index 7eb288888a..be22744e87 100644 --- a/ktor-server/ktor-server-netty/build.gradle +++ b/ktor-server/ktor-server-netty/build.gradle @@ -1,14 +1,22 @@ description = '' -dependencies { - compile project(':ktor-server:ktor-server-host-common') - compile group: 'io.netty', name: 'netty-codec-http2', version: netty_version - compile group: 'org.eclipse.jetty.alpn', name: 'alpn-api', version: jetty_alpn_api_version - testCompile project(':ktor-server:ktor-server-test-host') - testCompile project(':ktor-server:ktor-server-core') - testCompile group: 'io.netty', name: 'netty-tcnative', version: netty_tcnative_version - testCompile group: 'io.netty', name: 'netty-tcnative-boringssl-static', version: netty_tcnative_version + +kotlin.sourceSets { + jvmMain.dependencies { + api project(':ktor-server:ktor-server-host-common') + + api group: 'io.netty', name: 'netty-codec-http2', version: netty_version + api group: 'org.eclipse.jetty.alpn', name: 'alpn-api', version: jetty_alpn_api_version + } + jvmTest.dependencies { + api project(':ktor-server:ktor-server-test-host') + api project(':ktor-server:ktor-server-core') + + api group: 'io.netty', name: 'netty-tcnative', version: netty_tcnative_version + api group: 'io.netty', name: 'netty-tcnative-boringssl-static', version: netty_tcnative_version + } } + def enableAlpnProp = project.hasProperty('enableAlpn') if (enableAlpnProp) { def nativeClassifier; diff --git a/ktor-server/ktor-server-netty/src/io/ktor/server/netty/CIO.kt b/ktor-server/ktor-server-netty/jvm/src/io/ktor/server/netty/CIO.kt similarity index 100% rename from ktor-server/ktor-server-netty/src/io/ktor/server/netty/CIO.kt rename to ktor-server/ktor-server-netty/jvm/src/io/ktor/server/netty/CIO.kt diff --git a/ktor-server/ktor-server-netty/src/io/ktor/server/netty/Embedded.kt b/ktor-server/ktor-server-netty/jvm/src/io/ktor/server/netty/Embedded.kt similarity index 100% rename from ktor-server/ktor-server-netty/src/io/ktor/server/netty/Embedded.kt rename to ktor-server/ktor-server-netty/jvm/src/io/ktor/server/netty/Embedded.kt diff --git a/ktor-server/ktor-server-netty/src/io/ktor/server/netty/EngineMain.kt b/ktor-server/ktor-server-netty/jvm/src/io/ktor/server/netty/EngineMain.kt similarity index 100% rename from ktor-server/ktor-server-netty/src/io/ktor/server/netty/EngineMain.kt rename to ktor-server/ktor-server-netty/jvm/src/io/ktor/server/netty/EngineMain.kt diff --git a/ktor-server/ktor-server-netty/src/io/ktor/server/netty/NettyApplicationCall.kt b/ktor-server/ktor-server-netty/jvm/src/io/ktor/server/netty/NettyApplicationCall.kt similarity index 100% rename from ktor-server/ktor-server-netty/src/io/ktor/server/netty/NettyApplicationCall.kt rename to ktor-server/ktor-server-netty/jvm/src/io/ktor/server/netty/NettyApplicationCall.kt diff --git a/ktor-server/ktor-server-netty/src/io/ktor/server/netty/NettyApplicationCallHandler.kt b/ktor-server/ktor-server-netty/jvm/src/io/ktor/server/netty/NettyApplicationCallHandler.kt similarity index 100% rename from ktor-server/ktor-server-netty/src/io/ktor/server/netty/NettyApplicationCallHandler.kt rename to ktor-server/ktor-server-netty/jvm/src/io/ktor/server/netty/NettyApplicationCallHandler.kt diff --git a/ktor-server/ktor-server-netty/src/io/ktor/server/netty/NettyApplicationEngine.kt b/ktor-server/ktor-server-netty/jvm/src/io/ktor/server/netty/NettyApplicationEngine.kt similarity index 100% rename from ktor-server/ktor-server-netty/src/io/ktor/server/netty/NettyApplicationEngine.kt rename to ktor-server/ktor-server-netty/jvm/src/io/ktor/server/netty/NettyApplicationEngine.kt diff --git a/ktor-server/ktor-server-netty/src/io/ktor/server/netty/NettyApplicationRequest.kt b/ktor-server/ktor-server-netty/jvm/src/io/ktor/server/netty/NettyApplicationRequest.kt similarity index 100% rename from ktor-server/ktor-server-netty/src/io/ktor/server/netty/NettyApplicationRequest.kt rename to ktor-server/ktor-server-netty/jvm/src/io/ktor/server/netty/NettyApplicationRequest.kt diff --git a/ktor-server/ktor-server-netty/src/io/ktor/server/netty/NettyApplicationRequestCookies.kt b/ktor-server/ktor-server-netty/jvm/src/io/ktor/server/netty/NettyApplicationRequestCookies.kt similarity index 100% rename from ktor-server/ktor-server-netty/src/io/ktor/server/netty/NettyApplicationRequestCookies.kt rename to ktor-server/ktor-server-netty/jvm/src/io/ktor/server/netty/NettyApplicationRequestCookies.kt diff --git a/ktor-server/ktor-server-netty/src/io/ktor/server/netty/NettyApplicationRequestHeaders.kt b/ktor-server/ktor-server-netty/jvm/src/io/ktor/server/netty/NettyApplicationRequestHeaders.kt similarity index 100% rename from ktor-server/ktor-server-netty/src/io/ktor/server/netty/NettyApplicationRequestHeaders.kt rename to ktor-server/ktor-server-netty/jvm/src/io/ktor/server/netty/NettyApplicationRequestHeaders.kt diff --git a/ktor-server/ktor-server-netty/src/io/ktor/server/netty/NettyApplicationResponse.kt b/ktor-server/ktor-server-netty/jvm/src/io/ktor/server/netty/NettyApplicationResponse.kt similarity index 100% rename from ktor-server/ktor-server-netty/src/io/ktor/server/netty/NettyApplicationResponse.kt rename to ktor-server/ktor-server-netty/jvm/src/io/ktor/server/netty/NettyApplicationResponse.kt diff --git a/ktor-server/ktor-server-netty/src/io/ktor/server/netty/NettyChannelInitializer.kt b/ktor-server/ktor-server-netty/jvm/src/io/ktor/server/netty/NettyChannelInitializer.kt similarity index 100% rename from ktor-server/ktor-server-netty/src/io/ktor/server/netty/NettyChannelInitializer.kt rename to ktor-server/ktor-server-netty/jvm/src/io/ktor/server/netty/NettyChannelInitializer.kt diff --git a/ktor-server/ktor-server-netty/src/io/ktor/server/netty/NettyDirectDecoder.kt b/ktor-server/ktor-server-netty/jvm/src/io/ktor/server/netty/NettyDirectDecoder.kt similarity index 100% rename from ktor-server/ktor-server-netty/src/io/ktor/server/netty/NettyDirectDecoder.kt rename to ktor-server/ktor-server-netty/jvm/src/io/ktor/server/netty/NettyDirectDecoder.kt diff --git a/ktor-server/ktor-server-netty/src/io/ktor/server/netty/NettyDirectEncoder.kt b/ktor-server/ktor-server-netty/jvm/src/io/ktor/server/netty/NettyDirectEncoder.kt similarity index 100% rename from ktor-server/ktor-server-netty/src/io/ktor/server/netty/NettyDirectEncoder.kt rename to ktor-server/ktor-server-netty/jvm/src/io/ktor/server/netty/NettyDirectEncoder.kt diff --git a/ktor-server/ktor-server-netty/src/io/ktor/server/netty/NettyMultipartDataSupport.kt b/ktor-server/ktor-server-netty/jvm/src/io/ktor/server/netty/NettyMultipartDataSupport.kt similarity index 100% rename from ktor-server/ktor-server-netty/src/io/ktor/server/netty/NettyMultipartDataSupport.kt rename to ktor-server/ktor-server-netty/jvm/src/io/ktor/server/netty/NettyMultipartDataSupport.kt diff --git a/ktor-server/ktor-server-netty/src/io/ktor/server/netty/cio/NettyRequestQueue.kt b/ktor-server/ktor-server-netty/jvm/src/io/ktor/server/netty/cio/NettyRequestQueue.kt similarity index 100% rename from ktor-server/ktor-server-netty/src/io/ktor/server/netty/cio/NettyRequestQueue.kt rename to ktor-server/ktor-server-netty/jvm/src/io/ktor/server/netty/cio/NettyRequestQueue.kt diff --git a/ktor-server/ktor-server-netty/src/io/ktor/server/netty/cio/NettyResponsePipeline.kt b/ktor-server/ktor-server-netty/jvm/src/io/ktor/server/netty/cio/NettyResponsePipeline.kt similarity index 100% rename from ktor-server/ktor-server-netty/src/io/ktor/server/netty/cio/NettyResponsePipeline.kt rename to ktor-server/ktor-server-netty/jvm/src/io/ktor/server/netty/cio/NettyResponsePipeline.kt diff --git a/ktor-server/ktor-server-netty/src/io/ktor/server/netty/cio/RequestBodyHandler.kt b/ktor-server/ktor-server-netty/jvm/src/io/ktor/server/netty/cio/RequestBodyHandler.kt similarity index 100% rename from ktor-server/ktor-server-netty/src/io/ktor/server/netty/cio/RequestBodyHandler.kt rename to ktor-server/ktor-server-netty/jvm/src/io/ktor/server/netty/cio/RequestBodyHandler.kt diff --git a/ktor-server/ktor-server-netty/src/io/ktor/server/netty/http1/NettyConnectionPoint.kt b/ktor-server/ktor-server-netty/jvm/src/io/ktor/server/netty/http1/NettyConnectionPoint.kt similarity index 100% rename from ktor-server/ktor-server-netty/src/io/ktor/server/netty/http1/NettyConnectionPoint.kt rename to ktor-server/ktor-server-netty/jvm/src/io/ktor/server/netty/http1/NettyConnectionPoint.kt diff --git a/ktor-server/ktor-server-netty/src/io/ktor/server/netty/http1/NettyHttp1ApplicationCall.kt b/ktor-server/ktor-server-netty/jvm/src/io/ktor/server/netty/http1/NettyHttp1ApplicationCall.kt similarity index 100% rename from ktor-server/ktor-server-netty/src/io/ktor/server/netty/http1/NettyHttp1ApplicationCall.kt rename to ktor-server/ktor-server-netty/jvm/src/io/ktor/server/netty/http1/NettyHttp1ApplicationCall.kt diff --git a/ktor-server/ktor-server-netty/src/io/ktor/server/netty/http1/NettyHttp1ApplicationRequest.kt b/ktor-server/ktor-server-netty/jvm/src/io/ktor/server/netty/http1/NettyHttp1ApplicationRequest.kt similarity index 100% rename from ktor-server/ktor-server-netty/src/io/ktor/server/netty/http1/NettyHttp1ApplicationRequest.kt rename to ktor-server/ktor-server-netty/jvm/src/io/ktor/server/netty/http1/NettyHttp1ApplicationRequest.kt diff --git a/ktor-server/ktor-server-netty/src/io/ktor/server/netty/http1/NettyHttp1ApplicationResponse.kt b/ktor-server/ktor-server-netty/jvm/src/io/ktor/server/netty/http1/NettyHttp1ApplicationResponse.kt similarity index 100% rename from ktor-server/ktor-server-netty/src/io/ktor/server/netty/http1/NettyHttp1ApplicationResponse.kt rename to ktor-server/ktor-server-netty/jvm/src/io/ktor/server/netty/http1/NettyHttp1ApplicationResponse.kt diff --git a/ktor-server/ktor-server-netty/src/io/ktor/server/netty/http1/NettyHttp1Handler.kt b/ktor-server/ktor-server-netty/jvm/src/io/ktor/server/netty/http1/NettyHttp1Handler.kt similarity index 100% rename from ktor-server/ktor-server-netty/src/io/ktor/server/netty/http1/NettyHttp1Handler.kt rename to ktor-server/ktor-server-netty/jvm/src/io/ktor/server/netty/http1/NettyHttp1Handler.kt diff --git a/ktor-server/ktor-server-netty/src/io/ktor/server/netty/http2/Http2LocalConnectionPoint.kt b/ktor-server/ktor-server-netty/jvm/src/io/ktor/server/netty/http2/Http2LocalConnectionPoint.kt similarity index 100% rename from ktor-server/ktor-server-netty/src/io/ktor/server/netty/http2/Http2LocalConnectionPoint.kt rename to ktor-server/ktor-server-netty/jvm/src/io/ktor/server/netty/http2/Http2LocalConnectionPoint.kt diff --git a/ktor-server/ktor-server-netty/src/io/ktor/server/netty/http2/HttpFrameAdapter.kt b/ktor-server/ktor-server-netty/jvm/src/io/ktor/server/netty/http2/HttpFrameAdapter.kt similarity index 100% rename from ktor-server/ktor-server-netty/src/io/ktor/server/netty/http2/HttpFrameAdapter.kt rename to ktor-server/ktor-server-netty/jvm/src/io/ktor/server/netty/http2/HttpFrameAdapter.kt diff --git a/ktor-server/ktor-server-netty/src/io/ktor/server/netty/http2/NettyHttp2ApplicationCall.kt b/ktor-server/ktor-server-netty/jvm/src/io/ktor/server/netty/http2/NettyHttp2ApplicationCall.kt similarity index 100% rename from ktor-server/ktor-server-netty/src/io/ktor/server/netty/http2/NettyHttp2ApplicationCall.kt rename to ktor-server/ktor-server-netty/jvm/src/io/ktor/server/netty/http2/NettyHttp2ApplicationCall.kt diff --git a/ktor-server/ktor-server-netty/src/io/ktor/server/netty/http2/NettyHttp2ApplicationRequest.kt b/ktor-server/ktor-server-netty/jvm/src/io/ktor/server/netty/http2/NettyHttp2ApplicationRequest.kt similarity index 100% rename from ktor-server/ktor-server-netty/src/io/ktor/server/netty/http2/NettyHttp2ApplicationRequest.kt rename to ktor-server/ktor-server-netty/jvm/src/io/ktor/server/netty/http2/NettyHttp2ApplicationRequest.kt diff --git a/ktor-server/ktor-server-netty/src/io/ktor/server/netty/http2/NettyHttp2ApplicationResponse.kt b/ktor-server/ktor-server-netty/jvm/src/io/ktor/server/netty/http2/NettyHttp2ApplicationResponse.kt similarity index 100% rename from ktor-server/ktor-server-netty/src/io/ktor/server/netty/http2/NettyHttp2ApplicationResponse.kt rename to ktor-server/ktor-server-netty/jvm/src/io/ktor/server/netty/http2/NettyHttp2ApplicationResponse.kt diff --git a/ktor-server/ktor-server-netty/src/io/ktor/server/netty/http2/NettyHttp2Handler.kt b/ktor-server/ktor-server-netty/jvm/src/io/ktor/server/netty/http2/NettyHttp2Handler.kt similarity index 100% rename from ktor-server/ktor-server-netty/src/io/ktor/server/netty/http2/NettyHttp2Handler.kt rename to ktor-server/ktor-server-netty/jvm/src/io/ktor/server/netty/http2/NettyHttp2Handler.kt diff --git a/ktor-server/ktor-server-netty/test/io/ktor/tests/server/netty/NettyEngineTest.kt b/ktor-server/ktor-server-netty/jvm/test/io/ktor/tests/server/netty/NettyEngineTest.kt similarity index 100% rename from ktor-server/ktor-server-netty/test/io/ktor/tests/server/netty/NettyEngineTest.kt rename to ktor-server/ktor-server-netty/jvm/test/io/ktor/tests/server/netty/NettyEngineTest.kt diff --git a/ktor-server/ktor-server-netty/test/io/ktor/tests/server/netty/NettyStressTest.kt b/ktor-server/ktor-server-netty/jvm/test/io/ktor/tests/server/netty/NettyStressTest.kt similarity index 100% rename from ktor-server/ktor-server-netty/test/io/ktor/tests/server/netty/NettyStressTest.kt rename to ktor-server/ktor-server-netty/jvm/test/io/ktor/tests/server/netty/NettyStressTest.kt diff --git a/ktor-server/ktor-server-servlet/build.gradle b/ktor-server/ktor-server-servlet/build.gradle index b5b3b8d1a6..5358166a15 100644 --- a/ktor-server/ktor-server-servlet/build.gradle +++ b/ktor-server/ktor-server-servlet/build.gradle @@ -1,6 +1,7 @@ description = '' -dependencies { - compile project(':ktor-server:ktor-server-host-common') - compile project(':ktor-http:ktor-http-cio') +kotlin.sourceSets.jvmMain.dependencies { + api project(':ktor-server:ktor-server-host-common') + api project(':ktor-http:ktor-http-cio') + compileOnly group: 'javax.servlet', name: 'javax.servlet-api', version: '4.0.0-b07' } diff --git a/ktor-server/ktor-server-servlet/src/io/ktor/server/servlet/AsyncServlet.kt b/ktor-server/ktor-server-servlet/jvm/src/io/ktor/server/servlet/AsyncServlet.kt similarity index 100% rename from ktor-server/ktor-server-servlet/src/io/ktor/server/servlet/AsyncServlet.kt rename to ktor-server/ktor-server-servlet/jvm/src/io/ktor/server/servlet/AsyncServlet.kt diff --git a/ktor-server/ktor-server-servlet/src/io/ktor/server/servlet/BlockingServlet.kt b/ktor-server/ktor-server-servlet/jvm/src/io/ktor/server/servlet/BlockingServlet.kt similarity index 100% rename from ktor-server/ktor-server-servlet/src/io/ktor/server/servlet/BlockingServlet.kt rename to ktor-server/ktor-server-servlet/jvm/src/io/ktor/server/servlet/BlockingServlet.kt diff --git a/ktor-server/ktor-server-servlet/src/io/ktor/server/servlet/JAASBridge.kt b/ktor-server/ktor-server-servlet/jvm/src/io/ktor/server/servlet/JAASBridge.kt similarity index 100% rename from ktor-server/ktor-server-servlet/src/io/ktor/server/servlet/JAASBridge.kt rename to ktor-server/ktor-server-servlet/jvm/src/io/ktor/server/servlet/JAASBridge.kt diff --git a/ktor-server/ktor-server-servlet/src/io/ktor/server/servlet/KtorServlet.kt b/ktor-server/ktor-server-servlet/jvm/src/io/ktor/server/servlet/KtorServlet.kt similarity index 100% rename from ktor-server/ktor-server-servlet/src/io/ktor/server/servlet/KtorServlet.kt rename to ktor-server/ktor-server-servlet/jvm/src/io/ktor/server/servlet/KtorServlet.kt diff --git a/ktor-server/ktor-server-servlet/src/io/ktor/server/servlet/ServletApplicationEngine.kt b/ktor-server/ktor-server-servlet/jvm/src/io/ktor/server/servlet/ServletApplicationEngine.kt similarity index 100% rename from ktor-server/ktor-server-servlet/src/io/ktor/server/servlet/ServletApplicationEngine.kt rename to ktor-server/ktor-server-servlet/jvm/src/io/ktor/server/servlet/ServletApplicationEngine.kt diff --git a/ktor-server/ktor-server-servlet/src/io/ktor/server/servlet/ServletApplicationRequest.kt b/ktor-server/ktor-server-servlet/jvm/src/io/ktor/server/servlet/ServletApplicationRequest.kt similarity index 100% rename from ktor-server/ktor-server-servlet/src/io/ktor/server/servlet/ServletApplicationRequest.kt rename to ktor-server/ktor-server-servlet/jvm/src/io/ktor/server/servlet/ServletApplicationRequest.kt diff --git a/ktor-server/ktor-server-servlet/src/io/ktor/server/servlet/ServletApplicationRequestCookies.kt b/ktor-server/ktor-server-servlet/jvm/src/io/ktor/server/servlet/ServletApplicationRequestCookies.kt similarity index 100% rename from ktor-server/ktor-server-servlet/src/io/ktor/server/servlet/ServletApplicationRequestCookies.kt rename to ktor-server/ktor-server-servlet/jvm/src/io/ktor/server/servlet/ServletApplicationRequestCookies.kt diff --git a/ktor-server/ktor-server-servlet/src/io/ktor/server/servlet/ServletApplicationRequestHeaders.kt b/ktor-server/ktor-server-servlet/jvm/src/io/ktor/server/servlet/ServletApplicationRequestHeaders.kt similarity index 100% rename from ktor-server/ktor-server-servlet/src/io/ktor/server/servlet/ServletApplicationRequestHeaders.kt rename to ktor-server/ktor-server-servlet/jvm/src/io/ktor/server/servlet/ServletApplicationRequestHeaders.kt diff --git a/ktor-server/ktor-server-servlet/src/io/ktor/server/servlet/ServletApplicationResponse.kt b/ktor-server/ktor-server-servlet/jvm/src/io/ktor/server/servlet/ServletApplicationResponse.kt similarity index 100% rename from ktor-server/ktor-server-servlet/src/io/ktor/server/servlet/ServletApplicationResponse.kt rename to ktor-server/ktor-server-servlet/jvm/src/io/ktor/server/servlet/ServletApplicationResponse.kt diff --git a/ktor-server/ktor-server-servlet/src/io/ktor/server/servlet/ServletConnectionPoint.kt b/ktor-server/ktor-server-servlet/jvm/src/io/ktor/server/servlet/ServletConnectionPoint.kt similarity index 100% rename from ktor-server/ktor-server-servlet/src/io/ktor/server/servlet/ServletConnectionPoint.kt rename to ktor-server/ktor-server-servlet/jvm/src/io/ktor/server/servlet/ServletConnectionPoint.kt diff --git a/ktor-server/ktor-server-servlet/src/io/ktor/server/servlet/ServletReader.kt b/ktor-server/ktor-server-servlet/jvm/src/io/ktor/server/servlet/ServletReader.kt similarity index 100% rename from ktor-server/ktor-server-servlet/src/io/ktor/server/servlet/ServletReader.kt rename to ktor-server/ktor-server-servlet/jvm/src/io/ktor/server/servlet/ServletReader.kt diff --git a/ktor-server/ktor-server-servlet/src/io/ktor/server/servlet/ServletUpgrade.kt b/ktor-server/ktor-server-servlet/jvm/src/io/ktor/server/servlet/ServletUpgrade.kt similarity index 100% rename from ktor-server/ktor-server-servlet/src/io/ktor/server/servlet/ServletUpgrade.kt rename to ktor-server/ktor-server-servlet/jvm/src/io/ktor/server/servlet/ServletUpgrade.kt diff --git a/ktor-server/ktor-server-servlet/src/io/ktor/server/servlet/ServletWriter.kt b/ktor-server/ktor-server-servlet/jvm/src/io/ktor/server/servlet/ServletWriter.kt similarity index 100% rename from ktor-server/ktor-server-servlet/src/io/ktor/server/servlet/ServletWriter.kt rename to ktor-server/ktor-server-servlet/jvm/src/io/ktor/server/servlet/ServletWriter.kt diff --git a/ktor-server/ktor-server-servlet/src/io/ktor/server/servlet/v4/Push.kt b/ktor-server/ktor-server-servlet/jvm/src/io/ktor/server/servlet/v4/Push.kt similarity index 100% rename from ktor-server/ktor-server-servlet/src/io/ktor/server/servlet/v4/Push.kt rename to ktor-server/ktor-server-servlet/jvm/src/io/ktor/server/servlet/v4/Push.kt diff --git a/ktor-server/ktor-server-test-host/build.gradle b/ktor-server/ktor-server-test-host/build.gradle index d4452b7883..1aad2ee9e6 100644 --- a/ktor-server/ktor-server-test-host/build.gradle +++ b/ktor-server/ktor-server-test-host/build.gradle @@ -1,24 +1,25 @@ description = '' -dependencies { - compile project(':ktor-server:ktor-server-host-common') - compile project(':ktor-network:ktor-network-tls') - compile group: 'ch.qos.logback', name: 'logback-classic', version: logback_version - compile project(':ktor-client:ktor-client-core:ktor-client-core-jvm') - compile project(':ktor-client:ktor-client-jetty') - compile project(':ktor-client:ktor-client-cio') - compile project(':ktor-client:ktor-client-tests') - compile group: 'org.eclipse.jetty.http2', name: 'http2-client', version: jetty_version - compile group: 'org.eclipse.jetty', name: 'jetty-client', version: jetty_version - compile group: 'org.eclipse.jetty.http2', name: 'http2-http-client-transport', version: jetty_version - compile group: 'org.mortbay.jetty.alpn', name: 'alpn-boot', version: jetty_alpn_boot_version - compile group: 'org.jetbrains.kotlin', name: 'kotlin-test-junit', version: kotlin_version - compile group: 'junit', name: 'junit', version: junit_version - compile project(path: ':ktor-server:ktor-server-core', configuration: 'testOutput') +kotlin.sourceSets.jvmMain.dependencies { + api project(':ktor-server:ktor-server-core') + api project(':ktor-server:ktor-server-host-common') + api project(':ktor-network:ktor-network-tls') + api project(':ktor-client:ktor-client-core') + api project(':ktor-client:ktor-client-jetty') + api project(':ktor-client:ktor-client-cio') + api project(':ktor-client:ktor-client-tests') // Not ideal, but prevents an additional artifact, and this is usually just included for testing, // so shouldn't increase the size of the final artifact. - compile project(':ktor-features:ktor-websockets') + api project(':ktor-features:ktor-websockets') - testCompile project(':ktor-server:ktor-server-core') + api group: 'ch.qos.logback', name: 'logback-classic', version: logback_version + api group: 'org.eclipse.jetty.http2', name: 'http2-client', version: jetty_version + api group: 'org.eclipse.jetty', name: 'jetty-client', version: jetty_version + api group: 'org.eclipse.jetty.http2', name: 'http2-http-client-transport', version: jetty_version + api group: 'org.mortbay.jetty.alpn', name: 'alpn-boot', version: project.ext.jetty_alpn_boot_version + + api group: 'org.jetbrains.kotlin', name: 'kotlin-test-junit', version: kotlin_version + api group: 'junit', name: 'junit', version: junit_version } + diff --git a/ktor-server/ktor-server-test-host/src/io/ktor/server/testing/EngineStressSuite.kt b/ktor-server/ktor-server-test-host/jvm/src/io/ktor/server/testing/EngineStressSuite.kt similarity index 97% rename from ktor-server/ktor-server-test-host/src/io/ktor/server/testing/EngineStressSuite.kt rename to ktor-server/ktor-server-test-host/jvm/src/io/ktor/server/testing/EngineStressSuite.kt index a9bb0be0d6..66e626c94b 100644 --- a/ktor-server/ktor-server-test-host/src/io/ktor/server/testing/EngineStressSuite.kt +++ b/ktor-server/ktor-server-test-host/jvm/src/io/ktor/server/testing/EngineStressSuite.kt @@ -1,14 +1,13 @@ package io.ktor.server.testing +import io.ktor.http.cio.RequestResponseBuilder import io.ktor.application.* import io.ktor.client.response.* import io.ktor.http.content.* import io.ktor.http.* -import io.ktor.http.cio.* import io.ktor.response.* import io.ktor.routing.* import io.ktor.server.engine.* -import io.ktor.tests.http.* import kotlinx.coroutines.* import kotlinx.coroutines.io.* import kotlinx.io.streams.* @@ -25,7 +24,10 @@ import kotlin.coroutines.* import kotlin.test.* @RunWith(StressSuiteRunner::class) -abstract class EngineStressSuite(hostFactory: ApplicationEngineFactory) : EngineTestBase(hostFactory) { +abstract class EngineStressSuite( + hostFactory: ApplicationEngineFactory +) : EngineTestBase(hostFactory) { + init { enableHttp2 = false enableSsl = false @@ -304,4 +306,4 @@ abstract class EngineStressSuite( - hostFactory: ApplicationEngineFactory + hostFactory: ApplicationEngineFactory ) : EngineTestBase(hostFactory) { @Test fun testTextContent() { @@ -333,17 +331,24 @@ abstract class EngineTestSuite - assertEquals(1, values.size, "Duplicate header $name") - } + .map { response.headers.nameAt(it).toString() } + .groupBy { it }.forEach { (name, values) -> + assertEquals(1, values.size, "Duplicate header $name") + } outputStream.apply { writePacket { @@ -1670,7 +1723,8 @@ abstract class EngineTestSuite parseResponse(channel)?.use { response -> @@ -1722,7 +1776,8 @@ abstract class EngineTestSuite { // ensure that the server is not running anymore + assertFailsWith { + // ensure that the server is not running anymore withUrl("/") { call.receive() } } } @@ -1783,7 +1838,7 @@ abstract class EngineTestSuite Unit) { - - constructor(url: String, host: String, port: Int, - numberConnections: Int, queueSize: Int, highPressure: Boolean) - : this(host, port, numberConnections, queueSize, highPressure, { +class HighLoadHttpGenerator( + val host: String, port: Int, + val numberOfConnections: Int, val queueSize: Int, val highPressure: Boolean, + builder: RequestResponseBuilder.() -> Unit +) { + + constructor( + url: String, host: String, port: Int, + numberConnections: Int, queueSize: Int, highPressure: Boolean + ) + : this(host, port, numberConnections, queueSize, highPressure, { requestLine(HttpMethod.Get, url, "HTTP/1.1") headerLine(HttpHeaders.Host, "$host:$port") headerLine(HttpHeaders.Accept, "*/*") @@ -566,17 +570,66 @@ class HighLoadHttpGenerator(val host: String, port: Int, private const val N = '\n'.toByte() private const val S = 0x20.toByte() - fun doRun(url: String, host: String, port: Int, numberOfThreads: Int, connectionsPerThread: Int, queueSize: Int, highPressure: Boolean, gracefulMillis: Long, timeMillis: Long) { - val generator = HighLoadHttpGenerator(url, host, port, connectionsPerThread, queueSize, highPressure) - doRun(generator, numberOfThreads, gracefulMillis, timeMillis) + fun doRun( + url: String, + host: String, + port: Int, + numberOfThreads: Int, + connectionsPerThread: Int, + queueSize: Int, + highPressure: Boolean, + gracefulMillis: Long, + timeMillis: Long + ) { + val generator = HighLoadHttpGenerator( + url, + host, + port, + connectionsPerThread, + queueSize, + highPressure + ) + doRun( + generator, + numberOfThreads, + gracefulMillis, + timeMillis + ) } - fun doRun(host: String, port: Int, numberOfThreads: Int, connectionsPerThread: Int, queueSize: Int, highPressure: Boolean, gracefulMillis: Long, timeMillis: Long, builder: RequestResponseBuilder.() -> Unit) { - val generator = HighLoadHttpGenerator(host, port, connectionsPerThread, queueSize, highPressure, builder) - doRun(generator, numberOfThreads, gracefulMillis, timeMillis) + fun doRun( + host: String, + port: Int, + numberOfThreads: Int, + connectionsPerThread: Int, + queueSize: Int, + highPressure: Boolean, + gracefulMillis: Long, + timeMillis: Long, + builder: RequestResponseBuilder.() -> Unit + ) { + val generator = HighLoadHttpGenerator( + host, + port, + connectionsPerThread, + queueSize, + highPressure, + builder + ) + doRun( + generator, + numberOfThreads, + gracefulMillis, + timeMillis + ) } - private fun doRun(loadGenerator: HighLoadHttpGenerator, numberOfThreads: Int, gracefulMillis: Long, timeMillis: Long) { + private fun doRun( + loadGenerator: HighLoadHttpGenerator, + numberOfThreads: Int, + gracefulMillis: Long, + timeMillis: Long + ) { println("Running...") val threads = (1..numberOfThreads).map { thread { @@ -623,7 +676,14 @@ class HighLoadHttpGenerator(val host: String, port: Int, } } - val manager = HighLoadHttpGenerator(pathAndQuery, url.host, if (url.port == -1) 80 else url.port, connections / numberCpu, queue, highPressure) + val manager = HighLoadHttpGenerator( + pathAndQuery, + url.host, + if (url.port == -1) 80 else url.port, + connections / numberCpu, + queue, + highPressure + ) val threads = (1..numberCpu).map { thread(start = false) { manager.mainLoop() @@ -660,4 +720,4 @@ class HighLoadHttpGenerator(val host: String, port: Int, } } } -} \ No newline at end of file +} diff --git a/ktor-server/ktor-server-test-host/src/io/ktor/server/testing/StressSuiteRunner.kt b/ktor-server/ktor-server-test-host/jvm/src/io/ktor/server/testing/StressSuiteRunner.kt similarity index 100% rename from ktor-server/ktor-server-test-host/src/io/ktor/server/testing/StressSuiteRunner.kt rename to ktor-server/ktor-server-test-host/jvm/src/io/ktor/server/testing/StressSuiteRunner.kt diff --git a/ktor-server/ktor-server-test-host/src/io/ktor/server/testing/TestApplicationCall.kt b/ktor-server/ktor-server-test-host/jvm/src/io/ktor/server/testing/TestApplicationCall.kt similarity index 100% rename from ktor-server/ktor-server-test-host/src/io/ktor/server/testing/TestApplicationCall.kt rename to ktor-server/ktor-server-test-host/jvm/src/io/ktor/server/testing/TestApplicationCall.kt diff --git a/ktor-server/ktor-server-test-host/src/io/ktor/server/testing/TestApplicationEngine.kt b/ktor-server/ktor-server-test-host/jvm/src/io/ktor/server/testing/TestApplicationEngine.kt similarity index 100% rename from ktor-server/ktor-server-test-host/src/io/ktor/server/testing/TestApplicationEngine.kt rename to ktor-server/ktor-server-test-host/jvm/src/io/ktor/server/testing/TestApplicationEngine.kt diff --git a/ktor-server/ktor-server-test-host/src/io/ktor/server/testing/TestApplicationRequest.kt b/ktor-server/ktor-server-test-host/jvm/src/io/ktor/server/testing/TestApplicationRequest.kt similarity index 100% rename from ktor-server/ktor-server-test-host/src/io/ktor/server/testing/TestApplicationRequest.kt rename to ktor-server/ktor-server-test-host/jvm/src/io/ktor/server/testing/TestApplicationRequest.kt diff --git a/ktor-server/ktor-server-test-host/src/io/ktor/server/testing/TestApplicationResponse.kt b/ktor-server/ktor-server-test-host/jvm/src/io/ktor/server/testing/TestApplicationResponse.kt similarity index 100% rename from ktor-server/ktor-server-test-host/src/io/ktor/server/testing/TestApplicationResponse.kt rename to ktor-server/ktor-server-test-host/jvm/src/io/ktor/server/testing/TestApplicationResponse.kt diff --git a/ktor-server/ktor-server-test-host/src/io/ktor/server/testing/TestEngine.kt b/ktor-server/ktor-server-test-host/jvm/src/io/ktor/server/testing/TestEngine.kt similarity index 100% rename from ktor-server/ktor-server-test-host/src/io/ktor/server/testing/TestEngine.kt rename to ktor-server/ktor-server-test-host/jvm/src/io/ktor/server/testing/TestEngine.kt diff --git a/ktor-server/ktor-server-test-host/src/io/ktor/server/testing/Utils.kt b/ktor-server/ktor-server-test-host/jvm/src/io/ktor/server/testing/Utils.kt similarity index 100% rename from ktor-server/ktor-server-test-host/src/io/ktor/server/testing/Utils.kt rename to ktor-server/ktor-server-test-host/jvm/src/io/ktor/server/testing/Utils.kt diff --git a/ktor-server/ktor-server-test-host/src/io/ktor/server/testing/client/TestHttpClientConfig.kt b/ktor-server/ktor-server-test-host/jvm/src/io/ktor/server/testing/client/TestHttpClientConfig.kt similarity index 100% rename from ktor-server/ktor-server-test-host/src/io/ktor/server/testing/client/TestHttpClientConfig.kt rename to ktor-server/ktor-server-test-host/jvm/src/io/ktor/server/testing/client/TestHttpClientConfig.kt diff --git a/ktor-server/ktor-server-test-host/src/io/ktor/server/testing/client/TestHttpClientEngine.kt b/ktor-server/ktor-server-test-host/jvm/src/io/ktor/server/testing/client/TestHttpClientEngine.kt similarity index 100% rename from ktor-server/ktor-server-test-host/src/io/ktor/server/testing/client/TestHttpClientEngine.kt rename to ktor-server/ktor-server-test-host/jvm/src/io/ktor/server/testing/client/TestHttpClientEngine.kt diff --git a/ktor-server/ktor-server-test-host/src/io/ktor/server/testing/client/TestHttpClientRequest.kt b/ktor-server/ktor-server-test-host/jvm/src/io/ktor/server/testing/client/TestHttpClientRequest.kt similarity index 100% rename from ktor-server/ktor-server-test-host/src/io/ktor/server/testing/client/TestHttpClientRequest.kt rename to ktor-server/ktor-server-test-host/jvm/src/io/ktor/server/testing/client/TestHttpClientRequest.kt diff --git a/ktor-server/ktor-server-test-host/src/io/ktor/server/testing/client/TestHttpClientResponse.kt b/ktor-server/ktor-server-test-host/jvm/src/io/ktor/server/testing/client/TestHttpClientResponse.kt similarity index 100% rename from ktor-server/ktor-server-test-host/src/io/ktor/server/testing/client/TestHttpClientResponse.kt rename to ktor-server/ktor-server-test-host/jvm/src/io/ktor/server/testing/client/TestHttpClientResponse.kt diff --git a/ktor-server/ktor-server-tests/build.gradle b/ktor-server/ktor-server-tests/build.gradle index 870cac9f20..79a47e6f3f 100644 --- a/ktor-server/ktor-server-tests/build.gradle +++ b/ktor-server/ktor-server-tests/build.gradle @@ -1,7 +1,15 @@ description = '' + +kotlin.sourceSets { + jvmMain.dependencies { + api project(':ktor-server:ktor-server-core') + api project(':ktor-server:ktor-server-test-host') + } + jvmTest.dependencies { + api project(':ktor-server:ktor-server-core') + } +} + dependencies { - compile project(':ktor-server:ktor-server-core') - compile project(':ktor-server:ktor-server-test-host') - testCompile project(':ktor-server:ktor-server-core') - testCompile project(path: ':ktor-server:ktor-server-core', configuration: 'testOutput') + jvmTestApi project(path: ':ktor-server:ktor-server-core', configuration: 'testOutput') } diff --git a/ktor-server/ktor-server-tests/test/io/ktor/tests/server/testing/TestApplicationEngineTest.kt b/ktor-server/ktor-server-tests/jvm/src/io/ktor/tests/server/testing/TestApplicationEngineTest.kt similarity index 100% rename from ktor-server/ktor-server-tests/test/io/ktor/tests/server/testing/TestApplicationEngineTest.kt rename to ktor-server/ktor-server-tests/jvm/src/io/ktor/tests/server/testing/TestApplicationEngineTest.kt diff --git a/ktor-server/ktor-server-tests/test/io/ktor/tests/server/application/ApplicationRequestHeaderTest.kt b/ktor-server/ktor-server-tests/jvm/test/io/ktor/tests/server/application/ApplicationRequestHeaderTest.kt similarity index 100% rename from ktor-server/ktor-server-tests/test/io/ktor/tests/server/application/ApplicationRequestHeaderTest.kt rename to ktor-server/ktor-server-tests/jvm/test/io/ktor/tests/server/application/ApplicationRequestHeaderTest.kt diff --git a/ktor-server/ktor-server-tests/test/io/ktor/tests/server/application/ConfigTest.kt b/ktor-server/ktor-server-tests/jvm/test/io/ktor/tests/server/application/ConfigTest.kt similarity index 100% rename from ktor-server/ktor-server-tests/test/io/ktor/tests/server/application/ConfigTest.kt rename to ktor-server/ktor-server-tests/jvm/test/io/ktor/tests/server/application/ConfigTest.kt diff --git a/ktor-server/ktor-server-tests/test/io/ktor/tests/server/application/HandlerTest.kt b/ktor-server/ktor-server-tests/jvm/test/io/ktor/tests/server/application/HandlerTest.kt similarity index 100% rename from ktor-server/ktor-server-tests/test/io/ktor/tests/server/application/HandlerTest.kt rename to ktor-server/ktor-server-tests/jvm/test/io/ktor/tests/server/application/HandlerTest.kt diff --git a/ktor-server/ktor-server-tests/test/io/ktor/tests/server/features/CORSTest.kt b/ktor-server/ktor-server-tests/jvm/test/io/ktor/tests/server/features/CORSTest.kt similarity index 100% rename from ktor-server/ktor-server-tests/test/io/ktor/tests/server/features/CORSTest.kt rename to ktor-server/ktor-server-tests/jvm/test/io/ktor/tests/server/features/CORSTest.kt diff --git a/ktor-server/ktor-server-tests/test/io/ktor/tests/server/features/CallIdTest.kt b/ktor-server/ktor-server-tests/jvm/test/io/ktor/tests/server/features/CallIdTest.kt similarity index 100% rename from ktor-server/ktor-server-tests/test/io/ktor/tests/server/features/CallIdTest.kt rename to ktor-server/ktor-server-tests/jvm/test/io/ktor/tests/server/features/CallIdTest.kt diff --git a/ktor-server/ktor-server-tests/test/io/ktor/tests/server/features/CallLoggingTest.kt b/ktor-server/ktor-server-tests/jvm/test/io/ktor/tests/server/features/CallLoggingTest.kt similarity index 100% rename from ktor-server/ktor-server-tests/test/io/ktor/tests/server/features/CallLoggingTest.kt rename to ktor-server/ktor-server-tests/jvm/test/io/ktor/tests/server/features/CallLoggingTest.kt diff --git a/ktor-server/ktor-server-tests/test/io/ktor/tests/server/features/CompressionTest.kt b/ktor-server/ktor-server-tests/jvm/test/io/ktor/tests/server/features/CompressionTest.kt similarity index 100% rename from ktor-server/ktor-server-tests/test/io/ktor/tests/server/features/CompressionTest.kt rename to ktor-server/ktor-server-tests/jvm/test/io/ktor/tests/server/features/CompressionTest.kt diff --git a/ktor-server/ktor-server-tests/test/io/ktor/tests/server/features/ConditionalHeadersTests.kt b/ktor-server/ktor-server-tests/jvm/test/io/ktor/tests/server/features/ConditionalHeadersTests.kt similarity index 100% rename from ktor-server/ktor-server-tests/test/io/ktor/tests/server/features/ConditionalHeadersTests.kt rename to ktor-server/ktor-server-tests/jvm/test/io/ktor/tests/server/features/ConditionalHeadersTests.kt diff --git a/ktor-server/ktor-server-tests/test/io/ktor/tests/server/features/ContentNegotiationTest.kt b/ktor-server/ktor-server-tests/jvm/test/io/ktor/tests/server/features/ContentNegotiationTest.kt similarity index 100% rename from ktor-server/ktor-server-tests/test/io/ktor/tests/server/features/ContentNegotiationTest.kt rename to ktor-server/ktor-server-tests/jvm/test/io/ktor/tests/server/features/ContentNegotiationTest.kt diff --git a/ktor-server/ktor-server-tests/test/io/ktor/tests/server/features/CookiesTest.kt b/ktor-server/ktor-server-tests/jvm/test/io/ktor/tests/server/features/CookiesTest.kt similarity index 100% rename from ktor-server/ktor-server-tests/test/io/ktor/tests/server/features/CookiesTest.kt rename to ktor-server/ktor-server-tests/jvm/test/io/ktor/tests/server/features/CookiesTest.kt diff --git a/ktor-server/ktor-server-tests/test/io/ktor/tests/server/features/DataConversionTest.kt b/ktor-server/ktor-server-tests/jvm/test/io/ktor/tests/server/features/DataConversionTest.kt similarity index 100% rename from ktor-server/ktor-server-tests/test/io/ktor/tests/server/features/DataConversionTest.kt rename to ktor-server/ktor-server-tests/jvm/test/io/ktor/tests/server/features/DataConversionTest.kt diff --git a/ktor-server/ktor-server-tests/test/io/ktor/tests/server/features/HSTSTest.kt b/ktor-server/ktor-server-tests/jvm/test/io/ktor/tests/server/features/HSTSTest.kt similarity index 100% rename from ktor-server/ktor-server-tests/test/io/ktor/tests/server/features/HSTSTest.kt rename to ktor-server/ktor-server-tests/jvm/test/io/ktor/tests/server/features/HSTSTest.kt diff --git a/ktor-server/ktor-server-tests/test/io/ktor/tests/server/features/HeadTest.kt b/ktor-server/ktor-server-tests/jvm/test/io/ktor/tests/server/features/HeadTest.kt similarity index 100% rename from ktor-server/ktor-server-tests/test/io/ktor/tests/server/features/HeadTest.kt rename to ktor-server/ktor-server-tests/jvm/test/io/ktor/tests/server/features/HeadTest.kt diff --git a/ktor-server/ktor-server-tests/test/io/ktor/tests/server/features/HttpsRedirectFeatureTest.kt b/ktor-server/ktor-server-tests/jvm/test/io/ktor/tests/server/features/HttpsRedirectFeatureTest.kt similarity index 100% rename from ktor-server/ktor-server-tests/test/io/ktor/tests/server/features/HttpsRedirectFeatureTest.kt rename to ktor-server/ktor-server-tests/jvm/test/io/ktor/tests/server/features/HttpsRedirectFeatureTest.kt diff --git a/ktor-server/ktor-server-tests/test/io/ktor/tests/server/features/OriginConnectionPointTest.kt b/ktor-server/ktor-server-tests/jvm/test/io/ktor/tests/server/features/OriginConnectionPointTest.kt similarity index 100% rename from ktor-server/ktor-server-tests/test/io/ktor/tests/server/features/OriginConnectionPointTest.kt rename to ktor-server/ktor-server-tests/jvm/test/io/ktor/tests/server/features/OriginConnectionPointTest.kt diff --git a/ktor-server/ktor-server-tests/test/io/ktor/tests/server/features/PartialContentTest.kt b/ktor-server/ktor-server-tests/jvm/test/io/ktor/tests/server/features/PartialContentTest.kt similarity index 99% rename from ktor-server/ktor-server-tests/test/io/ktor/tests/server/features/PartialContentTest.kt rename to ktor-server/ktor-server-tests/jvm/test/io/ktor/tests/server/features/PartialContentTest.kt index acd93fca99..1edae27041 100644 --- a/ktor-server/ktor-server-tests/test/io/ktor/tests/server/features/PartialContentTest.kt +++ b/ktor-server/ktor-server-tests/jvm/test/io/ktor/tests/server/features/PartialContentTest.kt @@ -13,7 +13,7 @@ import java.util.* import kotlin.test.* class PartialContentTest { - private val basedir = listOf(File("test"), File("ktor-server/ktor-server-tests/test")) + private val basedir = listOf(File("jvm/test"), File("ktor-server/ktor-server-tests/jvm/test")) .map { File(it, "io/ktor/tests/server") } .first(File::exists) @@ -318,4 +318,4 @@ class PartialContentTest { else -> substring(0, idx) to substring(idx + 1) } } -} \ No newline at end of file +} diff --git a/ktor-server/ktor-server-tests/test/io/ktor/tests/server/features/StaticContentTest.kt b/ktor-server/ktor-server-tests/jvm/test/io/ktor/tests/server/features/StaticContentTest.kt similarity index 84% rename from ktor-server/ktor-server-tests/test/io/ktor/tests/server/features/StaticContentTest.kt rename to ktor-server/ktor-server-tests/jvm/test/io/ktor/tests/server/features/StaticContentTest.kt index 2f7c59c27d..cf496aa021 100644 --- a/ktor-server/ktor-server-tests/test/io/ktor/tests/server/features/StaticContentTest.kt +++ b/ktor-server/ktor-server-tests/jvm/test/io/ktor/tests/server/features/StaticContentTest.kt @@ -14,7 +14,10 @@ import java.nio.file.* import kotlin.test.* class StaticContentTest { - val basedir = listOf(File("test"), File("ktor-server/ktor-server-tests/test")).map { File(it, "io/ktor/tests/server") }.first(File::exists) + val basedir = + listOf(File("jvm/test"), File("ktor-server/ktor-server-tests/jvm/test")) + .map { File(it, "io/ktor/tests/server") } + .first(File::exists) private operator fun File.get(relativePath: String) = File(this, relativePath) @@ -135,7 +138,13 @@ class StaticContentTest { } } - listOf("../build.gradle", "../../build.gradle", "/../build.gradle", "/../../build.gradle", "/./.././../build.gradle").forEach { path -> + listOf( + "../build.gradle", + "../../build.gradle", + "/../build.gradle", + "/../../build.gradle", + "/./.././../build.gradle" + ).forEach { path -> handleRequest(HttpMethod.Get, path).let { result -> assertFalse(result.requestHandled, "Should be unhandled for path $path") } @@ -149,7 +158,10 @@ class StaticContentTest { } handleRequest(HttpMethod.Get, "/").let { result -> - assertEquals(File(basedir, "features/StaticContentTest.kt".replaceSeparators()).readText(), result.response.content) + assertEquals( + File(basedir, "features/StaticContentTest.kt".replaceSeparators()).readText(), + result.response.content + ) assertTrue(result.requestHandled) } } @@ -157,11 +169,19 @@ class StaticContentTest { @Test fun testSendLocalFilePaths() = withTestApplication { application.intercept(ApplicationCallPipeline.Call) { - call.respond(LocalFileContent(basedir.toPath(), Paths.get("/features/StaticContentTest.kt".replaceSeparators()))) + call.respond( + LocalFileContent( + basedir.toPath(), + Paths.get("/features/StaticContentTest.kt".replaceSeparators()) + ) + ) } handleRequest(HttpMethod.Get, "/").let { result -> - assertEquals(File(basedir, "features/StaticContentTest.kt".replaceSeparators()).readText(), result.response.content) + assertEquals( + File(basedir, "features/StaticContentTest.kt".replaceSeparators()).readText(), + result.response.content + ) } } @@ -194,10 +214,20 @@ class StaticContentTest { fun testSendLocalFileBadRelativePaths() = withTestApplication { application.intercept(ApplicationCallPipeline.Call) { assertFailsWithSuspended { - call.respond(LocalFileContent(basedir.toPath(), Paths.get("/../../../../../../../../../../../../../etc/passwd"))) + call.respond( + LocalFileContent( + basedir.toPath(), + Paths.get("/../../../../../../../../../../../../../etc/passwd") + ) + ) } assertFailsWithSuspended { - call.respond(LocalFileContent(basedir.toPath(), Paths.get("../../../../../../../../../../../../../etc/passwd"))) + call.respond( + LocalFileContent( + basedir.toPath(), + Paths.get("../../../../../../../../../../../../../etc/passwd") + ) + ) } assertFailsWithSuspended { call.respond(LocalFileContent(basedir, "../build.gradle")) @@ -219,7 +249,8 @@ class StaticContentTest { fun testInterceptCacheControl() = withTestApplication { application.intercept(ApplicationCallPipeline.Features) { if (call.request.httpMethod == HttpMethod.Get || - call.request.httpMethod == HttpMethod.Head) { + call.request.httpMethod == HttpMethod.Head + ) { call.response.cacheControl(CacheControl.MaxAge(300)) } } @@ -229,7 +260,10 @@ class StaticContentTest { } handleRequest(HttpMethod.Get, "/").let { result -> - assertEquals(File(basedir, "features/StaticContentTest.kt".replaceSeparators()).readText(), result.response.content) + assertEquals( + File(basedir, "features/StaticContentTest.kt".replaceSeparators()).readText(), + result.response.content + ) assertEquals(listOf("max-age=300"), result.response.headers.values(HttpHeaders.CacheControl)) assertTrue(result.requestHandled) } diff --git a/ktor-server/ktor-server-tests/test/io/ktor/tests/server/features/StatusPageTest.kt b/ktor-server/ktor-server-tests/jvm/test/io/ktor/tests/server/features/StatusPageTest.kt similarity index 100% rename from ktor-server/ktor-server-tests/test/io/ktor/tests/server/features/StatusPageTest.kt rename to ktor-server/ktor-server-tests/jvm/test/io/ktor/tests/server/features/StatusPageTest.kt diff --git a/ktor-server/ktor-server-tests/test/io/ktor/tests/server/http/ApplicationRequestContentTest.kt b/ktor-server/ktor-server-tests/jvm/test/io/ktor/tests/server/http/ApplicationRequestContentTest.kt similarity index 100% rename from ktor-server/ktor-server-tests/test/io/ktor/tests/server/http/ApplicationRequestContentTest.kt rename to ktor-server/ktor-server-tests/jvm/test/io/ktor/tests/server/http/ApplicationRequestContentTest.kt diff --git a/ktor-server/ktor-server-tests/test/io/ktor/tests/server/http/DefaultPushTest.kt b/ktor-server/ktor-server-tests/jvm/test/io/ktor/tests/server/http/DefaultPushTest.kt similarity index 100% rename from ktor-server/ktor-server-tests/test/io/ktor/tests/server/http/DefaultPushTest.kt rename to ktor-server/ktor-server-tests/jvm/test/io/ktor/tests/server/http/DefaultPushTest.kt diff --git a/ktor-server/ktor-server-tests/test/io/ktor/tests/server/http/RespondFunctionsTest.kt b/ktor-server/ktor-server-tests/jvm/test/io/ktor/tests/server/http/RespondFunctionsTest.kt similarity index 100% rename from ktor-server/ktor-server-tests/test/io/ktor/tests/server/http/RespondFunctionsTest.kt rename to ktor-server/ktor-server-tests/jvm/test/io/ktor/tests/server/http/RespondFunctionsTest.kt diff --git a/ktor-server/ktor-server-tests/test/io/ktor/tests/server/http/RespondWriteTest.kt b/ktor-server/ktor-server-tests/jvm/test/io/ktor/tests/server/http/RespondWriteTest.kt similarity index 100% rename from ktor-server/ktor-server-tests/test/io/ktor/tests/server/http/RespondWriteTest.kt rename to ktor-server/ktor-server-tests/jvm/test/io/ktor/tests/server/http/RespondWriteTest.kt diff --git a/ktor-server/ktor-server-tests/test/io/ktor/tests/server/http/TestEngineMultipartTest.kt b/ktor-server/ktor-server-tests/jvm/test/io/ktor/tests/server/http/TestEngineMultipartTest.kt similarity index 100% rename from ktor-server/ktor-server-tests/test/io/ktor/tests/server/http/TestEngineMultipartTest.kt rename to ktor-server/ktor-server-tests/jvm/test/io/ktor/tests/server/http/TestEngineMultipartTest.kt diff --git a/ktor-server/ktor-server-tests/test/io/ktor/tests/server/http/URLBuilderTest.kt b/ktor-server/ktor-server-tests/jvm/test/io/ktor/tests/server/http/URLBuilderTest.kt similarity index 100% rename from ktor-server/ktor-server-tests/test/io/ktor/tests/server/http/URLBuilderTest.kt rename to ktor-server/ktor-server-tests/jvm/test/io/ktor/tests/server/http/URLBuilderTest.kt diff --git a/ktor-server/ktor-server-tests/test/io/ktor/tests/server/http/UrlEncodedTest.kt b/ktor-server/ktor-server-tests/jvm/test/io/ktor/tests/server/http/UrlEncodedTest.kt similarity index 100% rename from ktor-server/ktor-server-tests/test/io/ktor/tests/server/http/UrlEncodedTest.kt rename to ktor-server/ktor-server-tests/jvm/test/io/ktor/tests/server/http/UrlEncodedTest.kt diff --git a/ktor-server/ktor-server-tests/test/io/ktor/tests/server/routing/RoutingBuildTest.kt b/ktor-server/ktor-server-tests/jvm/test/io/ktor/tests/server/routing/RoutingBuildTest.kt similarity index 100% rename from ktor-server/ktor-server-tests/test/io/ktor/tests/server/routing/RoutingBuildTest.kt rename to ktor-server/ktor-server-tests/jvm/test/io/ktor/tests/server/routing/RoutingBuildTest.kt diff --git a/ktor-server/ktor-server-tests/test/io/ktor/tests/server/routing/RoutingProcessingTest.kt b/ktor-server/ktor-server-tests/jvm/test/io/ktor/tests/server/routing/RoutingProcessingTest.kt similarity index 100% rename from ktor-server/ktor-server-tests/test/io/ktor/tests/server/routing/RoutingProcessingTest.kt rename to ktor-server/ktor-server-tests/jvm/test/io/ktor/tests/server/routing/RoutingProcessingTest.kt diff --git a/ktor-server/ktor-server-tests/test/io/ktor/tests/server/routing/RoutingResolveTest.kt b/ktor-server/ktor-server-tests/jvm/test/io/ktor/tests/server/routing/RoutingResolveTest.kt similarity index 100% rename from ktor-server/ktor-server-tests/test/io/ktor/tests/server/routing/RoutingResolveTest.kt rename to ktor-server/ktor-server-tests/jvm/test/io/ktor/tests/server/routing/RoutingResolveTest.kt diff --git a/ktor-server/ktor-server-tests/test/io/ktor/tests/server/sessions/AutoSerializerTest.kt b/ktor-server/ktor-server-tests/jvm/test/io/ktor/tests/server/sessions/AutoSerializerTest.kt similarity index 100% rename from ktor-server/ktor-server-tests/test/io/ktor/tests/server/sessions/AutoSerializerTest.kt rename to ktor-server/ktor-server-tests/jvm/test/io/ktor/tests/server/sessions/AutoSerializerTest.kt diff --git a/ktor-server/ktor-server-tests/test/io/ktor/tests/server/sessions/SessionTest.kt b/ktor-server/ktor-server-tests/jvm/test/io/ktor/tests/server/sessions/SessionTest.kt similarity index 100% rename from ktor-server/ktor-server-tests/test/io/ktor/tests/server/sessions/SessionTest.kt rename to ktor-server/ktor-server-tests/jvm/test/io/ktor/tests/server/sessions/SessionTest.kt diff --git a/ktor-server/ktor-server-tomcat/build.gradle b/ktor-server/ktor-server-tomcat/build.gradle index e54d7198bf..777586b763 100644 --- a/ktor-server/ktor-server-tomcat/build.gradle +++ b/ktor-server/ktor-server-tomcat/build.gradle @@ -1,9 +1,14 @@ description = '' -dependencies { - compile project(':ktor-server:ktor-server-host-common') - compile project(':ktor-server:ktor-server-servlet') - compile group: 'org.apache.tomcat', name: 'tomcat-catalina', version: '9.0.10' - compile group: 'org.apache.tomcat.embed', name: 'tomcat-embed-core', version: '9.0.10' - testCompile project(':ktor-server:ktor-server-test-host') - testCompile project(':ktor-server:ktor-server-core') + +kotlin.sourceSets { + jvmMain.dependencies { + api project(':ktor-server:ktor-server-host-common') + api project(':ktor-server:ktor-server-servlet') + api group: 'org.apache.tomcat', name: 'tomcat-catalina', version: '9.0.10' + api group: 'org.apache.tomcat.embed', name: 'tomcat-embed-core', version: '9.0.10' + } + jvmTest.dependencies { + api project(':ktor-server:ktor-server-test-host') + api project(':ktor-server:ktor-server-core') + } } diff --git a/ktor-server/ktor-server-tomcat/src/io/ktor/server/tomcat/Embedded.kt b/ktor-server/ktor-server-tomcat/jvm/src/io/ktor/server/tomcat/Embedded.kt similarity index 100% rename from ktor-server/ktor-server-tomcat/src/io/ktor/server/tomcat/Embedded.kt rename to ktor-server/ktor-server-tomcat/jvm/src/io/ktor/server/tomcat/Embedded.kt diff --git a/ktor-server/ktor-server-tomcat/src/io/ktor/server/tomcat/EngineMain.kt b/ktor-server/ktor-server-tomcat/jvm/src/io/ktor/server/tomcat/EngineMain.kt similarity index 100% rename from ktor-server/ktor-server-tomcat/src/io/ktor/server/tomcat/EngineMain.kt rename to ktor-server/ktor-server-tomcat/jvm/src/io/ktor/server/tomcat/EngineMain.kt diff --git a/ktor-server/ktor-server-tomcat/src/io/ktor/server/tomcat/TomcatApplicationEngine.kt b/ktor-server/ktor-server-tomcat/jvm/src/io/ktor/server/tomcat/TomcatApplicationEngine.kt similarity index 100% rename from ktor-server/ktor-server-tomcat/src/io/ktor/server/tomcat/TomcatApplicationEngine.kt rename to ktor-server/ktor-server-tomcat/jvm/src/io/ktor/server/tomcat/TomcatApplicationEngine.kt diff --git a/ktor-server/ktor-server-tomcat/test/io/ktor/tests/server/tomcat/TomcatEngineTest.kt b/ktor-server/ktor-server-tomcat/jvm/test/io/ktor/tests/server/tomcat/TomcatEngineTest.kt similarity index 100% rename from ktor-server/ktor-server-tomcat/test/io/ktor/tests/server/tomcat/TomcatEngineTest.kt rename to ktor-server/ktor-server-tomcat/jvm/test/io/ktor/tests/server/tomcat/TomcatEngineTest.kt diff --git a/ktor-utils/build.gradle b/ktor-utils/build.gradle index e69de29bb2..53e49b3dd1 100644 --- a/ktor-utils/build.gradle +++ b/ktor-utils/build.gradle @@ -0,0 +1,18 @@ +kotlin { + targets { + def current = [] + if (project.ext.ideaActive) { + current = [posix] + } else { + current = [iosX64, iosArm64, macosX64, linuxX64, mingwX64] + } + + configure(current) { + compilations.main.cinterops { + utils { + defFile 'posix/interop/utils.def' + } + } + } + } +} diff --git a/ktor-utils/src/io/ktor/pipeline/Compatibility.kt b/ktor-utils/common/src/io/ktor/pipeline/Compatibility.kt similarity index 100% rename from ktor-utils/src/io/ktor/pipeline/Compatibility.kt rename to ktor-utils/common/src/io/ktor/pipeline/Compatibility.kt diff --git a/ktor-utils/src/io/ktor/util/Annotations.kt b/ktor-utils/common/src/io/ktor/util/Annotations.kt similarity index 100% rename from ktor-utils/src/io/ktor/util/Annotations.kt rename to ktor-utils/common/src/io/ktor/util/Annotations.kt diff --git a/ktor-utils/src/io/ktor/util/Attributes.kt b/ktor-utils/common/src/io/ktor/util/Attributes.kt similarity index 100% rename from ktor-utils/src/io/ktor/util/Attributes.kt rename to ktor-utils/common/src/io/ktor/util/Attributes.kt diff --git a/ktor-utils/src/io/ktor/util/Base64.kt b/ktor-utils/common/src/io/ktor/util/Base64.kt similarity index 93% rename from ktor-utils/src/io/ktor/util/Base64.kt rename to ktor-utils/common/src/io/ktor/util/Base64.kt index 944f6177f1..70430c2089 100644 --- a/ktor-utils/src/io/ktor/util/Base64.kt +++ b/ktor-utils/common/src/io/ktor/util/Base64.kt @@ -30,7 +30,9 @@ fun ByteReadPacket.encodeBase64(): String = buildString { data.clearFrom(read) val padSize = (data.size - read) * 8 / 6 - val chunk = (data[0].toInt() shl 16) or (data[1].toInt() shl 8) or data[2].toInt() + val chunk = ((data[0].toInt() and 0xFF) shl 16) or + ((data[1].toInt() and 0xFF) shl 8) or + (data[2].toInt() and 0xFF) for (index in data.size downTo padSize) { val char = (chunk shr (6 * index)) and BASE64_MASK.toInt() diff --git a/ktor-utils/src/io/ktor/util/ByteChannels.kt b/ktor-utils/common/src/io/ktor/util/ByteChannels.kt similarity index 100% rename from ktor-utils/src/io/ktor/util/ByteChannels.kt rename to ktor-utils/common/src/io/ktor/util/ByteChannels.kt diff --git a/ktor-utils/src/io/ktor/util/CaseInsensitiveMap.kt b/ktor-utils/common/src/io/ktor/util/CaseInsensitiveMap.kt similarity index 100% rename from ktor-utils/src/io/ktor/util/CaseInsensitiveMap.kt rename to ktor-utils/common/src/io/ktor/util/CaseInsensitiveMap.kt diff --git a/ktor-utils/src/io/ktor/util/Charset.kt b/ktor-utils/common/src/io/ktor/util/Charset.kt similarity index 100% rename from ktor-utils/src/io/ktor/util/Charset.kt rename to ktor-utils/common/src/io/ktor/util/Charset.kt diff --git a/ktor-utils/src/io/ktor/util/Collections.kt b/ktor-utils/common/src/io/ktor/util/Collections.kt similarity index 100% rename from ktor-utils/src/io/ktor/util/Collections.kt rename to ktor-utils/common/src/io/ktor/util/Collections.kt diff --git a/ktor-utils/src/io/ktor/util/Crypto.kt b/ktor-utils/common/src/io/ktor/util/Crypto.kt similarity index 95% rename from ktor-utils/src/io/ktor/util/Crypto.kt rename to ktor-utils/common/src/io/ktor/util/Crypto.kt index 508b1f52cf..34ea15a219 100644 --- a/ktor-utils/src/io/ktor/util/Crypto.kt +++ b/ktor-utils/common/src/io/ktor/util/Crypto.kt @@ -1,3 +1,5 @@ +@file:kotlin.jvm.JvmMultifileClass +@file:kotlin.jvm.JvmName("CryptoKt") package io.ktor.util import kotlinx.io.charsets.* diff --git a/ktor-utils/src/io/ktor/util/DelegatingMutableSet.kt b/ktor-utils/common/src/io/ktor/util/DelegatingMutableSet.kt similarity index 100% rename from ktor-utils/src/io/ktor/util/DelegatingMutableSet.kt rename to ktor-utils/common/src/io/ktor/util/DelegatingMutableSet.kt diff --git a/ktor-utils/src/io/ktor/util/Hash.kt b/ktor-utils/common/src/io/ktor/util/Hash.kt similarity index 100% rename from ktor-utils/src/io/ktor/util/Hash.kt rename to ktor-utils/common/src/io/ktor/util/Hash.kt diff --git a/ktor-utils/src/io/ktor/util/Lock.kt b/ktor-utils/common/src/io/ktor/util/Lock.kt similarity index 100% rename from ktor-utils/src/io/ktor/util/Lock.kt rename to ktor-utils/common/src/io/ktor/util/Lock.kt diff --git a/ktor-utils/src/io/ktor/util/Ranges.kt b/ktor-utils/common/src/io/ktor/util/Ranges.kt similarity index 100% rename from ktor-utils/src/io/ktor/util/Ranges.kt rename to ktor-utils/common/src/io/ktor/util/Ranges.kt diff --git a/ktor-utils/src/io/ktor/util/StackFrames.kt b/ktor-utils/common/src/io/ktor/util/StackFrames.kt similarity index 100% rename from ktor-utils/src/io/ktor/util/StackFrames.kt rename to ktor-utils/common/src/io/ktor/util/StackFrames.kt diff --git a/ktor-utils/src/io/ktor/util/StringValues.kt b/ktor-utils/common/src/io/ktor/util/StringValues.kt similarity index 100% rename from ktor-utils/src/io/ktor/util/StringValues.kt rename to ktor-utils/common/src/io/ktor/util/StringValues.kt diff --git a/ktor-utils/src/io/ktor/util/Text.kt b/ktor-utils/common/src/io/ktor/util/Text.kt similarity index 100% rename from ktor-utils/src/io/ktor/util/Text.kt rename to ktor-utils/common/src/io/ktor/util/Text.kt diff --git a/ktor-utils/src/io/ktor/util/date/Date.kt b/ktor-utils/common/src/io/ktor/util/date/Date.kt similarity index 100% rename from ktor-utils/src/io/ktor/util/date/Date.kt rename to ktor-utils/common/src/io/ktor/util/date/Date.kt diff --git a/ktor-utils/src/io/ktor/util/pipeline/ContextDsl.kt b/ktor-utils/common/src/io/ktor/util/pipeline/ContextDsl.kt similarity index 100% rename from ktor-utils/src/io/ktor/util/pipeline/ContextDsl.kt rename to ktor-utils/common/src/io/ktor/util/pipeline/ContextDsl.kt diff --git a/ktor-utils/src/io/ktor/util/pipeline/Pipeline.kt b/ktor-utils/common/src/io/ktor/util/pipeline/Pipeline.kt similarity index 100% rename from ktor-utils/src/io/ktor/util/pipeline/Pipeline.kt rename to ktor-utils/common/src/io/ktor/util/pipeline/Pipeline.kt diff --git a/ktor-utils/src/io/ktor/util/pipeline/PipelineContext.kt b/ktor-utils/common/src/io/ktor/util/pipeline/PipelineContext.kt similarity index 100% rename from ktor-utils/src/io/ktor/util/pipeline/PipelineContext.kt rename to ktor-utils/common/src/io/ktor/util/pipeline/PipelineContext.kt diff --git a/ktor-utils/src/io/ktor/util/pipeline/PipelinePhase.kt b/ktor-utils/common/src/io/ktor/util/pipeline/PipelinePhase.kt similarity index 100% rename from ktor-utils/src/io/ktor/util/pipeline/PipelinePhase.kt rename to ktor-utils/common/src/io/ktor/util/pipeline/PipelinePhase.kt diff --git a/ktor-utils/common/test/io/ktor/tests/utils/Base64.kt b/ktor-utils/common/test/io/ktor/tests/utils/Base64.kt new file mode 100644 index 0000000000..c50a307fa9 --- /dev/null +++ b/ktor-utils/common/test/io/ktor/tests/utils/Base64.kt @@ -0,0 +1,51 @@ +package io.ktor.util + +import kotlin.test.* + + +class Base64 { + + @Test + fun encodeDecodeTextTest() { + val text = "This reference is designed for you to easily learn Kotlin in a matter of hours. " + + "Start with the basic syntax, then proceed to more advanced topics. While reading, " + + "you can try out the examples in the online IDE. " + + "Once you get an idea of what Kotlin looks like, " + + "try solving some Kotlin Koans - interactive programming exercises. " + + "If you are not sure how to solve a Koan, " + + "or you're looking for a more elegant solution, check out Kotlin idioms." + + val encodedText = "VGhpcyByZWZlcmVuY2UgaXMgZGVzaWduZWQgZm9yIHlvdSB0byBlYXNpbHkgbGVhcm4gS290bGluIG" + + "luIGEgbWF0dGVyIG9mIGhvdXJzLiBTdGFydCB3aXRoIHRoZSBiYXNpYyBzeW50YXgsIHRoZW4gcHJvY2VlZCB0by" + + "Btb3JlIGFkdmFuY2VkIHRvcGljcy4gV2hpbGUgcmVhZGluZywgeW91IGNhbiB0cnkgb3V0IHRoZSBleGFtcGxlcy" + + "BpbiB0aGUgb25saW5lIElERS4gT25jZSB5b3UgZ2V0IGFuIGlkZWEgb2Ygd2hhdCBLb3RsaW4gbG9va3MgbGlrZS" + + "wgdHJ5IHNvbHZpbmcgc29tZSBLb3RsaW4gS29hbnMgLSBpbnRlcmFjdGl2ZSBwcm9ncmFtbWluZyBleGVyY2lzZX" + + "MuIElmIHlvdSBhcmUgbm90IHN1cmUgaG93IHRvIHNvbHZlIGEgS29hbiwgb3IgeW91J3JlIGxvb2tpbmcgZm9yIG" + + "EgbW9yZSBlbGVnYW50IHNvbHV0aW9uLCBjaGVjayBvdXQgS290bGluIGlkaW9tcy4=" + + assertEquals(encodedText, text.encodeBase64()) + assertEquals(text, encodedText.decodeBase64()) + } + + @Test + fun encodeEmptyTest() { + assertEquals("", "".encodeBase64()) + assertEquals("", "".decodeBase64()) + } + + @Test + fun paddingTest() { + val cases = mapOf( + "This" to "VGhpcw==", + "Thi" to "VGhp", + "Th" to "VGg=", + "T" to "VA==", + "" to "" + ) + + cases.forEach { (text, encodedText) -> + assertEquals(encodedText, text.encodeBase64()) + assertEquals(text, encodedText.decodeBase64()) + } + } +} diff --git a/ktor-utils/test/io/ktor/tests/utils/CaseInsensitiveMapTest.kt b/ktor-utils/common/test/io/ktor/tests/utils/CaseInsensitiveMapTest.kt similarity index 100% rename from ktor-utils/test/io/ktor/tests/utils/CaseInsensitiveMapTest.kt rename to ktor-utils/common/test/io/ktor/tests/utils/CaseInsensitiveMapTest.kt diff --git a/ktor-utils/test/io/ktor/tests/utils/GMTDateTest.kt b/ktor-utils/common/test/io/ktor/tests/utils/GMTDateTest.kt similarity index 100% rename from ktor-utils/test/io/ktor/tests/utils/GMTDateTest.kt rename to ktor-utils/common/test/io/ktor/tests/utils/GMTDateTest.kt diff --git a/ktor-utils/test/io/ktor/tests/utils/PipelineContractsTest.kt b/ktor-utils/common/test/io/ktor/tests/utils/PipelineContractsTest.kt similarity index 100% rename from ktor-utils/test/io/ktor/tests/utils/PipelineContractsTest.kt rename to ktor-utils/common/test/io/ktor/tests/utils/PipelineContractsTest.kt diff --git a/ktor-utils/test/io/ktor/tests/utils/PipelinePhasesTest.kt b/ktor-utils/common/test/io/ktor/tests/utils/PipelinePhasesTest.kt similarity index 100% rename from ktor-utils/test/io/ktor/tests/utils/PipelinePhasesTest.kt rename to ktor-utils/common/test/io/ktor/tests/utils/PipelinePhasesTest.kt diff --git a/ktor-utils/test/io/ktor/tests/utils/StringValuesTest.kt b/ktor-utils/common/test/io/ktor/tests/utils/StringValuesTest.kt similarity index 100% rename from ktor-utils/test/io/ktor/tests/utils/StringValuesTest.kt rename to ktor-utils/common/test/io/ktor/tests/utils/StringValuesTest.kt diff --git a/ktor-utils/ktor-utils-js/src/io/ktor/util/AttributesJs.kt b/ktor-utils/js/src/io/ktor/util/AttributesJs.kt similarity index 100% rename from ktor-utils/ktor-utils-js/src/io/ktor/util/AttributesJs.kt rename to ktor-utils/js/src/io/ktor/util/AttributesJs.kt diff --git a/ktor-utils/ktor-utils-js/src/io/ktor/util/CollectionsJs.kt b/ktor-utils/js/src/io/ktor/util/CollectionsJs.kt similarity index 100% rename from ktor-utils/ktor-utils-js/src/io/ktor/util/CollectionsJs.kt rename to ktor-utils/js/src/io/ktor/util/CollectionsJs.kt diff --git a/ktor-utils/ktor-utils-js/src/io/ktor/util/CryptoJs.kt b/ktor-utils/js/src/io/ktor/util/CryptoJs.kt similarity index 100% rename from ktor-utils/ktor-utils-js/src/io/ktor/util/CryptoJs.kt rename to ktor-utils/js/src/io/ktor/util/CryptoJs.kt diff --git a/ktor-utils/ktor-utils-js/src/io/ktor/util/Lock.kt b/ktor-utils/js/src/io/ktor/util/Lock.kt similarity index 100% rename from ktor-utils/ktor-utils-js/src/io/ktor/util/Lock.kt rename to ktor-utils/js/src/io/ktor/util/Lock.kt diff --git a/ktor-utils/ktor-utils-js/src/io/ktor/util/StackFramesJs.kt b/ktor-utils/js/src/io/ktor/util/StackFramesJs.kt similarity index 100% rename from ktor-utils/ktor-utils-js/src/io/ktor/util/StackFramesJs.kt rename to ktor-utils/js/src/io/ktor/util/StackFramesJs.kt diff --git a/ktor-utils/ktor-utils-js/src/io/ktor/util/date/DateJs.kt b/ktor-utils/js/src/io/ktor/util/date/DateJs.kt similarity index 100% rename from ktor-utils/ktor-utils-js/src/io/ktor/util/date/DateJs.kt rename to ktor-utils/js/src/io/ktor/util/date/DateJs.kt diff --git a/ktor-utils/ktor-utils-jvm/src/io/ktor/util/AttributesJvm.kt b/ktor-utils/jvm/src/io/ktor/util/AttributesJvm.kt similarity index 100% rename from ktor-utils/ktor-utils-jvm/src/io/ktor/util/AttributesJvm.kt rename to ktor-utils/jvm/src/io/ktor/util/AttributesJvm.kt diff --git a/ktor-utils/ktor-utils-jvm/src/io/ktor/util/BufferViewJvm.kt b/ktor-utils/jvm/src/io/ktor/util/BufferViewJvm.kt similarity index 100% rename from ktor-utils/ktor-utils-jvm/src/io/ktor/util/BufferViewJvm.kt rename to ktor-utils/jvm/src/io/ktor/util/BufferViewJvm.kt diff --git a/ktor-utils/ktor-utils-jvm/src/io/ktor/util/CollectionsJvm.kt b/ktor-utils/jvm/src/io/ktor/util/CollectionsJvm.kt similarity index 100% rename from ktor-utils/ktor-utils-jvm/src/io/ktor/util/CollectionsJvm.kt rename to ktor-utils/jvm/src/io/ktor/util/CollectionsJvm.kt diff --git a/ktor-utils/ktor-utils-jvm/src/io/ktor/util/CryptoJvm.kt b/ktor-utils/jvm/src/io/ktor/util/CryptoJvm.kt similarity index 97% rename from ktor-utils/ktor-utils-jvm/src/io/ktor/util/CryptoJvm.kt rename to ktor-utils/jvm/src/io/ktor/util/CryptoJvm.kt index add5e83ed4..f0ebf26a4c 100644 --- a/ktor-utils/ktor-utils-jvm/src/io/ktor/util/CryptoJvm.kt +++ b/ktor-utils/jvm/src/io/ktor/util/CryptoJvm.kt @@ -1,3 +1,5 @@ +@file:kotlin.jvm.JvmMultifileClass +@file:kotlin.jvm.JvmName("CryptoKt") package io.ktor.util import kotlinx.coroutines.* diff --git a/ktor-utils/ktor-utils-jvm/src/io/ktor/util/DatesJvm.kt b/ktor-utils/jvm/src/io/ktor/util/DatesJvm.kt similarity index 100% rename from ktor-utils/ktor-utils-jvm/src/io/ktor/util/DatesJvm.kt rename to ktor-utils/jvm/src/io/ktor/util/DatesJvm.kt diff --git a/ktor-utils/ktor-utils-jvm/src/io/ktor/util/Deflater.kt b/ktor-utils/jvm/src/io/ktor/util/Deflater.kt similarity index 100% rename from ktor-utils/ktor-utils-jvm/src/io/ktor/util/Deflater.kt rename to ktor-utils/jvm/src/io/ktor/util/Deflater.kt diff --git a/ktor-utils/ktor-utils-jvm/src/io/ktor/util/InputJvm.kt b/ktor-utils/jvm/src/io/ktor/util/InputJvm.kt similarity index 100% rename from ktor-utils/ktor-utils-jvm/src/io/ktor/util/InputJvm.kt rename to ktor-utils/jvm/src/io/ktor/util/InputJvm.kt diff --git a/ktor-utils/ktor-utils-jvm/src/io/ktor/util/LockJvm.kt b/ktor-utils/jvm/src/io/ktor/util/LockJvm.kt similarity index 100% rename from ktor-utils/ktor-utils-jvm/src/io/ktor/util/LockJvm.kt rename to ktor-utils/jvm/src/io/ktor/util/LockJvm.kt diff --git a/ktor-utils/ktor-utils-jvm/src/io/ktor/util/Logging.kt b/ktor-utils/jvm/src/io/ktor/util/Logging.kt similarity index 100% rename from ktor-utils/ktor-utils-jvm/src/io/ktor/util/Logging.kt rename to ktor-utils/jvm/src/io/ktor/util/Logging.kt diff --git a/ktor-utils/ktor-utils-jvm/src/io/ktor/util/NIO.kt b/ktor-utils/jvm/src/io/ktor/util/NIO.kt similarity index 100% rename from ktor-utils/ktor-utils-jvm/src/io/ktor/util/NIO.kt rename to ktor-utils/jvm/src/io/ktor/util/NIO.kt diff --git a/ktor-utils/ktor-utils-jvm/src/io/ktor/util/Nonce.kt b/ktor-utils/jvm/src/io/ktor/util/Nonce.kt similarity index 100% rename from ktor-utils/ktor-utils-jvm/src/io/ktor/util/Nonce.kt rename to ktor-utils/jvm/src/io/ktor/util/Nonce.kt diff --git a/ktor-utils/ktor-utils-jvm/src/io/ktor/util/Path.kt b/ktor-utils/jvm/src/io/ktor/util/Path.kt similarity index 100% rename from ktor-utils/ktor-utils-jvm/src/io/ktor/util/Path.kt rename to ktor-utils/jvm/src/io/ktor/util/Path.kt diff --git a/ktor-utils/ktor-utils-jvm/src/io/ktor/util/Reflection.kt b/ktor-utils/jvm/src/io/ktor/util/Reflection.kt similarity index 100% rename from ktor-utils/ktor-utils-jvm/src/io/ktor/util/Reflection.kt rename to ktor-utils/jvm/src/io/ktor/util/Reflection.kt diff --git a/ktor-utils/ktor-utils-jvm/src/io/ktor/util/StackFramesJvm.kt b/ktor-utils/jvm/src/io/ktor/util/StackFramesJvm.kt similarity index 100% rename from ktor-utils/ktor-utils-jvm/src/io/ktor/util/StackFramesJvm.kt rename to ktor-utils/jvm/src/io/ktor/util/StackFramesJvm.kt diff --git a/ktor-utils/ktor-utils-jvm/src/io/ktor/util/cio/ByteBufferPool.kt b/ktor-utils/jvm/src/io/ktor/util/cio/ByteBufferPool.kt similarity index 100% rename from ktor-utils/ktor-utils-jvm/src/io/ktor/util/cio/ByteBufferPool.kt rename to ktor-utils/jvm/src/io/ktor/util/cio/ByteBufferPool.kt diff --git a/ktor-utils/ktor-utils-jvm/src/io/ktor/util/cio/CIO.kt b/ktor-utils/jvm/src/io/ktor/util/cio/CIO.kt similarity index 100% rename from ktor-utils/ktor-utils-jvm/src/io/ktor/util/cio/CIO.kt rename to ktor-utils/jvm/src/io/ktor/util/cio/CIO.kt diff --git a/ktor-utils/ktor-utils-jvm/src/io/ktor/util/cio/Channels.kt b/ktor-utils/jvm/src/io/ktor/util/cio/Channels.kt similarity index 100% rename from ktor-utils/ktor-utils-jvm/src/io/ktor/util/cio/Channels.kt rename to ktor-utils/jvm/src/io/ktor/util/cio/Channels.kt diff --git a/ktor-utils/ktor-utils-jvm/src/io/ktor/util/cio/FileChannels.kt b/ktor-utils/jvm/src/io/ktor/util/cio/FileChannels.kt similarity index 100% rename from ktor-utils/ktor-utils-jvm/src/io/ktor/util/cio/FileChannels.kt rename to ktor-utils/jvm/src/io/ktor/util/cio/FileChannels.kt diff --git a/ktor-utils/jvm/src/io/ktor/util/cio/InputStreamAdapters.kt b/ktor-utils/jvm/src/io/ktor/util/cio/InputStreamAdapters.kt new file mode 100644 index 0000000000..7987cbefbe --- /dev/null +++ b/ktor-utils/jvm/src/io/ktor/util/cio/InputStreamAdapters.kt @@ -0,0 +1,40 @@ +package io.ktor.util.cio + +import io.ktor.util.* +import kotlinx.coroutines.* +import kotlinx.coroutines.io.* +import kotlinx.io.pool.* +import java.io.* +import java.nio.* +import kotlin.coroutines.* + +/** + * Open a channel and launch a coroutine to copy bytes from the input stream to the channel. + * Please note that it may block your async code when started on [Dispatchers.Unconfined] + * since [InputStream] is blocking on it's nature + */ +@KtorExperimentalAPI +fun InputStream.toByteReadChannel( + pool: ObjectPool = KtorDefaultPool, + context: CoroutineContext = Dispatchers.Unconfined, + parent: Job = Job() +): ByteReadChannel = CoroutineScope(context).writer(parent, autoFlush = true) { + val buffer = pool.borrow() + try { + while (true) { + buffer.clear() + val readCount = read(buffer.array(), buffer.arrayOffset() + buffer.position(), buffer.remaining()) + if (readCount < 0) break + if (readCount == 0) continue + + buffer.position(buffer.position() + readCount) + buffer.flip() + channel.writeFully(buffer) + } + } catch (cause: Throwable) { + channel.close(cause) + } finally { + pool.recycle(buffer) + close() + } +}.channel diff --git a/ktor-utils/ktor-utils-jvm/src/io/ktor/util/cio/OutputStreamAdapters.kt b/ktor-utils/jvm/src/io/ktor/util/cio/OutputStreamAdapters.kt similarity index 100% rename from ktor-utils/ktor-utils-jvm/src/io/ktor/util/cio/OutputStreamAdapters.kt rename to ktor-utils/jvm/src/io/ktor/util/cio/OutputStreamAdapters.kt diff --git a/ktor-utils/ktor-utils-jvm/src/io/ktor/util/cio/Readers.kt b/ktor-utils/jvm/src/io/ktor/util/cio/Readers.kt similarity index 100% rename from ktor-utils/ktor-utils-jvm/src/io/ktor/util/cio/Readers.kt rename to ktor-utils/jvm/src/io/ktor/util/cio/Readers.kt diff --git a/ktor-utils/ktor-utils-jvm/src/io/ktor/util/cio/Semaphore.kt b/ktor-utils/jvm/src/io/ktor/util/cio/Semaphore.kt similarity index 100% rename from ktor-utils/ktor-utils-jvm/src/io/ktor/util/cio/Semaphore.kt rename to ktor-utils/jvm/src/io/ktor/util/cio/Semaphore.kt diff --git a/ktor-utils/ktor-utils-jvm/src/io/ktor/util/date/DateJvm.kt b/ktor-utils/jvm/src/io/ktor/util/date/DateJvm.kt similarity index 100% rename from ktor-utils/ktor-utils-jvm/src/io/ktor/util/date/DateJvm.kt rename to ktor-utils/jvm/src/io/ktor/util/date/DateJvm.kt diff --git a/ktor-utils/ktor-utils-jvm/src/io/ktor/util/date/DateUtils.kt b/ktor-utils/jvm/src/io/ktor/util/date/DateUtils.kt similarity index 100% rename from ktor-utils/ktor-utils-jvm/src/io/ktor/util/date/DateUtils.kt rename to ktor-utils/jvm/src/io/ktor/util/date/DateUtils.kt diff --git a/ktor-utils/ktor-utils-jvm/src/io/ktor/util/internal/LockFreeLinkedList.kt b/ktor-utils/jvm/src/io/ktor/util/internal/LockFreeLinkedList.kt similarity index 100% rename from ktor-utils/ktor-utils-jvm/src/io/ktor/util/internal/LockFreeLinkedList.kt rename to ktor-utils/jvm/src/io/ktor/util/internal/LockFreeLinkedList.kt diff --git a/ktor-utils/ktor-utils-jvm/test/io/ktor/tests/utils/DeflaterReadChannelTest.kt b/ktor-utils/jvm/test/io/ktor/tests/utils/DeflaterReadChannelTest.kt similarity index 87% rename from ktor-utils/ktor-utils-jvm/test/io/ktor/tests/utils/DeflaterReadChannelTest.kt rename to ktor-utils/jvm/test/io/ktor/tests/utils/DeflaterReadChannelTest.kt index d72fc7061a..a6bbc6b2ed 100644 --- a/ktor-utils/ktor-utils-jvm/test/io/ktor/tests/utils/DeflaterReadChannelTest.kt +++ b/ktor-utils/jvm/test/io/ktor/tests/utils/DeflaterReadChannelTest.kt @@ -23,8 +23,8 @@ class DeflaterReadChannelTest : CoroutineScope { @Test fun testWithRealFile() { - val file = listOf(File("test/io/ktor/tests/utils/DeflaterReadChannelTest.kt"), - File("ktor-server/ktor-server-tests/test/io/ktor/tests/utils/DeflaterReadChannelTest.kt")).first(File::exists) + val file = listOf(File("jvm/test/io/ktor/tests/utils/DeflaterReadChannelTest.kt"), + File("ktor-server/ktor-server-tests/jvm/test/io/ktor/tests/utils/DeflaterReadChannelTest.kt")).first(File::exists) testReadChannel(file.readText(), file.readChannel()) testWriteChannel(file.readText(), file.readChannel()) @@ -32,8 +32,8 @@ class DeflaterReadChannelTest : CoroutineScope { @Test fun testFileChannel() { - val file = listOf(File("test/io/ktor/tests/utils/DeflaterReadChannelTest.kt"), - File("ktor-server/ktor-server-tests/test/io/ktor/tests/utils/DeflaterReadChannelTest.kt")).first(File::exists) + val file = listOf(File("jvm/test/io/ktor/tests/utils/DeflaterReadChannelTest.kt"), + File("ktor-server/ktor-server-tests/jvm/test/io/ktor/tests/utils/DeflaterReadChannelTest.kt")).first(File::exists) val content = file.readText() @@ -104,4 +104,4 @@ class DeflaterReadChannelTest : CoroutineScope { val result = channel.toInputStream().ungzip().reader().readText() assertEquals(expected, result) } -} \ No newline at end of file +} diff --git a/ktor-utils/ktor-utils-jvm/test/io/ktor/tests/utils/FileChannelTest.kt b/ktor-utils/jvm/test/io/ktor/tests/utils/FileChannelTest.kt similarity index 100% rename from ktor-utils/ktor-utils-jvm/test/io/ktor/tests/utils/FileChannelTest.kt rename to ktor-utils/jvm/test/io/ktor/tests/utils/FileChannelTest.kt diff --git a/ktor-utils/ktor-utils-jvm/test/io/ktor/tests/utils/HexFunctionsTest.kt b/ktor-utils/jvm/test/io/ktor/tests/utils/HexFunctionsTest.kt similarity index 100% rename from ktor-utils/ktor-utils-jvm/test/io/ktor/tests/utils/HexFunctionsTest.kt rename to ktor-utils/jvm/test/io/ktor/tests/utils/HexFunctionsTest.kt diff --git a/ktor-utils/ktor-utils-jvm/test/io/ktor/tests/utils/NonceSmokeTest.kt b/ktor-utils/jvm/test/io/ktor/tests/utils/NonceSmokeTest.kt similarity index 100% rename from ktor-utils/ktor-utils-jvm/test/io/ktor/tests/utils/NonceSmokeTest.kt rename to ktor-utils/jvm/test/io/ktor/tests/utils/NonceSmokeTest.kt diff --git a/ktor-utils/ktor-utils-jvm/test/io/ktor/tests/utils/PipelineStackFramesTest.kt b/ktor-utils/jvm/test/io/ktor/tests/utils/PipelineStackFramesTest.kt similarity index 100% rename from ktor-utils/ktor-utils-jvm/test/io/ktor/tests/utils/PipelineStackFramesTest.kt rename to ktor-utils/jvm/test/io/ktor/tests/utils/PipelineStackFramesTest.kt diff --git a/ktor-utils/ktor-utils-jvm/test/io/ktor/tests/utils/PipelineTest.kt b/ktor-utils/jvm/test/io/ktor/tests/utils/PipelineTest.kt similarity index 100% rename from ktor-utils/ktor-utils-jvm/test/io/ktor/tests/utils/PipelineTest.kt rename to ktor-utils/jvm/test/io/ktor/tests/utils/PipelineTest.kt diff --git a/ktor-utils/ktor-utils-jvm/test/io/ktor/tests/utils/ReflectionSupertypesTest.kt b/ktor-utils/jvm/test/io/ktor/tests/utils/ReflectionSupertypesTest.kt similarity index 100% rename from ktor-utils/ktor-utils-jvm/test/io/ktor/tests/utils/ReflectionSupertypesTest.kt rename to ktor-utils/jvm/test/io/ktor/tests/utils/ReflectionSupertypesTest.kt diff --git a/ktor-utils/ktor-utils-ios/build.gradle b/ktor-utils/ktor-utils-ios/build.gradle deleted file mode 100644 index 48bd6055b9..0000000000 --- a/ktor-utils/ktor-utils-ios/build.gradle +++ /dev/null @@ -1,4 +0,0 @@ - -dependencies { - expectedBy project(':ktor-utils') -} diff --git a/ktor-utils/ktor-utils-ios/src/io/ktor/util/CryptoIos.kt b/ktor-utils/ktor-utils-ios/src/io/ktor/util/CryptoIos.kt deleted file mode 100644 index f9d0f09243..0000000000 --- a/ktor-utils/ktor-utils-ios/src/io/ktor/util/CryptoIos.kt +++ /dev/null @@ -1,24 +0,0 @@ -package io.ktor.util - -import kotlinx.coroutines.* - -private const val NONCE_SIZE_IN_BYTES = 8 - -@InternalAPI -actual fun generateNonce(): String = TODO() - -@InternalAPI -actual fun Digest(name: String): Digest = object : Digest { - private val state = mutableListOf() - override fun plusAssign(bytes: ByteArray) { - state += bytes - } - - override fun reset() { - state.clear() - } - - override suspend fun build(): ByteArray { - TODO() - } -} diff --git a/ktor-utils/ktor-utils-ios/src/io/ktor/util/LockIos.kt b/ktor-utils/ktor-utils-ios/src/io/ktor/util/LockIos.kt deleted file mode 100644 index 7d3dc58a1b..0000000000 --- a/ktor-utils/ktor-utils-ios/src/io/ktor/util/LockIos.kt +++ /dev/null @@ -1,21 +0,0 @@ -package io.ktor.util - -import kotlinx.cinterop.* -import platform.posix.* - -@InternalAPI -actual class Lock { - private val mutex = cValue{} - - init { - pthread_mutex_init(mutex, null) - } - - actual fun lock() { - pthread_mutex_lock(mutex) - } - - actual fun unlock() { - pthread_mutex_unlock(mutex) - } -} diff --git a/ktor-utils/ktor-utils-js/build.gradle b/ktor-utils/ktor-utils-js/build.gradle deleted file mode 100644 index 48bd6055b9..0000000000 --- a/ktor-utils/ktor-utils-js/build.gradle +++ /dev/null @@ -1,4 +0,0 @@ - -dependencies { - expectedBy project(':ktor-utils') -} diff --git a/ktor-utils/ktor-utils-jvm/build.gradle b/ktor-utils/ktor-utils-jvm/build.gradle deleted file mode 100644 index ac98a5027a..0000000000 --- a/ktor-utils/ktor-utils-jvm/build.gradle +++ /dev/null @@ -1,5 +0,0 @@ -description = '' - -dependencies { - expectedBy project(":ktor-utils") -} diff --git a/ktor-utils/posix/interop/utils.def b/ktor-utils/posix/interop/utils.def new file mode 100644 index 0000000000..0787eb4633 --- /dev/null +++ b/ktor-utils/posix/interop/utils.def @@ -0,0 +1,34 @@ +package = utils +compilerOpts.mingw_x64 = -DMINGW +--- +#include +#include + +typedef struct ktor_mutex { + pthread_mutex_t* mutex; +} ktor_mutex_t; + + +void ktor_mutex_create(ktor_mutex_t* mutex) { + pthread_mutex_init(mutex->mutex, NULL); +} + +void ktor_mutex_lock(ktor_mutex_t* mutex) { + pthread_mutex_lock(mutex->mutex); +} + +void ktor_mutex_unlock(ktor_mutex_t* mutex) { + pthread_mutex_unlock(mutex->mutex); +} + +void ktor_mutex_destroy(ktor_mutex_t* mutex) { + pthread_mutex_destroy(mutex->mutex); +} + +time_t ktor_time(struct tm * tm) { +#ifndef MINGW + return timegm(tm); +#else + return _mkgmtime(tm); +#endif +} diff --git a/ktor-utils/ktor-utils-ios/src/io/ktor/util/AttributesIos.kt b/ktor-utils/posix/src/io/ktor/util/AttributesIos.kt similarity index 100% rename from ktor-utils/ktor-utils-ios/src/io/ktor/util/AttributesIos.kt rename to ktor-utils/posix/src/io/ktor/util/AttributesIos.kt diff --git a/ktor-utils/ktor-utils-ios/src/io/ktor/util/CollectionsIos.kt b/ktor-utils/posix/src/io/ktor/util/CollectionsIos.kt similarity index 100% rename from ktor-utils/ktor-utils-ios/src/io/ktor/util/CollectionsIos.kt rename to ktor-utils/posix/src/io/ktor/util/CollectionsIos.kt diff --git a/ktor-utils/posix/src/io/ktor/util/CryptoIos.kt b/ktor-utils/posix/src/io/ktor/util/CryptoIos.kt new file mode 100644 index 0000000000..62056a2ca6 --- /dev/null +++ b/ktor-utils/posix/src/io/ktor/util/CryptoIos.kt @@ -0,0 +1,7 @@ +package io.ktor.util + +@InternalAPI +actual fun generateNonce(): String = error("[generateNonce] is not supported on iOS") + +@InternalAPI +actual fun Digest(name: String): Digest = error("[Digest] is not supported on iOS") diff --git a/ktor-utils/posix/src/io/ktor/util/LockIos.kt b/ktor-utils/posix/src/io/ktor/util/LockIos.kt new file mode 100644 index 0000000000..0e89375a20 --- /dev/null +++ b/ktor-utils/posix/src/io/ktor/util/LockIos.kt @@ -0,0 +1,21 @@ +package io.ktor.util + +import kotlinx.cinterop.* +import utils.* + +@InternalAPI +actual class Lock { + private val mutex = cValue() + + init { + ktor_mutex_create(mutex) + } + + actual fun lock() { + ktor_mutex_lock(mutex) + } + + actual fun unlock() { + ktor_mutex_unlock(mutex) + } +} diff --git a/ktor-utils/ktor-utils-ios/src/io/ktor/util/StackFramesIos.kt b/ktor-utils/posix/src/io/ktor/util/StackFramesIos.kt similarity index 100% rename from ktor-utils/ktor-utils-ios/src/io/ktor/util/StackFramesIos.kt rename to ktor-utils/posix/src/io/ktor/util/StackFramesIos.kt diff --git a/ktor-utils/ktor-utils-ios/src/io/ktor/util/date/DateIos.kt b/ktor-utils/posix/src/io/ktor/util/date/DateIos.kt similarity index 94% rename from ktor-utils/ktor-utils-ios/src/io/ktor/util/date/DateIos.kt rename to ktor-utils/posix/src/io/ktor/util/date/DateIos.kt index 6f47f5ba6f..3ce59fdb78 100644 --- a/ktor-utils/ktor-utils-ios/src/io/ktor/util/date/DateIos.kt +++ b/ktor-utils/posix/src/io/ktor/util/date/DateIos.kt @@ -2,6 +2,7 @@ package io.ktor.util.date import kotlinx.cinterop.* import platform.posix.* +import utils.* actual fun GMTDate(timestamp: Long?): GMTDate = memScoped { val timeHolder = alloc() @@ -47,7 +48,7 @@ actual fun GMTDate( tm_isdst = 0 } - val timestamp: Long = timegm(dateInfo.ptr) + val timestamp: Long = ktor_time(dateInfo.ptr) return GMTDate(timestamp * 1000) } diff --git a/ktor-utils/test/io/ktor/tests/utils/Base64.kt b/ktor-utils/test/io/ktor/tests/utils/Base64.kt deleted file mode 100644 index 7bd5b404c6..0000000000 --- a/ktor-utils/test/io/ktor/tests/utils/Base64.kt +++ /dev/null @@ -1,51 +0,0 @@ -package io.ktor.util - -import kotlin.test.* - - -class Base64 { - - @Test - fun encodeDecodeTextTest() { - val text = "This reference is designed for you to easily learn Kotlin in a matter of hours. " + - "Start with the basic syntax, then proceed to more advanced topics. While reading, " + - "you can try out the examples in the online IDE. " + - "Once you get an idea of what Kotlin looks like, " + - "try solving some Kotlin Koans - interactive programming exercises. " + - "If you are not sure how to solve a Koan, " + - "or you're looking for a more elegant solution, check out Kotlin idioms." - - val encodedText = "VGhpcyByZWZlcmVuY2UgaXMgZGVzaWduZWQgZm9yIHlvdSB0byBlYXNpbHkgbGVhcm4gS290bGluIG" + - "luIGEgbWF0dGVyIG9mIGhvdXJzLiBTdGFydCB3aXRoIHRoZSBiYXNpYyBzeW50YXgsIHRoZW4gcHJvY2VlZCB0by" + - "Btb3JlIGFkdmFuY2VkIHRvcGljcy4gV2hpbGUgcmVhZGluZywgeW91IGNhbiB0cnkgb3V0IHRoZSBleGFtcGxlcy" + - "BpbiB0aGUgb25saW5lIElERS4gT25jZSB5b3UgZ2V0IGFuIGlkZWEgb2Ygd2hhdCBLb3RsaW4gbG9va3MgbGlrZS" + - "wgdHJ5IHNvbHZpbmcgc29tZSBLb3RsaW4gS29hbnMgLSBpbnRlcmFjdGl2ZSBwcm9ncmFtbWluZyBleGVyY2lzZX" + - "MuIElmIHlvdSBhcmUgbm90IHN1cmUgaG93IHRvIHNvbHZlIGEgS29hbiwgb3IgeW91J3JlIGxvb2tpbmcgZm9yIG" + - "EgbW9yZSBlbGVnYW50IHNvbHV0aW9uLCBjaGVjayBvdXQgS290bGluIGlkaW9tcy4=" - - assertEquals(encodedText, text.encodeBase64()) - assertEquals(text, encodedText.decodeBase64()) - } - - @Test - fun encodeEmptyTest() { - assertEquals("", "".encodeBase64()) - assertEquals("", "".decodeBase64()) - } - - @Test - fun paddingTest() { - val cases = mapOf( - "This" to "VGhpcw==", - "Thi" to "VGhp", - "Th" to "VGg=", - "T" to "VA==", - "" to "" - ) - - cases.forEach { (text, encodedText) -> - assertEquals(encodedText, text.encodeBase64()) - assertEquals(text, encodedText.decodeBase64()) - } - } -} \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index 1774b07bf2..dd08531f1d 100644 --- a/settings.gradle +++ b/settings.gradle @@ -30,9 +30,6 @@ includeEx ':binary-compatibility-validator' includeEx ':ktor-server' includeEx ':ktor-client' includeEx ':ktor-client:ktor-client-core' -includeEx ':ktor-client:ktor-client-core:ktor-client-core-jvm' -includeEx ':ktor-client:ktor-client-core:ktor-client-core-js' -includeEx ':ktor-client:ktor-client-core:ktor-client-core-ios' includeEx ':ktor-client:ktor-client-tests' includeEx ':ktor-client:ktor-client-apache' includeEx ':ktor-client:ktor-client-android' @@ -41,25 +38,16 @@ includeEx ':ktor-client:ktor-client-ios' includeEx ':ktor-client:ktor-client-jetty' includeEx ':ktor-client:ktor-client-js' includeEx ':ktor-client:ktor-client-mock' -includeEx ':ktor-client:ktor-client-mock:ktor-client-mock-js' -includeEx ':ktor-client:ktor-client-mock:ktor-client-mock-jvm' -includeEx ':ktor-client:ktor-client-mock:ktor-client-mock-ios' includeEx ':ktor-client:ktor-client-okhttp' includeEx ':ktor-client:ktor-client-features' includeEx ':ktor-client:ktor-client-features:ktor-client-json' includeEx ':ktor-client:ktor-client-features:ktor-client-json:ktor-client-json-tests' -includeEx ':ktor-client:ktor-client-features:ktor-client-json:ktor-client-json-ios' -includeEx ':ktor-client:ktor-client-features:ktor-client-json:ktor-client-json-jvm' -includeEx ':ktor-client:ktor-client-features:ktor-client-json:ktor-client-json-js' includeEx ':ktor-client:ktor-client-features:ktor-client-json:ktor-client-gson' includeEx ':ktor-client:ktor-client-features:ktor-client-json:ktor-client-jackson' includeEx ':ktor-client:ktor-client-features:ktor-client-auth' includeEx ':ktor-client:ktor-client-features:ktor-client-auth-basic' includeEx ':ktor-client:ktor-client-features:ktor-client-websocket' includeEx ':ktor-client:ktor-client-features:ktor-client-logging' -includeEx ':ktor-client:ktor-client-features:ktor-client-logging:ktor-client-logging-jvm' -includeEx ':ktor-client:ktor-client-features:ktor-client-logging:ktor-client-logging-js' -includeEx ':ktor-client:ktor-client-features:ktor-client-logging:ktor-client-logging-ios' includeEx ':ktor-features:ktor-freemarker' includeEx ':ktor-features:ktor-mustache' includeEx ':ktor-features:ktor-velocity' @@ -76,13 +64,7 @@ includeEx ':ktor-features:ktor-auth-jwt' includeEx ':ktor-features:ktor-webjars' includeEx ':ktor-features' includeEx ':ktor-http' -includeEx ':ktor-http:ktor-http-jvm' -includeEx ':ktor-http:ktor-http-js' -includeEx ':ktor-http:ktor-http-ios' includeEx ':ktor-http:ktor-http-cio' includeEx ':ktor-utils' -includeEx ':ktor-utils:ktor-utils-jvm' -includeEx ':ktor-utils:ktor-utils-js' -includeEx ':ktor-utils:ktor-utils-ios' includeEx ':ktor-network' includeEx ':ktor-network:ktor-network-tls'