# Functions no Firewall

[Functions](/pt-br/documentacao/produtos/build/applications/functions/) são funções executadas na Azion Web Platform, com a latência baixa, levando a capacidade operacional para mais perto do usuário final.

[Firewall](/pt-br/documentacao/produtos/secure/firewall/) suporta functions. Através delas, você pode escrever seu próprio código de segurança em JavaScript e realizar deploy no edge.

Com functions nos Firewall, você pode:

- Melhorar sua proteção.
- Ter mais dinamismo.
- Implementar a lógica necessária para o funcionamento do seu negócio.
- Fazer uso de APIs que possibilitam a manipulação dos headers de **request** e **response**.

---

## Implementação

| Escopo | Guia |
| - | - |
| Como criar e configurar uma function em seu Firewall| [Como criar e configurar uma function no seu Firewall](/pt-br/documentacao/produtos/guias/edge-functions/firewall/) |
| Exemplos | [Exemplos de functions para firewall](/pt-br/documentacao/devtools/javascript-exemplos/#edge-functions---edge-firewall) |
| Exemplos no GitHub | [Repositório do GitHub](https://github.com/aziontech/azion-samples/tree/dev/samples) |

---

## Como funcionam as functions no Firewall 

:::note[nota]
As functions em JavaScript no Firewall são executadas na fase de request.
:::

### Processo

- As regras configuradas nas *Rules Engine* do Firewall para a execução da função são acionadas.
- O Azion Runtime processa a função, retornando um resultado.
- O Firewall Rules Engine prossegue com o processamento, baseado no resultado recebido, a partir do ponto que o comportamento foi acionado.

:::note[nota]
Todas as functions usadas no Firewall devem ter um *resultado final* nelas, como: `event.continue()`, `event.deny()` e `event.drop()`.
:::

---

## Adicionar Header da Requisição

Você pode adicionar headers na requisição que é enviada à origem.

```js
  addEventListener("firewall", (event) => {
      event.addRequestHeader("X-Custom-Header-1", "1");
      event.addRequestHeader("X-Custom-Header-2", "2");
      event.continue();
  });
```

## Adicionar Header da Resposta

Você pode adicionar headers na resposta que é enviada aos usuários.

```js
  addEventListener("firewall", (event) => {
      event.addResponseHeader("X-Custom-Header-3", "3");
      event.addResponseHeader("X-Custom-Header-4", "4");
      event.continue();
  });
```

## Deny (403 Forbidden)

Através do evento `event.deny()`, você pode finalizar uma requisição retornando HTTP 403 Forbidden.

```js 
  addEventListener("firewall", (event) => {
      event.deny();
  });
```

## Drop (Fechar Sem Resposta)

Através do evento `event.drop()`, você pode finalizar uma solicitação sem retornar uma resposta ao cliente.

```js 
  addEventListener("firewall", (event) => {
      event.drop();
  });
```

## Respond with

Através do evento `event.respondWith()`, você pode interceptar requisições e retornar respostas customizadas, além de modificar os *headers* da resposta ou o conteúdo.

```js
    event.respondWith(new Response('{"my_custom_response": true}', {
        status: 599,
        headers: { "content-type": "application/json" }
    }));
```

## Metadados

As functions no Firewall possibilitam a manipulação de metadados.

Utilizando esses metadados, você pode filtrar e gerenciar o acesso às suas aplicações e implementar a lógica específica em diferente cenários, como por exemplo:

### Informação de GeoIP

Você pode negar acesso quando a requisição vem de lugares específicos.

Leia mais sobre [a lista de metadados de GeoIP](/pt-br/documentacao/produtos/applications/functions/runtime/api-reference/metadata/#geo-ip).

### Remote

Você pode verificar o endereço de IP e a porta TCP utilizada.

Leia mais sobre [a lista de metadados de Remote](/pt-br/documentacao/produtos/applications/functions/runtime/api-reference/metadata/#remote).

### Server

Você pode verificar o protocolo sendo usado na requisição.

Leia mais sobre [a lista de metadados de Server](/pt-br/documentacao/produtos/applications/functions/runtime/api-reference/metadata/#server).

### TLS

Os metadados relacionados a TLS estarão disponíveis quando a requisição for feita de uma conexão segura.

Leia mais sobre [a lista de metadados de TLS](/pt-br/documentacao/produtos/applications/functions/runtime/api-reference/metadata/#tls).

### Repositório Azion Samples

Acesse [o repositório Azion Samples](https://github.com/aziontech/azion-samples) no GitHub e analise os code samples que podem ajudar no desenvolvimento de suas functions.

---

## Práticas recomendadas

### Conditionals

Ao trabalhar com condicionais e `event.method`, use `if else`. Caso a implementação seja semelhante a:

```javascript
  if (someCondition){
      event.drop()
  }
  event.continue()
```

Ela pode acabar com comportamentos inesperados.

É altamente recomendável utilizar da seguinte forma:

```javascript
  if (someCondition){
      event.drop()
  }else{
      event.continue()
  }
```

---

### Sync x async

Como o `eventHandler` é síncrono, é necessário escrever uma function assíncrona quando `await` é implementado.

Recomenda-se usar `event.waitUntil`. Caso contrário, a `promise` pode acabar em exceções inesperadas.

```javascript
async function firewallHandler(event) {
 // any async operation here like fetch, timeout etc.
}

addEventListener("firewall", (event) => event.waitUntil(firewallHandler(event)));

}
```

---

## Limites

:::tip
**Aumentar limites** <br></br>
Você pode solicitar o aumento dos limites de acordo com o seu plano. Entre em contato com a [equipe de suporte técnico](/pt-br/documentacao/servicos/suporte/) para solicitar.
:::

Estes são os **limites padrão**:

| Escopo | Limite |
| ----- | ----- |
| Argumentos | 100 KB |
| Memória por Isolate | 512 MB |
| Limite de código (UI) | 6 MB |
| Limite de código (API) | 50 MB |
| Tamanho de variáveis de ambiente | 32 KB |
| Sub-requisições | 50 Sub-Req |
| Tempo máximo de execução de CPU | 2s |