# Changelogs

Source: https://docs.sisk-framework.org/docs/changelogs.html

Every change made to Sisk is recorded through the changelog. You can view the changelogs for all Sisk versions [here](https://github.com/sisk-http/archive/tree/master/changelogs).

## Migrating from 1.6 to 1.7

Sisk 1.7.0 ships `Sisk.HttpServer`, `Sisk.Cadente`, `Sisk.Cadente.CoreEngine` and `Sisk.IniConfiguration` 1.7.0. `Sisk.Documenting`, `Sisk.Documenting.Html` and `Sisk.Monitoring` ship as 1.7.0-rc3, and `Sisk.ModelContextProtocol` as 1.7.0-rc1. Read the [full 1.7.0 changelog](https://github.com/sisk-http/archive/blob/master/changelogs/core/v1.7/v1.7.0.md) for every change.

### Breaking changes

- **`Route.UseRegex` can no longer be set.** The property is obsolete and only reports whether the route is a `RegexRoute`. Create a [RegexRoute](https://docs.sisk-framework.org/api/Sisk.Core.Routing.RegexRoute.md) instead. Route attributes with `UseRegex = true` and the `[RegexRoute]` attribute keep working. See [regex routes](https://docs.sisk-framework.org/docs/fundamentals/routing.md#regex-routes).

    ```cs
    // before
    router.Map(new Route(RouteMethod.Get, @"^/items/(?<id>\d+)$", action) { UseRegex = true });

    // after
    router.Map(new RegexRoute(RouteMethod.Get, @"^/items/(?<id>\d+)$", action));
    ```

- **Request bodies are limited to 100 MB by default.** The default value of [HttpServerConfiguration.MaximumContentLength](https://docs.sisk-framework.org/api/Sisk.Core.Http.HttpServerConfiguration.MaximumContentLength.md) changed from `0` (unlimited) to 100 MB. The limit also applies to request streams and to WebSocket messages. Set it to `0` to restore the previous behavior. See [getting the request body](https://docs.sisk-framework.org/docs/fundamentals/requests.md#getting-the-request-body).

    ```cs
    using var app = HttpServer.CreateBuilder()
        .UseConfiguration(config => config.MaximumContentLength = 0)
        .Build();
    ```

- **Static routes are tested before dynamic routes.** Regex routes, prefix routes (including file servers) and custom matching routes are tested after every static route, regardless of their registration order. See [matching precedence](https://docs.sisk-framework.org/docs/fundamentals/routing.md#matching-precedence).
- **Duplicate route names throw at startup.** Two or more routes with the same `Name` cause an `ArgumentException` when the server starts, while [Router.CheckForRouteCollisions](https://docs.sisk-framework.org/api/Sisk.Core.Routing.Router.CheckForRouteCollisions.md) is enabled (the default).
- **File server routes are prefix routes.** `Router.MapFileSystem` and `HttpFileServer.CreateServingRoute` create a [PrefixRoute](https://docs.sisk-framework.org/api/Sisk.Core.Routing.PrefixRoute.md) instead of a regex route, and are no longer affected by `ForceTrailingSlash`.
- **`RouteMethod.Any` includes `QUERY`.** Routes mapped with `MapAny` also answer `QUERY` requests. The numeric value of `RouteMethod.Any` changed, so recompile code that stores or compares it.
- **CORS preflight respects `UseCors`.** The automatic `OPTIONS` response no longer sends CORS headers for routes with `UseCors = false`, and routes explicitly mapped for `OPTIONS` handle the request instead. See [preflight requests](https://docs.sisk-framework.org/docs/features/cors.md#preflight-requests).
- **Cadente rejects malformed requests.** Invalid request methods and targets, unsupported `Transfer-Encoding` values and conflicting `Content-Length` headers are rejected, and header blocks larger than 8 KB receive `431 Request Header Fields Too Large`. See [Cadente request validation](https://docs.sisk-framework.org/docs/cadente.md#request-validation).

### Discontinued packages

`Sisk.BasicAuth`, `Sisk.SslProxy` and `Sisk.ServiceProvider` are no longer maintained and are deprecated on NuGet, with no replacement package. Remove them from your projects:

- Replace `Sisk.BasicAuth` with your own [request handler](https://docs.sisk-framework.org/docs/fundamentals/request-handlers.md) that validates the `Authorization` header.
- Replace `Sisk.SslProxy` with the native SSL support of the [Cadente engine](https://docs.sisk-framework.org/docs/cadente.md).
- Replace `Sisk.ServiceProvider` with the [portable configuration](https://docs.sisk-framework.org/docs/extensions/service-providers.md) built into `Sisk.HttpServer` through `UsePortableConfiguration`.

### New features

- [Custom route matching](https://docs.sisk-framework.org/docs/fundamentals/routing.md#custom-route-matching) through `Route.Match`, `RouteMatch`, `Route.IsStatic` and `Route.AllowRewrites`, and the new [prefix routes](https://docs.sisk-framework.org/docs/fundamentals/routing.md#prefix-routes).
- Support for the HTTP [QUERY method](https://docs.sisk-framework.org/docs/fundamentals/routing.md#query-method-routes) with `MapQuery`, `Route.Query`, `[RouteQuery]` and the `Accept-Query` header.
- [Atomic context values](https://docs.sisk-framework.org/docs/fundamentals/requests.md#atomic-context-values) through `HttpContext.Interlocked`.
- The `%{$key}` [access log term](https://docs.sisk-framework.org/docs/features/logging.md#access-log-formatting), which prints values of the request bag, and the [safe file writing helpers](https://docs.sisk-framework.org/docs/features/logging.md#writing-files-safely) `LogStream.SafeWriteToFile` and `LogStream.SafeAppendToFile`.
- In Cadente: pipelined keep-alive requests, `WriteInlineContent` and `WriteInlineContentAsync`, and a redirect to HTTPS for plain HTTP requests received on an SSL port.
- In the extensions: parameter examples and `LlmsApiExporter.FooterText` in [Sisk.Documenting](https://docs.sisk-framework.org/docs/extensions/api-documentation.md), skills and the `2026-07-28` protocol revision in [Sisk.ModelContextProtocol](https://docs.sisk-framework.org/docs/extensions/mcp.md), and HTTP traffic, latency, route and exception telemetry in the Sisk.Monitoring dashboard.

### Other behavior changes

- The `HttpListener` engine dispatches each request to the thread pool, so a slow request no longer delays the next accepted connection. Its `ContextAbortedToken` returns `CancellationToken.None` instead of throwing.
- Exceptions thrown by server handlers at the end of a request, and while writing logs, are written to the error log instead of escaping to the HTTP engine. See [exceptions thrown by handlers](https://docs.sisk-framework.org/docs/advanced/http-server-handlers.md#exceptions-thrown-by-handlers).
- CORS responses send `Vary: Origin` when the allowed origin depends on the request.
- The `%ri` access log term uses the client address resolved at the start of the request.
- `Sisk.HttpServer` targets .NET 8, .NET 9 and .NET 10. `Sisk.Cadente` and `Sisk.Cadente.CoreEngine` target .NET 9 and .NET 10 and publish their debug symbols as `.snupkg` packages.
