Releases: ktorio/ktor
Releases · ktorio/ktor
2.3.1
Published 31 May 2023
Bugfixes
- AndroidClientEngine: the engine double-parses query parameters before sending a request (KTOR-5814)
- Flaky tests in WinHttp engine (KTOR-5946)
- Electron/Node.js detection doesn't work correctly (KTOR-5906)
- Curl sometimes fails with
API function called from within callback
(KTOR-5918) - Bearer auth token refresh hangs after prior refresh threw an exception (KTOR-5879)
- HOCON: "No configuration setting found for key" error after merging (KTOR-5895)
- Ktor Client Unable to Stream Responses in Javascript (KTOR-5867)
- Darwin engine does not support streaming of request body (KTOR-5899)
- The Logging plugin doesn't log full kotlinx deserialization errors (KTOR-5421)
- XForwardedHeaders should set
remoteAddress
in addition toremoteHost
(KTOR-5786) - Sessions: Set-Cookie is added on every api request (KTOR-912)
- RateLimitters for every request key live in memory forever (KTOR-5872)
- Significant delay between getting a part and starting reading from its provider for multipart/form-data requests (KTOR-5248)
- getTimeMillis has seconds precision on native (KTOR-5878)
- A coroutine closed due to cancellation is considered by the JsWebSocketSession to be closed on failure (KTOR-2932)
- WebSockets: requests to a non-existing route cause server to lock up after responding with 404 (potential DOS) (KTOR-5829)
- testApplication: NPE when test server doesn't reply with an HTTP upgrade (KTOR-5815)
- GMTDate timestamp doesn't reflect timezone when created using
Calendar.toDate
method (KTOR-5813)
Improvements
- Warn when the RateLimit plugin installed after the routing (KTOR-5915)
- Allow access to RateLimiters related to call (KTOR-5876)
- Multipart: Support not writing a temporary file for binary data (KTOR-5864)
- Make System Property to Set outgoingToBeProcessed Size for WebSockets (KTOR-5855)
- Support optional properties in YAML (KTOR-5796)
- YAML config does not support reading variables from itself (KTOR-5797)
2.3.0
Published 19 April 2023
Features
- Support loading multiple configuration files (KTOR-5658)
- Static files filters or something similar to mod_rewrite (KTOR-818)
- Built-in support for HEAD requests for static files (KTOR-4052)
- Ability to set Content-Type of static resource (KTOR-2312)
- Support regex patterns in routing (KTOR-5110)
- Support Flow in ktor-serialization (KTOR-3788)
- Upgrade Client Apache Engine Version to use Apache 5 (KTOR-4547)
- Support for CURLOPT_CAINFO and CURLOPT_CAPATH in ktor-client-curl (KTOR-5614)
- Allow passing multiple acceptable content types to accept route selector (KTOR-419)
- Support
100 Continue
(KTOR-829)
Improvements
- The '425 Too Early' status code is missing in the HttpStatusCode enum (KTOR-4673)
- Feature request: SO_REUSEADDR option for embedded server (KTOR-5529)
- Add opportunity to pass type info into WebSockets serializing methods (KTOR-5740)
- Ktor JS websocket client unconfigurable logging (KTOR-5456)
- Update JTE to 2.3.0 (KTOR-5698)
- Update Kotlin to 1.8.10 (KTOR-5544)
- Migrate to the new Kotlin JS IR backend (KTOR-5543)
- Prefer Node instead of browser behavior (KTOR-5650)
- Update reported dependencies (KTOR-5662)
- AutoHead should dispose response body (KTOR-5684)
- Add
append(String, List<String>)
overload toFormBuilder
(KTOR-5493) - Support serving static files from resources in GraalVM native image (KTOR-5580)
- Comparable HttpStatusCode (KTOR-5629)
- Support preCompressed with resources (KTOR-2677)
- Add shutdown configuration for engine in stop method (KTOR-5560)
- Logging: Add filter/sanitization of sensitive headers (KTOR-5523)
- Add resource route builders accepting typed body as second parameter (KTOR-5589)
- CallLogging: add config to avoid logging static file request (KTOR-5474)
- Update Tomcat to 10 (KTOR-5266)
- Update Jetty to version 11 (KTOR-5267)
- Update Parameters and Headers DSL to be consistent with stdlib (KTOR-627)
- Consider quoting
Boolean
during construction of multipart requests (KTOR-5405) - Simplify Static Content Plugin (KTOR-5265)
Bugfixes
- Websockets: connection should be failed immediately when no continuation frame goes after a fragmented text frame (KTOR-5018)
- Websockets: Connection should be failed immediately, since all data frames after the initial data frame must have opcode 0 (KTOR-5014)
- Websockets: Connection should fail immediately (1002/Protocol Error) when control frame has a payload with more than 125 octets (KTOR-5006)
- Java engine: Websockets client sends two PONG frames for each PING frame from a server (KTOR-5653)
- Websockets: Erroneous trace log about expired websocket pings (KTOR-5672)
- DarwinClientEngine: a request deadlocks on macOS since 2.2.2 (KTOR-5502)
- Requests don't match in nested Regex Routing (KTOR-5750)
- IllegalArgumentException in Regex Routing (KTOR-5748)
- Unneeded escaping in Regex Routing isn't processed (KTOR-5746)
- Native: Read from a closed socket doesn't throw an exception (KTOR-5093)
- Reading response of HEAD request breaks when Content-Length > 0 (KTOR-5699)
- "Serializer for class 'Any' is not found" error when responding with Any type since Ktor 2.2.4 (KTOR-5687)
- BearerAuthProvider: Token is being refreshed multiple times when queued call finishes with 401 after refresh token succeeds (KTOR-5681)
- CIO: nmap crashes server with "SocketException: Invalid argument" error (KTOR-5636)
- DigestAuthProvider: realm sent from the server doesn't participate in the computation of
response
(KTOR-4514) - OAuth2: "JsonObject is not a JsonPrimitive" error when server replies with nested JSON object on a token request (KTOR-5669)
- CallLogging: logs caused by an exception are suppressed when mdc provider is configured (KTOR-5665)
- Metrics: ClassCastException when the DropwizardMetrics plugin is installed after the MicrometerMetrics plugin (KTOR-5595)
- ByteBufferChannel throws exception when HttpCache, ContentEncoding and onDownload are used (KTOR-5532)
- runBlocking in TestApplicationEngine loses coroutineContext (KTOR-5525)
- Incorrect handling of private cache directive in HttpCachePlugin (KTOR-5570)
- The default implementation of challengeFunction is empty, causing no session users to access protected resources (KTOR-5467)
- Wrong ContentType for .mjs files (KTOR-5533)
- Non-standard
Content-Type
headers for static files (KTOR-5311) - CIO: Client fails to parse response without Content-Length, Connection headers and chunked transfer encoding (KTOR-5327)
- Conflict between
ContentNegotiation
andMustache
plugins (KTOR-5337)
2.2.4
Published 28 February 2023
Bugfixes
- Connect timeout is not respected when using the HttpRequestRetry plugin (KTOR-5466)
- URLs with underscore fail to parse correctly in HTTP client request (KTOR-5591)
- Routing: Wrong content-type results in 405 instead of 415 status code with two routes (KTOR-5535)
- Compressing the response will result in unexpected ERROR log output after processing in the StatusPages (KTOR-5510)
- Javadoc for Resources.kt cannot be compiled (KTOR-5492)
- ContentNegotiation: The "charset=UTF-8" part is added for the Content-Type header (KTOR-3799)
- kotlinx.serialization.SerializationException is lost for the classes that have generic type parameters (KTOR-5448)
- OkHttp: Cancelling while writing to ByteWriteChannel when overriding WriteChannelContent causes propagation of CancellationException to a caller (KTOR-5518)
2.2.3
Published 31 January 2023
Improvements
- ContentNegotiation: "Skipping because the type is ignored" log message is unclear (KTOR-5479)
- Make OAuth2 functionality multiplatform (KTOR-1144)
- Log HTTP request time (KTOR-1250)
- Add Client Plugins Trace Logging (KTOR-5264)
Bugfixes
- FileStorage throws java.io.FileNotFoundException (File name too long) when request path is long (KTOR-5443)
- HttpRequestRetry retries on FileNotFoundException thrown by FileStorage (KTOR-5444)
- DropwizardMetricsPlugin logs status code incorrectly when is used together with StatusPages plugin (KTOR-5420)
- Server ContentNegotiation no longer allows multiple decoders for one Content-Type (KTOR-5410)
- Multipart File doesn't upload whole file, throws "Unexpected EOF: expected 4096 more bytes" for larger files (KTOR-3455)
- Netty: Unable to set the
tcpKeepAlive
(KTOR-5370) - HOCON: CLI parameters don't override custom array properties since 2.1.0 (KTOR-5100)
2.2.2
Published 3 January 2023
Improvements
- Resource annotation should be MetaSerializable (KTOR-5397)
- The swaggerUI method is too restrictive and cannot be called inside a route (KTOR-5307)
- Engine shutdown grace period and timeout are not configurable (KTOR-5359)
- Allow specifying immutable in CacheControl (KTOR-3757)
Bugfixes
- Server cannot be started with the Swagger plugin (KTOR-5308)
- Regression in 2.2.1: Got EOF but at least 0 bytes were expected (5372)
- HttpRequestRetry: Memory leak of coroutines objects when using the plugin (KTOR-5099)
- iOS unit test deadlocks with DarwinClientEngine (KTOR-5332)
- Gzip encoding: IllegalStateException: Expected 112, actual 113 (KTOR-5300)
- Netty, HSTS: UnsupportedOperationException is thrown when the server responds before HSTS plugin (KTOR-5276)
2.2.1
2.2.0
Published 7 December 2022
- Intergate Swagger UI Hosting as Ktor Feature (KTOR-774)
- New plugins API for client (KTOR-5161)
- Rate-Limit Support on Server (KTOR-1196)
- Make sessions plugin multiplatform (KTOR-4960)
- Add the ability to access the route inside a route-scoped plugin (KTOR-5112)
- Add a method that returns a list of child routes recursively (KTOR-581)
- Support Default Value for missing Env Variables in YAML (KTOR-5283)
- Netty: ApplicationStarted event is fired before the server starts accepting connections (KTOR-4259)
- parseAuthorizationHeader throws ParseException on header value with multiple challenges (KTOR-5216)
- ByteChannel exception: Got EOF but at least 1 byte were expected (KTOR-5252)
- Application data in OAuth State parameter (KTOR-5225)
- NativePRNGNonBlocking is not found, fallback to SHA1PRNG (KTOR-668)
- Not calling call.respond() at server results in 404 for the client (KTOR-721)
- Restoring thread context elements when directly resuming to parent is broken (KTOR-2644)
- Out of the box ContentConverter for Protobuf (KTOR-763)
- Darwin: response is never returned when usePreconfiguredSession is used (KTOR-5134)
- List.merge() should have reversed priority (KTOR-5208)
- Allow nested authentications to be combined using AND (KTOR-5021)
- The swaggerUI plugin should be placed in the io.ktor.server.plugins.swagger package (KTOR-5192)
- CORS Plugin should log reason for returning 403 Forbidden errors (KTOR-4236)
- The default path to an OpenAPI specification doesn't work for the 'openAPI' plugin (KTOR-5193)
- JWT: JWTPayloadHolder.getListClaim() throws NPE when specified claim is absent (KTOR-5098)
- Logging: the plugin instantiates the default logger even when a custom one is provided (KTOR-5186)
- Java client engine doesn't handle HttpTimeout.INFINITE_TIMEOUT_MS properly (KTOR-2814)
- SessionTransportTransformerMessageAuthentication: Comparison of digests fails when there is a space in a value (KTOR-5168)
- Support serving OpenAPI from resources (KTOR-5150)
- Remove check for internal class in Select (KTOR-5035)
- Persistent Client HttpCache (KTOR-2579)
- Support native windows HTTP client (KTOR-735)
- Add Server BearerAuthenticationProvider (KTOR-5118)
- Merged config: "Property *.size not found" error when calling
configList
method on an array property (KTOR-5143) - "POSIX error 56: Socket is already connected" error when a socket is connection-mode on Darwin targets (KTOR-4877)
- StatusPages can't handle errors in HTML template (KTOR-5107)
- HttpRequestRetry: Memory leak of coroutines objects when using the plugin (KTOR-5099)
- CallLogging and CallId: exceptions thrown in WriteChannelContent.writeTo are swallowed (KTOR-4954)
- Temp files generated by multipart upload are not cleared in case of exception or cancellation (KTOR-5051)
- Websockets, Darwin: trusting a certificate via
handleChallenge
doesn't work for Websockets connections (KTOR-5094) - Digest auth: Support returning any objects which implement Principal interface (KTOR-5059)
- Add Debug Logging to Default Transformers (KTOR-4529)
- No way getting client's source address from IP packet (KTOR-2501)
- Add Env Variable to Change Log Level on Native Server (KTOR-4998)
- Add Debug Logging for Ktor Plugins and Routing (KTOR-4510)
- Add Debug Logging to ContentNegotiation (KTOR-4518)
- Add Debug Logging to Routing (KTOR-4524)
- Add Debug Logging to Auth Plugin (KTOR-4519)
- Add Debug Logging to Status Pages Plugin (KTOR-4527)
- Add Debug Logging to PartialContent Plugin (KTOR-4525)
- Add Debug Logging to Sessions Plugin (KTOR-4526)
- Add Debug Logging to Call Id (KTOR-4520)
- Add Debug Logging to WebSockets Plugin (KTOR-4528)
- Add Debug Logging to Double Receive Plugin (KTOR-4530)
- Add Debug Logging to Compression Plugin (KTOR-4521)
- Make certificate generation helpers more flexible (KTOR-5023)
- Jackson converter: Support requests with Content-Length header (KTOR-4904)
- Add a way to get a client's port (KTOR-430)
- Retry and timeout client plugins don't work together (KTOR-4652)
- Server Session - Switch to Kotlinx serialization (KTOR-2572)
- ApplicationCall.respondRedirect should have overload for Url (KTOR-1538)
- Make API to Use Configuration in Application Plugins (KTOR-4533)
- Way to block use of TLS 1.0/1.1 when using Ktor/Netty (KTOR-4587)
- testApplication: application initialization block isn't eagerly called (KTOR-4819)
- testApplication: test server lifecycle management (KTOR-4773)
- The beginning character of encodedPath field(Url class) is wrong when relative path (KTOR-621)
- Unable to access userPrincipal of servletRequest in ktor-server-servlet (KTOR-4784)
- When unable to get JWKS, JWTAuth swallows the underlying exception and only logs the last message (KTOR-636)
- CIO Server generates wrong URL for OAuth URL provider using Locations (KTOR-2143)
- Inconsistency among server engines when determining port/host of an incoming request (KTOR-4141)
- Update Versions of Dependencies (KTOR-5293)
2.1.3
Published 26 October 2022
- JS: window.location.origin returns null when executed in iframe via srcdoc attribute (KTOR-4993)
- SensitivityWatchEventModifier - Move the reflection call of this modifier out from the Ktor Core (KTOR-1647)
- "java.lang.IllegalArgumentException: Failed requirement." in SelectorManagerSupport (KTOR-2914)
- HOCON: CLI parameters don't override custom properties since 2.1.0 (KTOR-5000)
- Websockets timeout doesn't cause a close of a connection (KTOR-3504)
- DefaultHeaders: a header is duplicated in a StatusPages's handler (KTOR-4990)
- Websockets: timeout doesn't cause closing of incoming and outgoing channels (KTOR-2430)
- RFC 3986 recommendation for encoding URI is NOT followed (KTOR-993)
- Cookies: Invalid encoding of cookies' values since 1.4.0 (KTOR-917)
- ByteReadChannel is unable to read files with long lines (KTOR-2588)
- WebSocketDeflateExtension configureProtocols always failed with stackOverflow (KTOR-4916)
- Update Kotlin to 1.7.20 (KTOR-4963)
- Netty HTTP/2: response headers contain ":status" header and that leads to IllegalHeaderNameException in the ConditionalHeaders plugin (KTOR-4943)
- Maven: ktor-server-test-host-jvm causes dependency error starting from Ktor 2.0.3 (KTOR-4900)
- Autoreloading: "Flow invariant is violated" error since Ktor 2.0.3 (KTOR-4926)
- Autoreloading: ClassCastException when retrieving plugins in testApplication (KTOR-4729)
- CIO engine has wrong doc for request timeout (KTOR-4941)
- CIO: A request through a proxy server results in 403 from Cloudflare (KTOR-4925)
2.1.2
Published 29 September 2022
- HttpCacheEntry ignoring Request Cache-Control directives (KTOR-4894)
- testApplication does not handle port and connectors (KTOR-4875)
- Native: Wrong status code when requesting with DELETE method and body (KTOR-3566)
- Default host address 0.0.0.0 isn't reachable on Windows (KTOR-4834)
- TestApplicationEngine error handling is inconsistent with DefaultEnginePipeline, breaking clients (KTOR-4009)
- Routing: Wrong content-type results in 400 Bad Request instead of 415 Unsupported Media type (KTOR-4849)
2.1.1
Published 6 September 2022
- CIO: responses are received with a huge delay on JVM Windows (due to reverse DNS lookup internally) (KTOR-4827)
- Netty HTTP/2 not working (KTOR-578)
- HTTP/2 push fails with Netty engine (KTOR-800)
- HttpCookies: no space between cookie pairs (KTOR-3854)
- Netty ALPN provider detection not working (KTOR-4712)
- CIO: Connection reset by peer on MacOS (KTOR-2036)
- CallLogging MDC with sessions: Application feature Sessions is not installed (KTOR-550)
- Deprecate Public API with Atomicfu Declarations (KTOR-4774)
- Deprecate receiveOrNull because it's confusing (KTOR-4772)
- Server ContentNegotiation Plugin doesn't check ignoredTypes for Request Body (KTOR-4770)
- IllegalArgumentException is thrown when UnixSocketAddress.path is accessed on JVM (JDK 16+) (KTOR-4695)
- WebSocketDeflateExtension not following RFC (KTOR-4696)
- The parseWebSocketExtensions function behaves incorrectly (KTOR-3189)
- Receive non-Nullable Type Throws NPE in Case of Failure (KTOR-4771)
- Darwin: Symbol not found: OBJC_CLASS$_NSURLSessionWebSocketMessage on iOS 12 (KTOR-4159)
- Fix Merging Date Headers on the Client (KTOR-4782)
- Replace exception in InputStreamAdapter and OutputStreamAdapter constructors with warning message If parking (KTOR-4736)
- Clearing Session Cookie in Chrome 80+ with SameSite and Secure (KTOR-437)
- The
OutgoingContent.toByteArray()
stalls when used in combination with aOutgoingContent.WriteChannelContent
(KTOR-2126) - Missing Content-Type header in a request (KTOR-1407)
- Crash when making requests from browser inside of web worker (KTOR-4715)
- An error occurs when there is a binary such as protobuf in the response body of error (KTOR-1619)
- CallLogging configured MDC entries are not passed to StatusPages exception handlers (KTOR-4193)
- LocalFileContent incorrectly relies on the last modification time of a file to check its existence (KTOR-4707)
- Sessions: WSS in combination with Secure cookies throws IllegalArgumentException (KTOR-4697)
- Json request failure with configured form authentication (KTOR-678)