

# Determinación del propósito de la función
<a name="function-code-choose-purpose"></a>

Antes de escribir el código de su función, determine su propósito. La mayoría de las funciones de CloudFront Functions cumplen uno de los siguientes propósitos.

**Topics**
+ [Modificar la solicitud HTTP en un tipo de evento de solicitud de lector](#function-code-modify-request)
+ [Generar una respuesta HTTP en un tipo de evento de solicitud de lector](#function-code-generate-response)
+ [Modificar la respuesta HTTP en un tipo de evento de respuesta de lector](#function-code-modify-response)
+ [Validación de las conexiones de mTLS en un tipo de evento de solicitud de conexión](#function-code-connection-request)
+ [Información relacionada](#related-information-cloudfront-functions-purpose)

Independientemente del propósito de la función, el `handler` es el punto de entrada para cualquier función. Toma un solo argumento llamado `event`, que se pasa a la función mediante CloudFront. El `event` es un objeto JSON que contiene una representación de la solicitud HTTP (y la respuesta, si su función modifica la respuesta HTTP). 

## Modificar la solicitud HTTP en un tipo de evento de solicitud de lector
<a name="function-code-modify-request"></a>

Su función puede modificar la solicitud HTTP que CloudFront recibe del lector (cliente) y devolver la solicitud modificada a CloudFront para su procesamiento continuo. Por ejemplo, el código de función podría normalizar la [clave de caché](understanding-the-cache-key.md) o modificar los encabezados de solicitud.

Cuando crea y publica una función que modifica la solicitud HTTP, asegúrese de agregar una asociación para el tipo de evento *solicitud del lector*. Para obtener más información, consulte [Creación de la función](functions-tutorial.md#functions-tutorial-create). Esto hace que la función se ejecute cada vez que CloudFront recibe una solicitud de un lector, antes de comprobar si el objeto solicitado está en la caché de CloudFront.

**Example Ejemplo**  
El siguiente pseudocódigo muestra la estructura de una función que modifica la solicitud HTTP.  

```
function handler(event) {
    var request = event.request;

    // Modify the request object here.

    return request;
}
```
La función devuelve el objeto modificado `request` a CloudFront. CloudFront continúa procesando la solicitud devuelta comprobando la caché de CloudFront en busca de un acierto de caché y enviando la solicitud al origen si es necesario.

## Generar una respuesta HTTP en un tipo de evento de solicitud de lector
<a name="function-code-generate-response"></a>

Su función puede generar una respuesta HTTP en el borde y devolverla directamente al lector (cliente) sin buscar una respuesta almacenada en la caché o cualquier otro procesamiento por parte de CloudFront. Por ejemplo, el código de función podría redirigir la solicitud a una nueva URL, o comprobar la autorización y devolver una respuesta `401` o `403` a solicitudes no autorizadas.

Cuando crea una función que genera una respuesta HTTP, asegúrese de elegir el tipo de evento *viewer request (solicitud del lector)*. Esto significa que la función se ejecuta cada vez que CloudFront recibe una solicitud de un lector, antes de que CloudFront siga procesando la solicitud.

**Example Ejemplo**  
El siguiente pseudocódigo muestra la estructura de una función que genera una respuesta HTTP.  

```
function handler(event) {
    var request = event.request;

    var response = ...; // Create the response object here,
                        // using the request properties if needed.

    return response;
}
```
La función devuelve un objeto `response` a CloudFront, que CloudFront devuelve inmediatamente al lector sin comprobar la caché de CloudFront ni enviar una solicitud al origen.

## Modificar la respuesta HTTP en un tipo de evento de respuesta de lector
<a name="function-code-modify-response"></a>

Su función puede modificar la respuesta HTTP antes de que CloudFront la envíe al lector (cliente), independientemente de si la respuesta proviene de la caché de CloudFront o del origen. Por ejemplo, es posible que el código de función agregue o modifique encabezados de respuesta, códigos de estado y contenido del cuerpo.

Cuando crea una función que modifica la respuesta HTTP, asegúrese de elegir el tipo de evento *viewer response (respuesta al lector)*. Esto significa que la función se ejecuta antes de que CloudFront devuelva una respuesta al lector, independientemente de si la respuesta proviene de la caché de CloudFront o del origen.

**Example Ejemplo**  
El siguiente pseudocódigo muestra la estructura de una función que modifica la respuesta HTTP.  

```
function handler(event) {
    var request = event.request;
    var response = event.response;

    // Modify the response object here,
    // using the request properties if needed.

    return response;
}
```
La función devuelve el objeto `response` modificado a CloudFront, que CloudFront devuelve inmediatamente al lector.

## Validación de las conexiones de mTLS en un tipo de evento de solicitud de conexión
<a name="function-code-connection-request"></a>

Las funciones de conexión son un tipo de CloudFront Functions que se ejecutan durante las conexiones TLS para proporcionar una lógica de validación y autenticación personalizada. Las funciones de conexión están disponibles actualmente para las conexiones TLS mutuas (mTLS), con las que puede validar los certificados de los clientes e implementar una lógica de autenticación personalizada más allá de la validación de certificados estándar. Las funciones de conexión se ejecutan durante el proceso de establecimiento de comunicación de TLS y pueden permitir o denegar las conexiones en función de las propiedades de los certificados, las direcciones IP de los clientes u otros criterios.

Cuando crea y publica una función de conexión, asegúrese de agregar una asociación para el tipo de evento *solicitud de conexión* con una distribución con mTLS. Esto hace que la función se ejecute cada vez que un cliente intenta establecer una conexión de mTLS con CloudFront.

**Example**  
El siguiente pseudocódigo muestra la estructura de una función de conexión:  

```
function connectionHandler(connection) {
    // Validate certificate and connection properties here.
    
    if (/* validation passes */) {
        connection.allow();
    } else {
        connection.deny();
    }
}
```
La función utiliza métodos de ayuda para determinar si se debe permitir o denegar la conexión. A diferencia de las funciones de solicitud y respuesta del espectador, las funciones de conexión no pueden modificar las solicitudes o respuestas HTTP.

## Información relacionada
<a name="related-information-cloudfront-functions-purpose"></a>

Para obtener más información sobre cómo trabajar con CloudFront Functions, consulte los siguientes:
+ [Estructura de evento](functions-event-structure.md)
+ [Características del tiempo de ejecución de JavaScript](functions-javascript-runtime-features.md)
+ [Ejemplos de CloudFront Functions ](service_code_examples_cloudfront_functions_examples.md)
+ [Restricciones en funciones de borde](edge-functions-restrictions.md)