# Proveedor de configuración INI

Source: https://docs.sisk-framework.org/es/docs/extensions/ini-configuration.html

Sisk tiene un método para obtener configuraciones de inicio distintas de JSON. De hecho, cualquier canal que implemente [IConfigurationReader](https://docs.sisk-framework.org/api/Sisk.Core.Http.Hosting.IConfigurationReader.md) puede usarse con [PortableConfigurationBuilder.WithConfigurationPipeline](https://docs.sisk-framework.org/api/Sisk.Core.Http.Hosting.PortableConfigurationBuilder.md), leyendo la configuración del servidor desde cualquier tipo de archivo.

El paquete [Sisk.IniConfiguration](https://www.nuget.org/packages/Sisk.IniConfiguration/) ofrece un lector de archivos INI basado en streams que no lanza excepciones por errores de sintaxis comunes y posee una sintaxis de configuración sencilla. Este paquete puede usarse fuera del framework Sisk, ofreciendo flexibilidad para proyectos que requieran un lector de documentos INI eficiente.

## Instalación

Para instalar el paquete, puedes comenzar con:

```bash
$ dotnet add package Sisk.IniConfiguration
```

También puedes instalar el paquete central, que no incluye el INI [IConfigurationReader](https://docs.sisk-framework.org/api/Sisk.Core.Http.Hosting.IConfigurationReader), ni la dependencia de Sisk, solo los serializadores INI:

```bash
$ dotnet add package Sisk.IniConfiguration.Core
```

Con el paquete principal, puedes usarlo en tu código como se muestra en el ejemplo a continuación:

```cs
class Program
{
    static HttpServerHostContext Host = null!;

    static void Main(string[] args)
    {
        Host = HttpServer.CreateBuilder()
            .UsePortableConfiguration(config =>
            {
                config.WithConfigFile("app.ini", createIfDontExists: true);
                
                // usa el lector de configuración IniConfigurationReader
                config.WithConfigurationPipeline<IniConfigurationReader>();
            })
            .UseRouter(r =>
            {
                r.MapGet("/", SayHello);
            })
            .Build();
        
        Host.Start();
    }

    static HttpResponse SayHello(HttpRequest request)
    {
        string? name = Host.Parameters["name"] ?? "world";
        return new HttpResponse($"Hello, {name}!");
    }
}
```

El código anterior buscará un archivo app.ini en el directorio actual del proceso (CurrentDirectory). El archivo INI se ve así:

```ini
[Server]
# Se admiten múltiples direcciones de escucha
Listen = http://localhost:5552/
Listen = http://localhost:5553/
ThrowExceptions = false
AccessLogsStream = console

[Cors]
AllowMethods = GET, POST
AllowHeaders = Content-Type, Authorization
AllowOrigin = *

[Parameters]
Name = "Kanye West"
```

## Sabor y sintaxis de INI

Sabor de la implementación actual:

- Los nombres de propiedades y secciones son **insensibles a mayúsculas/minúsculas**.
- Los nombres y valores de las propiedades están **recortados**, a menos que los valores estén entre comillas.
- Los valores pueden ir entre comillas simples o dobles. Las comillas pueden contener saltos de línea en su interior.
- Se admiten comentarios con `#` y `;`. Además, **se permiten comentarios al final de la línea**.
- Las propiedades pueden tener múltiples valores.

En detalle, la documentación del “sabor” del analizador INI usado en Sisk está [disponible en este documento](https://github.com/sisk-http/archive/blob/master/ext/ini-reader-syntax.md).

Usando el siguiente código INI como ejemplo:

```ini
One = 1
Value = this is an value
Another value = "this value
    has an line break on it"

; el código a continuación tiene algunos colores
[some section]
Color = Red
Color = Blue
Color = Yellow ; no usar amarillo
```

Analízalo con:

```csharp
// analiza el texto INI desde la cadena
IniDocument doc = IniDocument.FromString(iniText);

// obtener un valor
string? one = doc.Global.GetOne("one");
string? anotherValue = doc.Global.GetOne("another value");

// obtener múltiples valores
string[]? colors = doc.GetSection("some section")?.GetMany("color");
```

## Parámetros de configuración

| Sección y nombre | Permitir múltiples valores | Descripción |
| ---------------- | -------------------------- | ----------- |
| `Server.Listen` | Yes | Direcciones/puertos de escucha del servidor. |
| `Server.Encoding` | No | Codificación predeterminada del servidor. |
| `Server.MaximumContentLength` | No | Tamaño máximo de content-length del servidor en bytes. Cuando se omite, se mantiene la codificación predeterminada del servidor (100 MB desde Sisk 1.7). Usa `0` para sin límite. |
| `Server.IncludeRequestIdHeader` | No | Especifica si el servidor HTTP debe enviar el encabezado X-Request-Id. |
| `Server.ThrowExceptions` | No | Especifica si se deben lanzar excepciones no controladas. |
| `Server.AccessLogsStream` | No | Especifica el stream de salida del registro de accesos. |
| `Server.ErrorsLogsStream` | No | Especifica el stream de salida del registro de errores. |
| `Cors.AllowMethods` | No | Especifica el valor del encabezado CORS Allow-Methods. |
| `Cors.AllowHeaders` | No | Especifica el valor del encabezado CORS Allow-Headers. |
| `Cors.AllowOrigins` | No | Especifica múltiples encabezados Allow-Origin, separados por comas. [AllowOrigins](https://docs.sisk-framework.org/api/Sisk.Core.Entity.CrossOriginResourceSharingHeaders.AllowOrigins.md) para más información. |
| `Cors.AllowOrigin` | No | Especifica un encabezado Allow-Origin. |
| `Cors.ExposeHeaders` | No | Especifica el valor del encabezado CORS Expose-Headers. |
| `Cors.AllowCredentials` | No | Especifica el valor del encabezado CORS Allow-Credentials. |
| `Cors.MaxAge` | No | Especifica el valor del encabezado CORS Max-Age. |
