# Provedor de configuração INI

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

Sisk possui um método para obter configurações de inicialização diferentes de JSON. Na verdade, qualquer pipeline que implemente [IConfigurationReader](https://docs.sisk-framework.org/api/Sisk.Core.Http.Hosting.IConfigurationReader.md) pode ser usado com [PortableConfigurationBuilder.WithConfigurationPipeline](https://docs.sisk-framework.org/api/Sisk.Core.Http.Hosting.PortableConfigurationBuilder.md), lendo a configuração do servidor a partir de qualquer tipo de arquivo.

O pacote [Sisk.IniConfiguration](https://www.nuget.org/packages/Sisk.IniConfiguration/) fornece um leitor de arquivos INI baseado em stream que não lança exceções para erros de sintaxe comuns e possui uma sintaxe de configuração simples. Este pacote pode ser usado fora do framework Sisk, oferecendo flexibilidade para projetos que necessitam de um leitor de documentos INI eficiente.

## Instalação

Para instalar o pacote, você pode começar com:

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

Você também pode instalar o pacote core, que não inclui o INI [IConfigurationReader](https://docs.sisk-framework.org/api/Sisk.Core.Http.Hosting.IConfigurationReader), nem a dependência do Sisk, apenas os serializadores INI:

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

Com o pacote principal, você pode usá-lo em seu código como mostrado no exemplo abaixo:

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

    static void Main(string[] args)
    {
        Host = HttpServer.CreateBuilder()
            .UsePortableConfiguration(config =>
            {
                config.WithConfigFile("app.ini", createIfDontExists: true);
                
                // usa o leitor de configuração 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}!");
    }
}
```

O código acima procurará um arquivo app.ini no diretório atual do processo (CurrentDirectory). O arquivo INI tem a seguinte aparência:

```ini
[Server]
# Vários endereços de escuta são suportados
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 e sintaxe do INI

Sabor da implementação atual:

- Propriedades e nomes de seção **não diferenciam maiúsculas de minúsculas**.
- Nomes e valores de propriedades são **removidos de espaços em branco**, a menos que os valores estejam entre aspas.
- Valores podem ser citados com aspas simples ou duplas. As aspas podem conter quebras de linha dentro delas.
- Comentários são suportados com `#` e `;`. Além disso, **comentários ao final da linha são permitidos**.
- Propriedades podem ter múltiplos valores.

Em detalhes, a documentação sobre o "sabor" do analisador INI usado no Sisk está [disponível neste documento](https://github.com/sisk-http/archive/blob/master/ext/ini-reader-syntax.md).

Usando o código INI a seguir como exemplo:

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

; o código abaixo tem algumas cores
[some section]
Color = Red
Color = Blue
Color = Yellow ; não use amarelo
```

Analise-o com:

```csharp
// analisa o texto INI a partir da string
IniDocument doc = IniDocument.FromString(iniText);

// obtém um valor
string? one = doc.Global.GetOne("one");
string? anotherValue = doc.Global.GetOne("another value");

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

## Parâmetros de configuração

| Seção e nome | Permitir múltiplos valores | Descrição |
| ------------ | -------------------------- | --------- |
| `Server.Listen` | Sim | Os endereços/portas de escuta do servidor. |
| `Server.Encoding` | Não | A codificação padrão do servidor. |
| `Server.MaximumContentLength` | Não | O tamanho máximo de content-length do servidor em bytes. Quando omitido, o padrão do servidor é mantido (100 MB desde o Sisk 1.7). Use `0` para nenhum limite. |
| `Server.IncludeRequestIdHeader` | Não | Especifica se o servidor HTTP deve enviar o cabeçalho X-Request-Id. |
| `Server.ThrowExceptions` | Não | Especifica se exceções não tratadas devem ser lançadas. |
| `Server.AccessLogsStream` | Não | Especifica o stream de saída do log de acesso. |
| `Server.ErrorsLogsStream` | Não | Especifica o stream de saída do log de erros. |
| `Cors.AllowMethods` | Não | Especifica o valor do cabeçalho CORS Allow-Methods. |
| `Cors.AllowHeaders` | Não | Especifica o valor do cabeçalho CORS Allow-Headers. |
| `Cors.AllowOrigins` | Não | Especifica múltiplos cabeçalhos Allow-Origin, separados por vírgulas. [AllowOrigins](https://docs.sisk-framework.org/api/Sisk.Core.Entity.CrossOriginResourceSharingHeaders.AllowOrigins.md) para mais informações. |
| `Cors.AllowOrigin` | Não | Especifica um cabeçalho Allow-Origin. |
| `Cors.ExposeHeaders` | Não | Especifica o valor do cabeçalho CORS Expose-Headers. |
| `Cors.AllowCredentials` | Não | Especifica o valor do cabeçalho CORS Allow-Credentials. |
| `Cors.MaxAge` | Não | Especifica o valor do cabeçalho CORS Max-Age. |
